#!/bin/sh # File Tosser v0.1e-6 # # Ian Ward '01, this script has been placed in the public domain ACCESS_LIST="/usr/bin/cut -f 2- /home/tosser/access.list" # ^^ this command must produce a list of file paths # # --> STDIN # [ :persist\n ] toss more than one file # [ :seek\n # \n ] skip bytes from next file # \n toss file given # [ ] all done # # STDOUT --> # [ \n ] when in :persist mode # # [ ] when not in :persist mode # # STDERR --> # declare -i index # this way the client can't send us anything nasty persist=0 send() { if [ "$persist" == "1" ]; then # is there a better way to print file size? /usr/bin/perl -e'print ((stat("'$acc'"))[7]); print"\n";' fi index="$offset + 1" /usr/bin/tail -c +"$index" "$acc" } while read filename; do if [ "$filename" = ":persist" ]; then persist=1; continue elif [ "$filename" = ":seek" ]; then read offset; continue fi $ACCESS_LIST | while /bin/true; do if read acc; then if [ "$filename" = "$acc" -a -f "$acc" ]; then send; break fi else echo "404 Not Found" 1>&2 break fi done [ "$persist" = "1" ] || break offset=0 done