- apply hunk that fixes an issue with (wrong?) dependencies. Initial notes were:
[oweals/busybox.git] / networking / httpd_index_cgi_example
1 #!/bin/sh
2 # This CGI creates directory index.
3 # Put it into cgi-bin/index.cgi and chmod 0755.
4 #
5 # Problems:
6 # * Unsafe wrt weird filenames with <>"'& etc...
7 # * Not efficient: calls stat (program, not syscall) for each file
8 # * Probably requires bash
9 #
10 # If you want speed and safety, you need to code it in C
11
12 # Must start with '/'
13 test "${QUERY_STRING:0:1}" = "/" || exit 1
14 # /../ is not allowed
15 test "${QUERY_STRING%/../*}" = "$QUERY_STRING" || exit 1
16 test "${QUERY_STRING%/..}" = "$QUERY_STRING" || exit 1
17
18 # Outta cgi-bin...
19 cd .. 2>/dev/null || exit 1
20 # Strip leading '/', go to target dir
21 cd "${QUERY_STRING:1}" 2>/dev/null || exit 1
22
23 f=`dirname "$QUERY_STRING"`
24 test "$f" = "/" && f=""
25
26 printf "%s" \
27 $'HTTP/1.0 200 OK\r\n'\
28 $'Content-type: text/html\r\n\r\n'\
29 "<html><head><title>Index of $QUERY_STRING</title></head>"$'\r\n'\
30 "<body><h1>Index of $QUERY_STRING</h1><pre>"$'\r\n'\
31 $'<table width=100%>\r\n'\
32 $'<col><col><col width=0*>\r\n'\
33 $'<tr><th>Name<th align=right>Last modified<th align=right>Size\r\n'\
34 \
35 "<tr><td><a href='$f/'>..</a><td><td>"$'\r\n'
36
37 IFS='#'
38 for f in *; do
39     # Guard against empty dirs...
40     test -e "$f" && \
41     stat -c "%F#%s#%z" "$f" | {
42         read type size cdt junk
43         dir=''
44         test "$type" = "directory" && dir='/'
45         cdt="${cdt//.*}" # no fractional seconds
46         cdt="${cdt// /&nbsp;}" # prevent wrapping around space
47         printf "%s" "<tr><td><a href='$f$dir'>$f</a><td align=right>$cdt<td align=right>$size"$'\r\n'
48     }
49 done
50 printf "</table></pre><hr></body></html>"$'\r\n'