--- a/hlog.pl Tue Dec 29 14:06:42 2009 +0100
+++ b/hlog.pl Tue Dec 29 15:08:09 2009 +0100
@@ -23,8 +23,9 @@
use Getopt::Long;
use Pod::Usage;
use File::Basename;
+use if $ENV{DEBUG} => "Smart::Comments";
use POSIX qw(:sys_wait_h setsid);
-use Cwd;
+use Cwd qw(abs_path getcwd);
my $ME = basename $0;
@@ -119,6 +120,13 @@
$opt_ssl = 0;
}
+ foreach ($opt_ssl_key, $opt_ssl_cert) {
+ $_ = abs_path($_) if defined;
+ }
+
+ ### $opt_ssl_key
+ ### $opt_ssl_cert
+
$authdata = new Authen::hlog(filename => $opt_htpasswd, realm => $opt_realm)
if $opt_auth;
@@ -172,27 +180,35 @@
}
# start the listener
- my $listener =
- $opt_ssl
- ? new IO::Socket::SSL(
- LocalAddr => $opt_addr,
- LocalPort => $opt_port,
- Proto => "tcp",
- Listen => 1,
- ReuseAddr => 1,
- SSL => $opt_ssl,
- SSL_key_file => $opt_ssl_key,
- SSL_cert_file => $opt_ssl_cert,
- #debug => $opt_debug
- )
- : new IO::Socket::INET(
+ # my $listener =
+ # $opt_ssl
+ # ? new IO::Socket::SSL(
+ # LocalAddr => $opt_addr,
+ # LocalPort => $opt_port,
+ # Proto => "tcp",
+ # Listen => 1,
+ # ReuseAddr => 1,
+ # SSL => $opt_ssl,
+ # SSL_key_file => $opt_ssl_key,
+ # SSL_cert_file => $opt_ssl_cert,
+ # #debug => $opt_debug
+ # )
+ # : new IO::Socket::INET(
+ # LocalAddr => $opt_addr,
+ # LocalPort => $opt_port,
+ # Proto => "tcp",
+ # Listen => 1,
+ # ReuseAddr => 1,
+ # #debug => $opt_debug,
+ # );
+
+ my $listener = new IO::Socket::INET(
LocalAddr => $opt_addr,
LocalPort => $opt_port,
Proto => "tcp",
Listen => 1,
ReuseAddr => 1,
- #debug => $opt_debug,
- );
+ ) or die "Can't create listener: $!\n";
# go daemon
chdir("/") or die "Can't chdir to /: $!\n";
@@ -249,11 +265,20 @@
die "Can't fork: $!\n" if not defined $pid;
if ($pid == 0) {
$SIG{CHLD} = "DEFAULT";
- $listener->close(SSL_no_shutdown => 1);
+ $listener->close();
+ if ($opt_ssl) {
+ $client = IO::Socket::SSL->new_from_fd(
+ $client,
+ SSL_server => 1,
+ SSL_key_file => $opt_ssl_key,
+ SSL_cert_file => $opt_ssl_cert,
+ );
+ $client->start_SSL;
+ }
handle_request($client);
exit 0;
}
- $client->close(SSL_no_shutdown => 1);
+ $client->close();
# maintenance of logfiles
if (-s $access > $maxlogsize) {
@@ -293,6 +318,7 @@
sub handle_request($) {
my $client = shift;
+
local $_ = <$client>;
# should be HTTP(S)/x.x
@@ -464,85 +490,6 @@
# PACKAGES
{
- package IO::Socket::hlog;
-
- use IO::Socket::INET;
- use IO::Socket::SSL;
-
- our (@ISA, $DEBUG);
-
- sub new {
-
- my $class = shift;
-
- my %args = @_;
- my $ssl = delete $args{SSL};
-
- if ($ssl) {
-
- @ISA = qw(IO::Socket::SSL);
- $IO::Socket::SSL::DEBUG = $DEBUG ? 3 : 0;
-
- }
- else {
-
- %args = _delete_ssl_args(%args);
- @ISA = qw(IO::Socket::INET);
-
- }
-
- my $self;
- unless ($self = $class->SUPER::new(%args)) {
-
- return;
-
- }
-
- print "$class: $self created\n" if $DEBUG;
-
- return $self;
-
- }
-
- sub close {
-
- my $self = shift;
- print "$self: closing\n" if $DEBUG;
-
- my %args = @_;
-
- %args = _delete_ssl_args(%args) unless $self->_is_ssl;
-
- return $self->SUPER::close(%args);
-
- }
-
- sub errstr {
-
- return IO::Socket::SSL::errstr if _is_ssl();
-
- return $@;
-
- }
-
- sub _delete_ssl_args {
-
- my %args = @_;
- map { delete $args{$_} if /^SSL/; } keys %args;
- return %args;
-
- }
-
- sub _is_ssl {
-
- my $self = shift;
- return $ISA[0] eq "IO::Socket::SSL";
-
- }
-}
-
-{
-
# authentication
package Authen::hlog;
@@ -641,7 +588,6 @@
}
}
-
__END__
=head1 NAME