111 lines
2.5 KiB
Bash
Executable file
111 lines
2.5 KiB
Bash
Executable file
#!/bin/rc
|
|
PATH_INFO=`{echo $PATH_INFO | urlencode -d}
|
|
full_path=$"FS_ROOT^$"PATH_INFO
|
|
full_path=$"full_path
|
|
if(! test -d $full_path){
|
|
error 404
|
|
exit
|
|
}
|
|
if(! test -r $full_path){
|
|
error 503
|
|
exit
|
|
}
|
|
builtin cd $full_path
|
|
if(~ $"NOINDEXFILE ^ $"NOINDEX ''){
|
|
ifile=index.htm*
|
|
if(! ~ $ifile(1) *'*'){
|
|
PATH_INFO=$ifile(1)
|
|
FS_ROOT=''
|
|
exec serve-static
|
|
}
|
|
}
|
|
title=`{echo $SITE_TITLE | sed s,%s,^$"PATH_INFO^,}
|
|
title=$"title
|
|
lso=()
|
|
switch($2){
|
|
case size
|
|
# ls has no option to sort by size
|
|
# could pipe it through sort, I suppose
|
|
case date
|
|
lso=-t
|
|
}
|
|
do_log 200
|
|
echo 'HTTP/1.1 200 OK'^$cr
|
|
emit_extra_headers
|
|
echo 'Content-type: text/html; charset=utf-8'^$cr
|
|
echo $cr
|
|
echo '<html>
|
|
<head>
|
|
<title>'^$title^'</title>
|
|
<style type="text/css">
|
|
.size {
|
|
text-align: right;
|
|
padding-right: 4pt;
|
|
}
|
|
.day {
|
|
text-align: right;
|
|
padding-right: 3pt;
|
|
}
|
|
.datetime {
|
|
text-align: right;
|
|
}
|
|
.name {
|
|
text-align: right;
|
|
padding-left: 3pt;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>'
|
|
echo '<h1>'^$title^'</h1>'
|
|
if(! ~ $PATH_INFO /)
|
|
echo '<a href="../">Parent directory</a>'
|
|
echo '<table>'
|
|
ls -lQ $lso | awk '
|
|
function urlencode(loc){
|
|
# very minimal encoding, just enough for our static-file purposes
|
|
url=loc
|
|
gsub("%", "%25", url) # this one first!
|
|
gsub("\\$", "%24", url)
|
|
gsub("&", "%26", url)
|
|
gsub("\\+", "%2B", url)
|
|
gsub("\\?", "%3F", url)
|
|
gsub(" ", "%20", url)
|
|
gsub("\"", "%22", url)
|
|
gsub("#", "%23", url)
|
|
return url
|
|
}
|
|
function hrsize(size){
|
|
if(size > 1073741824) return sprintf("%.1fGB", size/1073741824)
|
|
if(size > 10485760) return sprintf("%iMB", size/1048576)
|
|
if(size > 1048576) return sprintf("%.1fMB", size/1048576)
|
|
if(size > 10240) return sprintf("%iKB", size/1024)
|
|
if(size > 1024) return sprintf("%.1fKB", size/1024)
|
|
return sprintf("%iB", size)
|
|
}
|
|
/^(-|a)/ {
|
|
print "<tr>"
|
|
print "<td class=\"size\">"hrsize($6)"</td>"
|
|
print "<td class=\"month\">"$7"</td>"
|
|
print "<td class=\"day\">"$8"</td>"
|
|
print "<td class=\"datetime\">"$9"</td>"
|
|
$1="" ; $2="" ; $3="" ; $4="" ; $5="" ; $6="" ; $7="" ; $8="" ; $9=""
|
|
sub("^ *?", "")
|
|
print "<td><a class=\"file name\" href=\""urlencode($0)"\">"$0"</a></td>"
|
|
print "</tr>"
|
|
$0=""
|
|
}
|
|
/^d/ {
|
|
print "<tr>"
|
|
print "<td class=\"size\"> </td>"
|
|
print "<td class=\"month\">"$7"</td>"
|
|
print "<td class=\"day\">"$8"</td>"
|
|
print "<td class=\"datetime\">"$9"</td>"
|
|
$1="" ; $2="" ; $3="" ; $4="" ; $5="" ; $6="" ; $7="" ; $8="" ; $9=""
|
|
sub("^ *?", "")
|
|
print "<td><a class=\"dir name\" href=\""urlencode($0)"/\">"$0"/</a></td>"
|
|
print "</tr>"
|
|
}'
|
|
echo '</table>
|
|
|
|
</body>
|
|
</html>'
|