home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / languages / perl / tutorial / eg / uuhostd < prev    next >
Encoding:
Text File  |  1990-02-07  |  4.0 KB  |  166 lines

  1. #!/usr/bin/perl 
  2. #
  3. # uuhostd -- sit around accepting TCP connections
  4. #         backend for uuhost and uupath
  5. #
  6.  
  7. do 'ctime.pl'      || die "Can't do ctime.pl: $@";
  8. do 'syslog.pl'     || die "Can't do syslog.pl: $@";
  9. do 'sys/socket.pl' || die "Can't do sys/socket.pl: $@"; 
  10.  
  11. ($program = $0) =~ s%.*/%%;
  12. $version = 0.1;
  13. $prompt = "$program> ";
  14. chop($host = `hostname`);
  15.  
  16. do openlog("$program $$",'user');
  17.  
  18. if ($#ARGV > $[) {
  19.     if ($ARGV[0] =~ /^-/ && $#ARGV != $[) {
  20.     print STDERR "usage: $program [portno]\n";
  21.     exit 1;
  22.     } 
  23.     $port = $ARGV[0];
  24. } else {
  25.     (($name, $aliases, $port, $proto) = getservbyname('uupath', 'tcp'))
  26.         || die "no tcp service for \"uupath\"";
  27.  
  28.  
  29. ###########################################################################
  30. # setup server
  31.  
  32. $sockaddr = 'S n a4 x8';
  33. ($name, $aliases, $proto) = getprotobyname('tcp');
  34.  
  35. $this = pack($sockaddr, $AF_INET, $port, "\0\0\0\0");
  36. select(CLIENT); $| = 1; select(stdout);
  37.  
  38. socket(SERVER, $PF_INET, $SOCK_STREAM, $proto) || die "socket: $!";
  39.  
  40. bind(SERVER, $this) || die "bind: $!";
  41.  
  42. listen(SERVER, 5) || die "connect: $!";
  43.  
  44. select(SERVER); $| = 1; select(stdout);
  45. ###########################################################################
  46.  
  47.  
  48. $SIG{'INT'} = 'shutdown';
  49. $SIG{'TERM'} = 'shutdown';
  50. $SIG{'HUP'} = 'shutdown';
  51.  
  52. &syslog('debug','startup');
  53.  
  54. ###########################################################################
  55. # spawn kids for incoming connections
  56. #
  57. CONNECTION: for (;;) {
  58.  
  59.     ($addr = accept(CLIENT,SERVER)) || die $!;
  60.     ($af,$port,$inetaddr) = unpack($sockaddr,$addr);
  61.     @inetaddr = unpack('C4',$inetaddr);
  62.     ($name) = gethostbyaddr($inetaddr,$AF_INET);
  63.  
  64.     if (fork) {
  65.     close CLIENT;
  66.     next CONNECTION;
  67.     } 
  68.  
  69. ###########################################################################
  70. # am now the child server
  71.  
  72.     do syslog('info',"connect from %s (%d.%d.%d.%d)",
  73.     $name, $inetaddr[0], $inetaddr[1], $inetaddr[2], $inetaddr[3]); 
  74.  
  75.     open(STDOUT,">&CLIENT");
  76.     open(STDERR,">&CLIENT");
  77.     select(CLIENT);
  78.  
  79.  
  80.     printf "\n%s %s v%3.1f ready at %s",$host,$program,$version,&ctime(time);
  81.     print "Type \"help\" for help.\n";
  82.     print $prompt;
  83.  
  84. ###########################################################################
  85. # service each request
  86. #
  87. REQUEST:
  88.     while (<CLIENT>) {
  89.     chop if chop eq "\r";
  90.     last REQUEST if !$_ || $_ eq "\004";
  91.  
  92.     ($cmd, @args) = split;
  93.  
  94.     if      ( 'path' =~ /^$cmd/i ) {
  95.         do findpath();
  96.     } elsif ( 'host' =~ /^$cmd/i ) {
  97.         do findhost();
  98.     } elsif ( 'help' =~ /^$cmd/i ) {
  99.         do givehelp();
  100.     } elsif ( 'hello' =~ /^$cmd/i || 'helo' =~ /^$cmd/i) {
  101.         do sayhello();
  102.     } elsif ( 'quit' =~ /^$cmd/i ) {
  103.         print "Goodbye.\n";
  104.         last REQUEST;
  105.     } else {
  106.         print "Unrecognized command: $cmd\n";
  107.         print "Type \"help\" for help.\n";
  108.     } 
  109.  
  110.     print $prompt;
  111.  
  112.      }
  113.      close CLIENT;
  114.      exit 0;
  115. }
  116.  
  117. ###########################################################################
  118. sub shutdown {
  119.     do syslog('debug','shutdown');
  120.     shutdown(CLIENT,2);  # seems prudent
  121.     shutdown(SERVER,2);
  122.     close CLIENT;
  123.     close SERVER;
  124.     exit 0;
  125.  
  126. ###########################################################################
  127. sub sayhello {
  128.     printf "hello %s, pleased to meet you!\n", $args[0];
  129.     do syslog('debug', "HELO $args[0]");
  130.  
  131. ###########################################################################
  132. sub findpath {
  133.     do syslog('info',"PATH @args");
  134.     do runprog('/usr/local/bin/show');
  135.  
  136. ###########################################################################
  137. sub findhost {
  138.     do syslog('info',"HOST @args");
  139.     do runprog('/usr/local/bin/uuhosts');
  140.  
  141. ###########################################################################
  142. sub givehelp {
  143.     print "Commands are: HOST HELP HELO PATH QUIT\n";
  144.     do syslog('debug','HELP');
  145.  
  146. ###########################################################################
  147. sub runprog {
  148.     local($pathname) = @_;
  149.     local($msg);
  150.  
  151.     print "$pathname @args\n";
  152.  
  153.     if (system $pathname,@args) {
  154.     $msg = sprintf("\"$pathname @args\" returned %d\n", $? >> 8);
  155.     printf $msg;
  156.     do syslog('notice', $msg);
  157.     } 
  158.     print ".\n";
  159. }
  160.