X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/tgal/blobdiff_plain/f3663b65fccfbccfd819bd9069aac6d52853a5ce..aa5c3a514d22d4cc6cec6b6e77dc1af4f122b825:/mason/dhandler diff --git a/mason/dhandler b/mason/dhandler index f523432..49e5f84 100755 --- a/mason/dhandler +++ b/mason/dhandler @@ -109,7 +109,11 @@ Failed to find ‘<% $path |h %>’. <&| .html, title => "Folder " . $m->interp->apply_escapes($nosl || "[top]", "h"), head => $links &> -<& .breadcrumbs, what => "Folder", path => $path &> +<&| .breadcrumbs, what => "Folder", path => $path &> + + % % my $note = contents "$IMGROOT/$path/.tgal-note.html"; % if (defined $note) { @@ -147,6 +151,55 @@ Failed to find ‘<% $path |h %>’.
<& .footer, path => $path &> +% +<%args> + $path + + +% +%###------------------------------------------------------------------------- +<%def .zip>\ +<%perl> + my $st = stat "$IMGROOT/$path"; + if (!$st) { $m->comp(".not-found", path => $path); return; } + my $zip = "$TMP/t$$-download.zip"; + my $err = "$TMP/t$$-download.stderr"; + my $kid = fork; + if (!$kid) { + untie *STDIN; open STDIN, "/dev/null"; + untie *STDERR; open STDERR, ">", $err; + chdir "$IMGROOT/$path"; + exec "zip", "-qr", $zip, "."; + exit 127; + } + waitpid $kid, 0; + +% +% if ($?) { +<&| .html, title => "Zip failed (rc = $?)" &> +
+<%perl>
+	open my $f, "<", $err;
+	my $buf;
+	while (read $f, $buf, 16384) { $m->print($buf); }
+
+
+ +% } else { +<%perl> + $r->content_type("application/zip"); + open my $f, "<", $zip; binmode $f; + my $buf; + while (read $f, $buf, 16384) { $m->print($buf); } + +% } +% +<%perl> + eval { unlink $zip; }; + eval { unlink $err; }; + + % <%args> $path @@ -348,7 +401,13 @@ Failed to find ‘<% $path |h %>’. my $path = $m->dhandler_arg; my $st = stat "$IMGROOT/$path"; my $comp; - if (!$st) { $comp = ".not-found"; } + if (!$st) { + $comp = ".not-found"; + if ($path =~ /^ (.*) (\.(?: zip)) $/x) { + $st = stat "$IMGROOT/$1"; + if ($st) { $path = $1; $comp = $2; } + } + } elsif (-d $st) { $comp = ".contact"; } elsif (-f $st) { $comp = ".image"; } else { $comp = ".not-found"; }