[svn:qpsmtpd] r681 - branches/0.3x/lib/Qpsmtpd

[email protected] Sat, 16 Dec 2006 01:30:33 -0800 (PST)
Newsgroups perl.cvs.qpsmtpd
Message-ID <[email protected]>
Author: hjp
Date: Sat Dec 16 01:30:32 2006
New Revision: 681

Modified:
   branches/0.3x/lib/Qpsmtpd/TcpServer.pm

Log:
Added support for (x)inetd.


Modified: branches/0.3x/lib/Qpsmtpd/TcpServer.pm
==============================================================================
--- branches/0.3x/lib/Qpsmtpd/TcpServer.pm	(original)
+++ branches/0.3x/lib/Qpsmtpd/TcpServer.pm	Sat Dec 16 01:30:32 2006
@@ -1,6 +1,7 @@
 package Qpsmtpd::TcpServer;
 use Qpsmtpd::SMTP;
 use Qpsmtpd::Constants;
+use Socket;
 
 @ISA = qw(Qpsmtpd::SMTP);
 use strict;
@@ -12,12 +13,25 @@
 sub start_connection {
     my $self = shift;
 
-    die "Qpsmtpd::TcpServer must be started by tcpserver\n"
-      unless $ENV{TCPREMOTEIP};
+    my ($remote_host, $remote_info, $remote_ip);
 
-    my $remote_host = $ENV{TCPREMOTEHOST} || ( $ENV{TCPREMOTEIP} ? "[$ENV{TCPREMOTEIP}]" : "[noip!]");
-    my $remote_info = $ENV{TCPREMOTEINFO} ? "$ENV{TCPREMOTEINFO}\@$remote_host" : $remote_host;
-    my $remote_ip   = $ENV{TCPREMOTEIP};
+    if ($ENV{TCPREMOTEIP}) {
+	# started from tcpserver (or some other superserver which
+	# exports the TCPREMOTE* variables.
+	$remote_ip   = $ENV{TCPREMOTEIP};
+	$remote_host = $ENV{TCPREMOTEHOST} || "[$remote_ip]";
+	$remote_info = $ENV{TCPREMOTEINFO} ? "$ENV{TCPREMOTEINFO}\@$remote_host" : $remote_host;
+    } else {
+	# Started from inetd or similar. 
+	# get info on the remote host from the socket.
+	# ignore ident/tap/...
+	my $hersockaddr    = getpeername(STDIN) 
+	    or die "getpeername failed: $0 must be called from tcpserver, (x)inetd or a similar program which passes a socket to stdin";
+	my ($port, $iaddr) = sockaddr_in($hersockaddr);
+	$remote_ip     = inet_ntoa($iaddr);
+	$remote_host    = gethostbyaddr($iaddr, AF_INET) || "[$remote_ip]";
+	$remote_info	= $remote_host;
+    }
     $self->log(LOGNOTICE, "Connection from $remote_info [$remote_ip]");
 
     # if the local dns resolver doesn't filter it out we might get