> Attached is a diff against the 0.3x branch.

Oops; attached this time
--- qpsmtpd-0.3x/qpsmtpd-forkserver     2006-12-28 20:04:36.000000000 -0500
+++ qpsmtpd-forkserver  2006-12-28 21:24:58.000000000 -0500
@@ -12,7 +12,7 @@
 use IO::Socket;
 use IO::Select;
 use Socket;
-use Getopt::Long;
+use Getopt::Long qw(:config no_ignore_case);
 use POSIX qw(:sys_wait_h :errno_h :signal_h);
 use Net::DNS::Header;
 use strict;
@@ -28,10 +28,13 @@
 my $MAXCONN   = 15;                  # max simultaneous connections
 my @PORT;                            # port number(s)
 my @LOCALADDR;                       # ip address(es) to bind to
-my $USER      = 'smtpd';             # user to suid to
 my $MAXCONNIP = 5;                   # max simultaneous connections from one IP
 my $PID_FILE   = '';
 my $DETACH;                          # daemonize on startup
+my $NORDNS;
+
+my $USER = (getpwuid $>)[0];         # user to suid to
+$USER = "smtpd" if $USER eq "root";
 
 sub usage {
         print <<"EOT";
@@ -46,6 +49,7 @@
  -m, --max-from-ip M       : limit connections from a single IP; default 5
      --pid-file P          : print main servers PID to file P
  -d, --detach              : detach from controlling terminal (daemonize)
+ -H, --no-rdns             : don't perform reverse DNS lookups
 EOT
         exit 0;
 }
@@ -58,6 +62,7 @@
            'u|user=s' => \$USER,
            'pid-file=s' => \$PID_FILE,
            'd|detach' => \$DETACH,
+          'H|no-rdns' => \$NORDNS,
           ) || &usage;
 
 # detaint the commandline
@@ -175,6 +180,7 @@
         $groups .= " $gid";
     }
 }
+endgrent;
 $) = $groups;
 POSIX::setgid($qgid) or
       die "unable to change gid: $!\n";
@@ -279,7 +285,7 @@
        Net::DNS::Header::nextid();
     }
   
-    close($server);
+    close $_ for $select->handles;
   
     $SIG{$_} = 'DEFAULT' for keys %SIG;
     $SIG{ALRM} = sub { 
@@ -291,6 +297,13 @@
     # my ($port, $iaddr) = sockaddr_in($hisaddr);
     $ENV{TCPREMOTEIP} = $nto_iaddr;
 
+    if ($NORDNS) {
+      $ENV{TCPREMOTEHOST} = $ENV{TCPREMOTEIP} ? "[$ENV{TCPREMOTEIP}]" : 
"[noip!]";
+    }
+    else {
+      my $zero = $0;
+      $0 = "$zero (gethostbyname $ENV{TCPREMOTEIP})";
+
     if ($server->sockdomain == AF_INET) {
       $ENV{TCPREMOTEHOST} = gethostbyaddr($iaddr, AF_INET) || "Unknown";
     }
@@ -299,6 +312,9 @@
       $ENV{TCPREMOTEHOST} = $canonname || "Unknown";
     }
 
+      $0 = $zero;
+    }
+
     # don't do this!
     #$0 = "qpsmtpd-forkserver: $ENV{TCPREMOTEIP} / $ENV{TCPREMOTEHOST}";
   
@@ -307,6 +323,7 @@
     # dup to STDIN/STDOUT
     POSIX::dup2(fileno($client), 0);
     POSIX::dup2(fileno($client), 1);
+    close $client;
     
     $qpsmtpd->start_connection
       (

Reply via email to