use List::Util qw(sum);
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 $path = "";
my $prefix = "";
for ("http://".$self->server_hostport, split /\//, substr $self->{name}, 1) {
next if $_ eq ".";
$path .= "$_ / ";
$prefix .= "$_/";
}
$data->{path} = $path;
}
sub read_file {
local $/;
my $fh;
(open $fh, "<$_[0]\x00") ? <$fh> : ()
}
{
my $path = $self->{path};
do {
$data->{top} ||= read_file "$path.dols/top";
$data->{bot} ||= read_file "$path.dols/bot";
$path =~ s/[^\/]*\/+$//
or die "malformed path: $path";
} while $path ne "";
}
if (opendir my $dir, $self->{path}) {
my $dlen = 0;
my $flen = 0;
my $slen = 0;
for (sort readdir $dir) {
next if /$ignore/;
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];
$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 ;)