Applied wdh's fixed exec call to work on FreeBSD
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP.pm
index 422e920..779378c 100644 (file)
@@ -106,23 +106,28 @@ sub read_chunk {
 
 # A very very simple HTTP server that initializes a CGI environment
 sub run {
-    my ( $self, $class, $port, $host, $fork ) = @_;
+    my ( $self, $class, $port, $host, $options ) = @_;
 
+    $options ||= {};
+    
     our $GOT_HUP;
     local $GOT_HUP = 0;
-
+    
     local $SIG{HUP} = sub { $GOT_HUP = 1; };
-
     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;
@@ -137,7 +142,7 @@ sub run {
     while ( accept( Remote, HTTPDaemon ) ) {
 
         # Fork
-        if ($fork) { next if $pid = fork }
+        if ( $options->{fork} ) { next if $pid = fork }
 
         close HTTPDaemon if defined $pid;
 
@@ -217,7 +222,12 @@ sub run {
         close Remote;
     }
     close HTTPDaemon;
-    exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @ARGV ) if $GOT_HUP;
+
+    if ($GOT_HUP) {
+        $SIG{CHLD} = 'DEFAULT';
+        wait;
+        exec $^X . ' "' . $0 . '" ' . join(' ', @{$options->{argv}});
+    }
 }
 
 sub _get_line {