package main;
use List::Util qw(sum);
use Coro::AIO ();
use Storable ();
my $SD_VERSION = 1;
my $ignore = qr/ ^(?:robots.txt$|\.) /x;
our %diridx;
if ($db_env) {
tie %diridx, BerkeleyDB::Hash,
-Env => $db_env,
-Filename => "directory",
-Flags => DB_CREATE,
or die "unable to create database index";
}
sub conn::gen_statdata {
my $self = shift;
my $data;
{
my $prefix = "http://" . $self->server_hostport;
my $path = "$prefix / ";
for (split /\//, substr $self->{name}, 1) {
next if $_ eq ".";
$prefix .= "/" . escape_uri $_;
$path .= "$_ / ";
}
$data->{path} = $path;
}
{
my $path = $self->{path};
do {
Coro::AIO::aio_load "$path.dols/top", $data->{top}
unless Coro::AIO::aio_stat "$path.dols/top";
Coro::AIO::aio_load "$path.dols/bot", $data->{bot}
unless Coro::AIO::aio_stat "$path.dols/bot";
$path =~ s/[^\/]*\/+$//
or die "malformed path: $path";
} while $path ne "";
}
my $entries = Coro::AIO::aio_readdir $self->{path};
{
my $dlen = 0;
my $flen = 0;
my $slen = 0;
for (sort @$entries) {
next if /$ignore/;
Coro::AIO::aio_stat "$self->{path}$_";
if (-d _) {
next unless 0555 == ((stat _)[2] & 0555);
$dlen = length $_ if length $_ > $dlen;
push @{$data->{d}}, $_;
} else {
next unless 0444 == ((stat _)[2] & 0444);
my $s = -s _;
$flen = length $_ if length $_ > $dlen;
$slen = length $s if length $s > $dlen;
push @{$data->{f}}, [$_, $s];
}
}
$data->{dlen} = $dlen;
$data->{flen} = $flen;
$data->{slen} = $slen;
}
$data
}
sub conn::get_statdata {
my $self = shift;
my $mtime = $self->{stat}[9];
my $statdata;
# $statdata = $diridx{$self->{path}};
#
# if (defined $statdata) {
# $$statdata = Storable::thaw $statdata;
# return $$statdata
# if $$statdata->{version} == $SD_VERSION
# && $$statdata->{mtime} == $mtime;
# }
# $self->slog(8, "creating index cache for $self->{path}");
$$statdata = $self->gen_statdata;
$$statdata->{version} = $SD_VERSION;
$$statdata->{mtime} = $mtime;
# $diridx{$self->{path}} = Storable::freeze $$statdata;
# (tied %diridx)->db_sync;
$$statdata
}
sub handle_redirect { # unused
if (-f ".redirect") {
if (open my $fh, "<.redirect") {
while (<$fh>) {
if (/^(?:$host$port)$uri([^ \tr\n]*)[ \t\r\n]+(.*)$/) {
my $rem = $1;
my $url = $2;
print $nph ? "HTTP/1.0 302 Moved\n" : "Status: 302 Moved\n";
print <
Page Redirection to $url
This page has moved to $url.
The automatic redirection has failed. Please try a slightly
newer browser next time, and in the meantime please follow this link ;)