23049eb460c1a124273e09095236f682d336d820
[doldaconnect.git] / config / dc-filter
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 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
19     echo "could not find speedrec - using cat instead" >&2
20 fi
21
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
50
51 unset "${!dcarg_@}"
52 if [ -n "$resfile" ]; then
53     . "${resfile}.info"
54 fi
55
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
69
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"
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)
82 else
83     speedrec=("$speedrecpath" "$HOME/dc/users/$(tr / _ <<<"$peername")")
84     peerfile="$(tr / _ <<<"$peername")"
85 fi
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
93 size="$(wc -c <"$resfile")"
94
95 if [ "$size" -eq 0 ]; then
96     rm -f "$resfile" "${resfile}.info" "${resfile}.lock" "${resfile}.tthstate" "${resfile}.tthfinal"
97     exit 1
98 fi
99
100 if [ "$size" -lt "$filesize" ]; then
101     rm -f "${resfile}.lock" "${resfile}.tthfinal"
102     exit 1   # Exit code != 0 means restart transfer
103 fi
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"
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
118     export "${!dcarg_@}" tth filesize
119     exec $HOME/dc/complete "$newname"
120 fi
121 exit 0