Look properly for all appropriate libexec directories.
[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 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