default to a random available port (you can still explicitly request with MSVA_PORT)
authorDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 12 Mar 2010 05:09:01 +0000 (00:09 -0500)
committerDaniel Kahn Gillmor <dkg@fifthhorseman.net>
Fri, 12 Mar 2010 05:09:01 +0000 (00:09 -0500)
Net/Server/MSVA.pm
msva-perl

index 4e3a404f9046d2c6bedcd2844620659efe795f83..719487da61b035963d478ca406bf5818b046b5e9 100644 (file)
@@ -31,7 +31,7 @@
     my $self = shift;
     # if we got here, then the binding was successful.
     $exit_status = 0;
-    $msva->post_bind_hook(@_);
+    $msva->post_bind_hook($self, @_);
   }
 
   sub set_exit_status {
index 0485dac68b8105a6e4d08823d62b5ec4fc6eff67..4509a04a591402ab12dd5dfe151c79af9fdd32b3 100755 (executable)
--- a/msva-perl
+++ b/msva-perl
@@ -94,13 +94,20 @@ use strict;
   sub new {
     my $class = shift;
 
-    my $port = 8901;
+    my $port = 0;
     if (exists $ENV{MSVA_PORT}) {
       $port = $ENV{MSVA_PORT} + 0;
       die sprintf("not a reasonable port %d", $port) if (($port >= 65536) || $port <= 0);
     }
     # start the server on port 8901
     my $self = $class->SUPER::new($port);
+    if (! exists $ENV{MSVA_PORT}) {
+      # we can't pass port 0 to the constructor because it evaluates
+      # to false, so HTTP::Server::Simple just uses its internal
+      # default of 8080.  But if we want to select an arbitrary open
+      # port, we *can* set it here.
+      $self->port(0);
+    }
 
     $self->{allowed_uids} = {};
     if (exists $ENV{MSVA_ALLOWED_USERS}) {
@@ -411,6 +418,26 @@ use strict;
 
   sub post_bind_hook {
     my $self = shift;
+    my $server = shift;
+
+    my $socketcount = @{ $server->{server}->{sock} };
+    if ( $socketcount != 1 ) {
+      msvalog('error', "%d sockets open; should have been 1.", $socketcount);
+      $server->set_exit_status(10);
+      $server->server_close();
+    }
+    my $port = @{ $server->{server}->{sock} }[0]->sockport();
+    if ((! defined $port) || ($port < 1) || ($port >= 65536)) {
+      msvalog('error', "got nonsense port: %d.", $port);
+      $server->set_exit_status(11);
+      $server->server_close();
+    }
+    if ((exists $ENV{MSVA_PORT}) && (($ENV{MSVA_PORT} + 0) != $port)) {
+      msvalog('error', "Explicitly requested port %d, but got port: %d.", ($ENV{MSVA_PORT}+0), $port);
+      $server->set_exit_status(13);
+      $server->server_close();
+    }
+    $self->port($port);
 
     my $argcount = @ARGV;
     if ($argcount) {
@@ -522,7 +549,8 @@ of local users (by name or user ID) who are allowed to connect.
 =item MSVA_PORT
 
 msva-perl listens on a local TCP socket to facilitate access.  You can
-choose what port to bind to by setting MSVA_PORT.  Default is 8901.
+choose what port to bind to by setting MSVA_PORT.  Default is to bind
+on an arbitrary open port.
 
 =back