cvsuser     04/07/05 12:20:15

  Modified:    .        qpsmtpd-forkserver
  Log:
  Support per-IP throttling (Hanno Hecker <[EMAIL PROTECTED]>)
  
  Revision  Changes    Path
  1.6       +23 -2     qpsmtpd/qpsmtpd-forkserver
  
  Index: qpsmtpd-forkserver
  ===================================================================
  RCS file: /cvs/public/qpsmtpd/qpsmtpd-forkserver,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -w -r1.5 -r1.6
  --- qpsmtpd-forkserver        28 Jun 2004 03:05:03 -0000      1.5
  +++ qpsmtpd-forkserver        5 Jul 2004 19:20:15 -0000       1.6
  @@ -21,6 +21,7 @@
   my $PORT      = 25;                          # port number
   my $LOCALADDR = '0.0.0.0';           # ip address to bind to
   my $USER      = 'smtpd';             # user to suid to
  +my $MAXCONNIP = 5;              # max simultaneous connections from one IP
   
   sub usage {
           print <<"EOT";
  @@ -110,10 +111,30 @@
           # possible something condition...
           next;
       }
  +    my ($port, $iaddr) = sockaddr_in($hisaddr);
  +    if ($MAXCONNIP) {
  +        my $num_conn = 0;
  +        foreach my $rip (values %childstatus) {
  +            if ($rip eq $iaddr) {
  +                ++$num_conn;
  +            }
  +        }
  +        ++$num_conn; # count this connection, too :)
  +        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 = fork;
       if ($pid) {
           # parent
  -        $childstatus{$pid} = 1;      # add to table
  +        $childstatus{$pid} = $iaddr; # add to table
  +        # $childstatus{$pid} = 1;    # add to table
           $running++;
           close($client);
           next;
  @@ -128,7 +149,7 @@
       my $localsockaddr = getsockname($client);
       my ($lport, $laddr) = sockaddr_in($localsockaddr);
       $ENV{TCPLOCALIP} = inet_ntoa($laddr);
  -    my ($port, $iaddr) = sockaddr_in($hisaddr);
  +    # my ($port, $iaddr) = sockaddr_in($hisaddr);
       $ENV{TCPREMOTEIP} = inet_ntoa($iaddr);
       $ENV{TCPREMOTEHOST} = gethostbyaddr($iaddr, AF_INET) || "Unknown";
   
  
  
  

Reply via email to