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