-my ($ldap, $mesg, $dn, $entries, $data, %output, $key, $hostlist, $hostdetails, $selected, %summary);
+$SIG{__DIE__} = \&DieHandler;
+$SIG{INT} = \&DieHandler;
+$SIG{CHLD} = \&Reaper;
+
+&help if (defined($opts{h}));
+#my $logfh = STDOUT; #TODO
+
+&log("Binding to LDAP server at $config{ldaphost}") if (defined($opts{v}));
+my $ldap = Net::LDAP->new($config{ldaphost}) || die $1;
+$ldap->bind;
+
+if ($use_inetd == 0) {
+ &log("Binding to port 79") if (defined($opts{v}));
+ my $server = IO::Socket::INET->new(Proto => 'tcp',
+ LocalPort => 'finger(79)',
+ Listen => SOMAXCONN,
+ Reuse => 1);
+
+ die "Cannot listen on finger port" unless $server;
+ &log("[Server listening for connections]");
+
+ my ($pid, $client, $hostinfo);
+
+ while ($client = $server->accept()) {
+ &log("Forking to handle client request") if (defined($opts{v}));
+ next if $pid = fork; # parent
+ die "fork: $!" unless defined $pid;
+
+ # child
+ $client->autoflush(1);
+ my $hostinfo = gethostbyaddr($client->peeraddr, AF_INET);
+ &log(sprintf("[Connect from %s]", $hostinfo || $client->peerhost));
+ my $query = <$client>;
+ &ProcessQuery($client, $query);
+ $client->close;
+ exit;
+ } continue {
+ $client->close;
+ }
+} else { # inetd
+ $opts{q} = 1; # Temp, until i figure out wth tcpd doesn't pass parameters to this program properly
+ &log("inetd mode");
+ my $sockaddr = getpeername(STDIN);
+ my ($port, $addr) = unpack_sockaddr_in(getpeername(STDIN));
+ &log(sprintf("[Connect from %s (%s)]", gethostbyaddr($addr, AF_INET), inet_ntoa($addr)));
+ my $query = <STDIN>;
+ &ProcessQuery(\*STDOUT, $query);
+ exit;
+}
+
+$ldap->unbind;
+