Applied wdh's fixed exec call to work on FreeBSD
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP.pm
index 6e8e432..779378c 100644 (file)
@@ -3,9 +3,6 @@ package Catalyst::Engine::HTTP;
 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;
@@ -111,42 +108,26 @@ sub read_chunk {
 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;
@@ -242,20 +223,11 @@ sub run {
     }
     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 {
@@ -273,25 +245,6 @@ 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