]>
Commit | Line | Data |
---|---|---|
1 | #!/bin/bash | |
2 | ||
3 | trap "" SIGHUP SIGPIPE | |
4 | ||
5 | if [ ! -d $HOME/dc ]; then mkdir $HOME/dc; fi | |
6 | if [ ! -d $HOME/dc/done ]; then mkdir $HOME/dc/done; fi | |
7 | if [ ! -d $HOME/dc/resume ]; then mkdir $HOME/dc/resume; fi | |
8 | if [ ! -d $HOME/dc/users ]; then mkdir $HOME/dc/users; fi | |
9 | exec 2>>$HOME/dc/filterlog | |
10 | cd $HOME/dc | |
11 | ||
12 | unset speedrecpath | |
13 | IFS=: binpath=($PATH) | |
14 | lepath=() | |
15 | for dir in "${binpath[@]}"; do | |
16 | lepath=("${lepath[@]}" "${dir%/bin}/libexec") | |
17 | done | |
18 | for dir in "${lepath[@]}" /usr/libexec /usr/local/libexec; do | |
19 | if [ -x "${dir}/speedrec" ]; then | |
20 | speedrecpath="${dir}/speedrec" | |
21 | fi | |
22 | done | |
23 | if [ -z "$speedrecpath" ]; then | |
24 | echo "could not find speedrec - using cat instead" >&2 | |
25 | fi | |
26 | ||
27 | maxsize=0 | |
28 | unset resfile | |
29 | unset infofile | |
30 | found=y | |
31 | while [ -z "$resfile" -a "$found" = y ]; do | |
32 | unset found | |
33 | for file in resume/*.info; do | |
34 | if [ ! -r "$file" ]; then continue; fi | |
35 | . "$file" | |
36 | if [ "$filesize" -eq "$2" ]; then | |
37 | thisfile="${file%.info}" | |
38 | if [ ! -e "${thisfile}.lock" ]; then | |
39 | size="$(wc -c <"$thisfile")" | |
40 | found=y | |
41 | if [ "$size" -gt "$maxsize" ]; then | |
42 | maxsize="$size" | |
43 | resfile="$thisfile" | |
44 | infofile="$file" | |
45 | fi | |
46 | fi | |
47 | fi | |
48 | done | |
49 | if [ -n "$resfile" ]; then | |
50 | if ! locktouch "${resfile}.lock"; then | |
51 | unset resfile | |
52 | fi | |
53 | fi | |
54 | done | |
55 | ||
56 | unset "${!dcarg_@}" | |
57 | if [ -n "$resfile" ]; then | |
58 | . "${resfile}.info" | |
59 | fi | |
60 | ||
61 | origname="$1" | |
62 | shift | |
63 | filesize="$1" | |
64 | shift | |
65 | peername="$1" | |
66 | shift | |
67 | while [ $# -gt 1 ]; do | |
68 | rec="$1" | |
69 | shift | |
70 | val="$1" | |
71 | shift | |
72 | declare "dcarg_$rec"="$val" | |
73 | done | |
74 | ||
75 | if [ -z "$resfile" ]; then | |
76 | resfile="$(mktemp resume/resXXXXXX)" | |
77 | chmod 644 "$resfile" | |
78 | maxsize=0 | |
79 | >"${resfile}.lock" | |
80 | fi | |
81 | declare -p origname filesize "${!dcarg_@}" >"${resfile}.info" | |
82 | ||
83 | echo "resume $maxsize" 2>/dev/null # Avoid EPIPE warning if the server has already closed the transfer. | |
84 | ||
85 | if [ -z "$speedrecpath" ]; then | |
86 | speedrec=(cat) | |
87 | else | |
88 | speedrec=("$speedrecpath" "$HOME/dc/users/$(tr / _ <<<"$peername")") | |
89 | peerfile="$(tr / _ <<<"$peername")" | |
90 | fi | |
91 | if ! which tthsum >/dev/null 2>&1; then | |
92 | tthsum=(cat) | |
93 | else | |
94 | tthsum=(tthsum -6 -F 3 -s "${resfile}.tthstate" -f) | |
95 | fi | |
96 | "${speedrec[@]}" | "${tthsum[@]}" 3>"${resfile}.tthfinal" >>"$resfile" | |
97 | ||
98 | size="$(wc -c <"$resfile")" | |
99 | ||
100 | if [ "$size" -eq 0 ]; then | |
101 | rm -f "$resfile" "${resfile}.info" "${resfile}.lock" "${resfile}.tthstate" "${resfile}.tthfinal" | |
102 | exit 1 | |
103 | fi | |
104 | ||
105 | if [ "$size" -lt "$filesize" ]; then | |
106 | rm -f "${resfile}.lock" "${resfile}.tthfinal" | |
107 | exit 1 # Exit code != 0 means restart transfer | |
108 | fi | |
109 | ||
110 | tth="$(cat "${resfile}.tthfinal")" | |
111 | if [ -z "$tth" ]; then unset tth; fi | |
112 | ||
113 | rm -f "${resfile}.info" "${resfile}.lock" "${resfile}.tthstate" "${resfile}.tthfinal" | |
114 | ||
115 | destdir="$HOME/dc/done" | |
116 | ||
117 | newname="$destdir"/"$origname" | |
118 | if [ -e "$newname" ]; then | |
119 | newname="$(mktemp "${newname}XXXXXX")" | |
120 | fi | |
121 | mv "$resfile" "$newname" | |
122 | if [ -x $HOME/dc/complete ]; then | |
123 | export "${!dcarg_@}" tth filesize | |
124 | exec $HOME/dc/complete "$newname" | |
125 | fi | |
126 | exit 0 |