use strict;
no strict qw(refs);
use vars qw(@Days @Months $AUTOLOAD $LOADED $COUNT);
@Days = qw(Sun Mon Tue Wed Thu Fri Sat);
@Months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
# we need a different class from Apache::ASP::CGI because we don't
# want to force use of CGI & Class::Struct when loading ASP in Apache
# also a nasty bug doesn't allow us to eval require's or use's, we
# get a can't start_mutex
sub new {
my($file) = @_;
bless {
current_callback => 'PerlHandler',
filename => $file,
remote_ip => '127.0.0.1',
user => undef,
method => 'GET',
NoState => 1,
headers_in => Apache::ASP::CGI::Table->new,
headers_out => Apache::ASP::CGI::Table->new,
dir_config => Apache::ASP::CGI::Table->new,
subprocess_env => Apache::ASP::CGI::Table->new,
};
}
sub AUTOLOAD {
$AUTOLOAD =~ s/^(.*)::([^:]*)$/$2/;
shift->{$AUTOLOAD};
}
sub log_error {
shift;
my @times = localtime;
printf STDERR ('[%s %s %02d %02d:%02d:%02d %d] [error] %s'."\n",
$Days[$times[6]],
$Months[$times[4]],
$times[3],
$times[2],
$times[1],
$times[0],
$times[5] + 1900,
join('', @_),
);
}
sub connection { shift; }
sub Run {
shift if(ref $_[0] or $_[0] eq 'Apache::ASP');
local $SIG{__WARN__} = \&Apache::ASP::Warn;
my($file, $match, %args) = @_;
unless(-e $file) {
warn("$file does not exist for loading");
return;
}
$match ||= '.*'; # compile all by default
# recurse down directories and compile the scripts
if(-d $file && ! -l $file) {
$file =~ s|/$||;
opendir(DIR, $file) || die("can't open $file for reading: $!");
my @files = readdir(DIR);
close DIR;
unless(@files) {
Apache::ASP::Load->log_error("[asp] $$ [WARN] can't read files in $file");
return;
}
my $top;
if(! defined $LOADED) {
$top = 1;
}
defined $LOADED or (local $LOADED = 0);
defined $COUNT or (local $COUNT = 0);
for(@files) {
chomp;
next if /^\.\.?$/;
&Run("$file/$_", $match, %args);
}
if($top) {
Apache::ASP::Load->log_error("[asp] $$ (re)compiled $LOADED scripts of $COUNT loaded for $file");
}
return;
}
# now the real work
unless($file =~ /$match/) {
if($args{Debug} and $args{Debug} < 0) {
Apache::ASP::Load->log_error("skipping compile of $file no match $match");
}
return;
}
unless($file =~ /$match/) {
if($args{Debug} < 0) {
warn("skipping compile of $file no match $match");
}
return;
}
my $r = Apache::ASP::Load::new($file);
for my $key (
qw( Debug StatINC StatINCMatch ),
@{Apache::ASP->CompileChecksumKeys}
)
{
$r->dir_config->set($key, $args{$key});
}
$r->dir_config->set('NoState', 1);
# RegisterIncludes created for precompilation, on by default here
$r->dir_config->set('RegisterIncludes', 1);
if ((defined $args{'RegisterIncludes'})) {
$r->dir_config->set('RegisterIncludes', $args{'RegisterIncludes'});
}
eval {
$COUNT++;
my $asp = Apache::ASP->new($r);
# if StatINC* is configured, run on first script
if(($COUNT == 1) && ($asp->config('StatINC') || $asp->config('StatINCMatch'))) {
$asp->StatINC;
}
my $rv = $asp->CompileInclude($asp->{'basename'})
|| die($@);
if($args{'Execute'}) {
local *Apache::ASP::Response::Flush = sub {};
$asp->Run;
}
$asp->DESTROY;
$LOADED++;
};
$@ && warn($@);
return $LOADED;
}
1;