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