#!/usr/bin/perl

########################################################################
#
# pmfingerd Ver 2.1 beta2
#
# Portmaster   : ComOS 3.3.1
#
#######################################################################
require 'pm.pl';
use Socket;

$FingerPort = 79;
$| = 1;

# I-Netd or Daemon?
# &Connection;
# exit;

#######

# Setup Server
$SockAddr = 'S n a4 x8';
$Proto    = (getprotobyname('tcp'))[2];
$Local    = pack($SockAddr, 2, $FingerPort, "\0\0\0\0");
socket(LS, &AF_INET, &SOCK_STREAM, $proto) || die "socket: $@";
do {
	print "."; 
	sleep 1;
} until bind(LS, $Local);

listen(LS, 5); 
select(LS); 
$| = 1; 
select(STDOUT);

while (1) {
  print "Listening\n";
  $Remote = accept(NS, LS);
  if ($Child = fork) {
     # Parent?
     print STDERR "Child Forked\n";
  } else {
     open(STDIN, "<& NS");
     open(STDOUT, ">& NS"); 
     select(STDOUT); $| = 1;
     &Connection;
     close(STDIN);
     close(STDOUT);
     exit;
  }
}

# -------
sub Connection {
  ($Host = <STDIN>) =~ s/[\r\n]//g;


  $Pass = $Password;
  $| = 1;
  print "[Portmaster Sessions on $Host]\n";

  print STDERR "Connected to [$Host]\n";
  portmaster::Connect("$Host", $Pass);

  for ($Cnt = 0; $Cnt <= 29; $Cnt++) {
    &portmaster::Who("$Cnt");
    printf STDOUT "S%2d %10s %15s %12s %15s %4d\n", 
      $Cnt, $PortValue{$Cnt, USERNAME}, $PortValue{$Cnt, FRAMED_ADDR}, 
      $PortValue{$Cnt, PORT_TYPE}, $PortValue{$Cnt, STATUS},
      $PortValue{$Cnt, IDLETIME};
  }

  close(portmaster::DS);
}
