home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_28_2.lzh / support / client next >
Text File  |  1998-10-15  |  3KB  |  129 lines

  1. #!/bin/perl -w
  2. # $Id: client,v 2.9 1998/10/06 04:23:49 hasegawa Exp $
  3. # copyright (c)1997-1998 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. if ($] < 5) {
  6.   foreach $inc (@INC) {
  7.     if (-r "$inc/sys/socket.ph") {
  8.       eval { require 'sys/socket.ph' };
  9.       $SOCKET = "$inc/sys/socket.ph" unless $@;
  10.       last;
  11.     }
  12.     if (-r "$inc/socket.ph") {
  13.       eval { require 'socket.ph' };
  14.       $SOCKET = "$inc/socket.ph" unless $@;
  15.       last;
  16.     }
  17.   }
  18. } else {
  19.   eval 'use Socket';
  20.   $SOCKET = 'Socket.pm' unless $@;
  21. }
  22.  
  23. $NIL = $;;
  24.  
  25. $READSIZE = 1024;
  26. $SOCKADDR = 'S n N x8';
  27.  
  28. $PROTO = getprotobyname('tcp');
  29.  
  30. $AF_INET = eval { &AF_INET } || 2;
  31. $PF_INET = eval { &PF_INET } || 2;
  32. $SOCK_STREAM = eval { &SOCK_STREAM } || 1;
  33.  
  34. $'rin = '';
  35.  
  36. $handle = 0;
  37.  
  38. select((select(STDOUT), $| = 1)[0]);
  39.  
  40. $SIG{'PIPE'} = 'IGNORE' if &'exist(&'list(keys(%SIG)), 'PIPE');
  41.  
  42. &main(@ARGV);
  43.  
  44. sub main {
  45.   local(@args) = @_;
  46.   local($rout, $sno, $stdin, $socket, $nf, $tmp);
  47.   if (@args < 2) {
  48.     &usage();
  49.     exit(1);
  50.   }
  51.   $sno = &'connect($args[0], $args[1]) || die "cannot connect to server\n";
  52.   $socket = $'socket[$sno];
  53.   $stdin = fileno(STDIN);
  54.   vec($'rin, $stdin, 1) = 1;
  55.   for (;;) {
  56.     $nf = select($rout = $'rin, undef, undef, undef);
  57.     if (vec($rout, $sno, 1)) {
  58.       $tmp = '';
  59.       if (sysread($socket, $tmp, $READSIZE)) {
  60.         print STDOUT $tmp;
  61.       } else {
  62.         &'close($sno);
  63.         exit(0);
  64.       }
  65.     } elsif (vec($rout, $stdin, 1)) {
  66.       $tmp = '';
  67.       if (sysread(STDIN, $tmp, $READSIZE)) {
  68.         print $socket $tmp;
  69.       } else {
  70.         &'close($sno);
  71.         exit(0);
  72.       }
  73.     }
  74.   }
  75. }
  76.  
  77. sub usage {
  78.   print 'usage: perl client <server> <port>', "\n";
  79. }
  80.  
  81. sub 'connect {
  82.   local($host, $port) = @_;
  83.   local($serverno, $socket, $ip, @addr, $name);
  84.   if ($host =~ /^\d+$/) {
  85.     $ip = $host;
  86.   } elsif ($host =~ /^[\d\.]+$/) {
  87.     @addr = split(/\./, $host);
  88.     $ip = unpack('N', pack('C4', @addr, 0, 0, 0));
  89.   } else {
  90.     $ip = unpack('N', (gethostbyname($host))[4] || "\0\0\0\0");
  91.   }
  92.   return 0 unless $ip;
  93.   $socket = '\'S' . ++$handle;
  94.   socket($socket, $PF_INET, $SOCK_STREAM, $PROTO) || return 0;
  95.   $name = pack($SOCKADDR, $AF_INET, $port, $ip);
  96.   connect($socket, $name) || return 0;
  97.   $serverno = fileno($socket);
  98.   vec($'rin, $serverno, 1) = 1;
  99.   $'socket[$serverno] = $socket;
  100.   select((select($socket), $| = 1)[0]);
  101.   return $serverno;
  102. }
  103.  
  104. sub 'close {
  105.   local($no) = @_;
  106.   close($'socket[$no]);
  107.   vec($'rin, $no, 1) = 0;
  108. }
  109.  
  110. sub 'exist {
  111.   local($list, @items) = @_;
  112.   return 0 unless $list;
  113.   foreach $item (@items) {
  114.     return 1 if index("\L$list\E", $NIL . "\L$item\E" . $NIL) != -1;
  115.   }
  116.   return 0;
  117. }
  118.  
  119. sub 'list {
  120.   local(@array) = @_;
  121.   local($list);
  122.   if (scalar(@array)) {
  123.     $list = $NIL . join($NIL, @array) . $NIL;
  124.   } else {
  125.     $list = '';
  126.   }
  127.   return $list;
  128. }
  129.