home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
- #
- # uuhostd -- sit around accepting TCP connections
- # backend for uuhost and uupath
- #
-
- do 'ctime.pl' || die "Can't do ctime.pl: $@";
- do 'syslog.pl' || die "Can't do syslog.pl: $@";
- do 'sys/socket.pl' || die "Can't do sys/socket.pl: $@";
-
- ($program = $0) =~ s%.*/%%;
- $version = 0.1;
- $prompt = "$program> ";
- chop($host = `hostname`);
-
- do openlog("$program $$",'user');
-
- if ($#ARGV > $[) {
- if ($ARGV[0] =~ /^-/ && $#ARGV != $[) {
- print STDERR "usage: $program [portno]\n";
- exit 1;
- }
- $port = $ARGV[0];
- } else {
- (($name, $aliases, $port, $proto) = getservbyname('uupath', 'tcp'))
- || die "no tcp service for \"uupath\"";
- }
-
-
- ###########################################################################
- # setup server
-
- $sockaddr = 'S n a4 x8';
- ($name, $aliases, $proto) = getprotobyname('tcp');
-
- $this = pack($sockaddr, $AF_INET, $port, "\0\0\0\0");
- select(CLIENT); $| = 1; select(stdout);
-
- socket(SERVER, $PF_INET, $SOCK_STREAM, $proto) || die "socket: $!";
-
- bind(SERVER, $this) || die "bind: $!";
-
- listen(SERVER, 5) || die "connect: $!";
-
- select(SERVER); $| = 1; select(stdout);
- ###########################################################################
-
-
- $SIG{'INT'} = 'shutdown';
- $SIG{'TERM'} = 'shutdown';
- $SIG{'HUP'} = 'shutdown';
-
- &syslog('debug','startup');
-
- ###########################################################################
- # spawn kids for incoming connections
- #
- CONNECTION: for (;;) {
-
- ($addr = accept(CLIENT,SERVER)) || die $!;
- ($af,$port,$inetaddr) = unpack($sockaddr,$addr);
- @inetaddr = unpack('C4',$inetaddr);
- ($name) = gethostbyaddr($inetaddr,$AF_INET);
-
- if (fork) {
- close CLIENT;
- next CONNECTION;
- }
-
- ###########################################################################
- # am now the child server
-
- do syslog('info',"connect from %s (%d.%d.%d.%d)",
- $name, $inetaddr[0], $inetaddr[1], $inetaddr[2], $inetaddr[3]);
-
- open(STDOUT,">&CLIENT");
- open(STDERR,">&CLIENT");
- select(CLIENT);
-
-
- printf "\n%s %s v%3.1f ready at %s",$host,$program,$version,&ctime(time);
- print "Type \"help\" for help.\n";
- print $prompt;
-
- ###########################################################################
- # service each request
- #
- REQUEST:
- while (<CLIENT>) {
- chop if chop eq "\r";
- last REQUEST if !$_ || $_ eq "\004";
-
- ($cmd, @args) = split;
-
- if ( 'path' =~ /^$cmd/i ) {
- do findpath();
- } elsif ( 'host' =~ /^$cmd/i ) {
- do findhost();
- } elsif ( 'help' =~ /^$cmd/i ) {
- do givehelp();
- } elsif ( 'hello' =~ /^$cmd/i || 'helo' =~ /^$cmd/i) {
- do sayhello();
- } elsif ( 'quit' =~ /^$cmd/i ) {
- print "Goodbye.\n";
- last REQUEST;
- } else {
- print "Unrecognized command: $cmd\n";
- print "Type \"help\" for help.\n";
- }
-
- print $prompt;
-
- }
- close CLIENT;
- exit 0;
- }
-
- ###########################################################################
- sub shutdown {
- do syslog('debug','shutdown');
- shutdown(CLIENT,2); # seems prudent
- shutdown(SERVER,2);
- close CLIENT;
- close SERVER;
- exit 0;
- }
-
- ###########################################################################
- sub sayhello {
- printf "hello %s, pleased to meet you!\n", $args[0];
- do syslog('debug', "HELO $args[0]");
- }
-
- ###########################################################################
- sub findpath {
- do syslog('info',"PATH @args");
- do runprog('/usr/local/bin/show');
- }
-
- ###########################################################################
- sub findhost {
- do syslog('info',"HOST @args");
- do runprog('/usr/local/bin/uuhosts');
- }
-
- ###########################################################################
- sub givehelp {
- print "Commands are: HOST HELP HELO PATH QUIT\n";
- do syslog('debug','HELP');
- }
-
- ###########################################################################
- sub runprog {
- local($pathname) = @_;
- local($msg);
-
- print "$pathname @args\n";
-
- if (system $pathname,@args) {
- $msg = sprintf("\"$pathname @args\" returned %d\n", $? >> 8);
- printf $msg;
- do syslog('notice', $msg);
- }
- print ".\n";
- }
-