use strict;
use base 'Catalyst::Engine::CGI';
use Errno 'EWOULDBLOCK';
-use FindBin;
-use File::Find;
-use File::Spec;
use HTTP::Status;
use NEXT;
use Socket;
sub run {
my ( $self, $class, $port, $host, $options ) = @_;
+ $options ||= {};
+
our $GOT_HUP;
local $GOT_HUP = 0;
-
+
local $SIG{HUP} = sub { $GOT_HUP = 1; };
-
- # Setup restarter
- my $restarter;
- if ( $options->{restart} ) {
- my $parent = $$;
- unless ( $restarter = fork ) {
-
- # Index parent directory
- my $dir = File::Spec->catdir( $FindBin::Bin, '..' );
-
- my $regex = $options->{restart_regex};
- my $one = _index( $dir, $regex );
- while (1) {
- sleep $options->{restart_delay};
- my $two = _index( $dir, $regex );
- if ( my $file = _compare_index( $one, $two ) ) {
- print STDERR qq/File "$file" modified, restarting\n/;
- kill( 1, $parent );
- $one = $two;
- }
- }
- }
- }
+ local $SIG{CHLD} = 'IGNORE';
# Handle requests
# Setup socket
$host = $host ? inet_aton($host) : INADDR_ANY;
- socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') );
- setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) );
- bind( HTTPDaemon, sockaddr_in( $port, $host ) );
- listen( HTTPDaemon, SOMAXCONN );
+ socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') )
+ || die "Couldn't assign TCP socket: $!";
+ setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) )
+ || die "Couldn't set TCP socket options: $!";
+ bind( HTTPDaemon, sockaddr_in( $port, $host ) )
+ || die "Couldn't bind socket to $port on $host: $!";
+ listen( HTTPDaemon, SOMAXCONN )
+ || die "Couldn't listen to socket on $port on $host: $!";
my $url = 'http://';
if ( $host eq INADDR_ANY ) {
require Sys::Hostname;
}
close HTTPDaemon;
- exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @ARGV ) if $GOT_HUP;
-}
-
-sub _compare_index {
- my ( $one, $two ) = @_;
- my %clone = %$two;
- while ( my ( $key, $val ) = each %$one ) {
- return $key if ( !$clone{$key} || ( $clone{$key} ne $val ) );
- delete $clone{$key};
+ if ($GOT_HUP) {
+ $SIG{CHLD} = 'DEFAULT';
+ wait;
+ exec $^X . ' "' . $0 . '" ' . join(' ', @{$options->{argv}});
}
- if ( keys %clone ) {
- return join ' ', keys %clone;
- }
- return 0;
}
sub _get_line {
return $line;
}
-sub _index {
- my ( $dir, $regex ) = @_;
- my %index;
- finddepth(
- {
- wanted => sub {
- my $file = File::Spec->rel2abs($File::Find::name);
- return unless $file =~ /$regex/;
- return unless -f $file;
- my $time = ( stat $file )[9];
- $index{$file} = $time;
- },
- no_chdir => 1
- },
- $dir
- );
- return \%index;
-}
-
=back
=head1 SEE ALSO