[svn:qpsmtpd] rev 466 - trunk

[email protected] 6 Jul 2005 12:13:53 -0000
Newsgroups perl.cvs.qpsmtpd
Message-ID <[email protected]>
Author: msergeant
Date: Wed Jul  6 05:13:53 2005
New Revision: 466

Modified:
   trunk/qpsmtpd-forkserver
Log:
Make sure we process all servers after select()


Modified: trunk/qpsmtpd-forkserver
==============================================================================
--- trunk/qpsmtpd-forkserver	(original)
+++ trunk/qpsmtpd-forkserver	Wed Jul  6 05:13:53 2005
@@ -159,81 +159,81 @@ while (1) {
   }
   my @ready = $select->can_read(1);
   next if !@ready;
-  my $server = shift @ready;
-
-  my ($client, $hisaddr) = $server->accept;
-
-  if (!$hisaddr) {
-    # possible something condition...
-    next;
-  }
-  IO::Handle::blocking($client, 1);
-  my ($port, $iaddr) = sockaddr_in($hisaddr);
-  if ($MAXCONNIP) {
-    my $num_conn = 1; # seed with current value
-
-    foreach my $rip (values %childstatus) {
-      ++$num_conn if (defined $rip && $rip eq $iaddr);
+  while (my $server = shift @ready) {
+    my ($client, $hisaddr) = $server->accept;
+  
+    if (!$hisaddr) {
+      # possible something condition...
+      next;
     }
-
-    if ($num_conn > $MAXCONNIP) {
-      my $rem_ip = inet_ntoa($iaddr);
-      ::log(LOGINFO,"Too many connections from $rem_ip: "
-                   ."$num_conn > $MAXCONNIP. Denying connection.");
-      $client->autoflush(1);
-      print $client "451 Sorry, too many connections from $rem_ip, try again later\r\n";
-      close $client;
+    IO::Handle::blocking($client, 1);
+    my ($port, $iaddr) = sockaddr_in($hisaddr);
+    if ($MAXCONNIP) {
+      my $num_conn = 1; # seed with current value
+  
+      foreach my $rip (values %childstatus) {
+        ++$num_conn if (defined $rip && $rip eq $iaddr);
+      }
+  
+      if ($num_conn > $MAXCONNIP) {
+        my $rem_ip = inet_ntoa($iaddr);
+        ::log(LOGINFO,"Too many connections from $rem_ip: "
+                     ."$num_conn > $MAXCONNIP. Denying connection.");
+        $client->autoflush(1);
+        print $client "451 Sorry, too many connections from $rem_ip, try again later\r\n";
+        close $client;
+        next;
+      }
+    }
+    my $pid = safe_fork();
+    if ($pid) {
+      # parent
+      $childstatus{$pid} = $iaddr;	# add to table
+      # $childstatus{$pid} = 1;	# add to table
+      $running++;
+      close($client);
       next;
     }
-  }
-  my $pid = safe_fork();
-  if ($pid) {
-    # parent
-    $childstatus{$pid} = $iaddr;	# add to table
-    # $childstatus{$pid} = 1;	# add to table
-    $running++;
-    close($client);
-    next;
-  }
-  # otherwise child
-
-  # all children should have different seeds, to prevent conflicts
-  srand( time ^ ($$ + ($$ << 15)) );
-
-  close($server);
-
-  $SIG{$_} = 'DEFAULT' for keys %SIG;
-  $SIG{ALRM} = sub { 
-     print $client "421 Connection Timed Out\n";
-     ::log(LOGINFO, "Connection Timed Out"); 
-     exit; };
-
-  my $localsockaddr = getsockname($client);
-  my ($lport, $laddr) = sockaddr_in($localsockaddr);
-  $ENV{TCPLOCALIP} = inet_ntoa($laddr);
-  # my ($port, $iaddr) = sockaddr_in($hisaddr);
-  $ENV{TCPREMOTEIP} = inet_ntoa($iaddr);
-  $ENV{TCPREMOTEHOST} = gethostbyaddr($iaddr, AF_INET) || "Unknown";
-
-  # don't do this!
-  #$0 = "qpsmtpd-forkserver: $ENV{TCPREMOTEIP} / $ENV{TCPREMOTEHOST}";
-
-  ::log(LOGINFO, "Accepted connection $running/$MAXCONN from $ENV{TCPREMOTEIP} / $ENV{TCPREMOTEHOST}");
+    # otherwise child
   
-  # dup to STDIN/STDOUT
-  POSIX::dup2(fileno($client), 0);
-  POSIX::dup2(fileno($client), 1);
-  
-  $qpsmtpd->start_connection
-    (
-     local_ip    => $ENV{TCPLOCALIP},
-     local_port  => $lport,
-     remote_ip   => $ENV{TCPREMOTEIP},
-     remote_port => $port,
-    );
-  $qpsmtpd->run();
+    # all children should have different seeds, to prevent conflicts
+    srand( time ^ ($$ + ($$ << 15)) );
   
-  exit;                                   # child leaves
+    close($server);
+  
+    $SIG{$_} = 'DEFAULT' for keys %SIG;
+    $SIG{ALRM} = sub { 
+       print $client "421 Connection Timed Out\n";
+       ::log(LOGINFO, "Connection Timed Out"); 
+       exit; };
+  
+    my $localsockaddr = getsockname($client);
+    my ($lport, $laddr) = sockaddr_in($localsockaddr);
+    $ENV{TCPLOCALIP} = inet_ntoa($laddr);
+    # my ($port, $iaddr) = sockaddr_in($hisaddr);
+    $ENV{TCPREMOTEIP} = inet_ntoa($iaddr);
+    $ENV{TCPREMOTEHOST} = gethostbyaddr($iaddr, AF_INET) || "Unknown";
+  
+    # don't do this!
+    #$0 = "qpsmtpd-forkserver: $ENV{TCPREMOTEIP} / $ENV{TCPREMOTEHOST}";
+  
+    ::log(LOGINFO, "Accepted connection $running/$MAXCONN from $ENV{TCPREMOTEIP} / $ENV{TCPREMOTEHOST}");
+    
+    # dup to STDIN/STDOUT
+    POSIX::dup2(fileno($client), 0);
+    POSIX::dup2(fileno($client), 1);
+    
+    $qpsmtpd->start_connection
+      (
+       local_ip    => $ENV{TCPLOCALIP},
+       local_port  => $lport,
+       remote_ip   => $ENV{TCPREMOTEIP},
+       remote_port => $port,
+      );
+    $qpsmtpd->run();
+    
+    exit;                                   # child leaves
+  }
 }
 
 sub log {