home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_26_1.lzh / support / proxy < prev    next >
Text File  |  1998-07-31  |  5KB  |  199 lines

  1. #!/bin/perl -w
  2. # $Id: proxy,v 2.4 1998/07/31 09:39:52 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 a4 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. $SOMAXCONN = eval { &SOMAXCONN } || 16;
  34. $INADDR_ANY = eval { &INADDR_ANY } || "\0\0\0\0";
  35. $SOL_SOCKET = eval { &SOL_SOCKET};
  36. $SO_REUSEADDR = eval { &SO_REUSEADDR };
  37. $SO_KEEPALIVE = eval { &SO_KEEPALIVE };
  38.  
  39. $'rin = '';
  40.  
  41. $handle = 0;
  42.  
  43. $SIG{'PIPE'} = 'IGNORE' if &'exist(&'list(keys(%SIG)), 'PIPE');
  44.  
  45. &main(@ARGV);
  46.  
  47. sub main {
  48.   local(@args) = @_;
  49.   local($slist, $rout, $nf, $sno, $cno, $lno, $socket, $tmp);
  50.   if (@args < 3) {
  51.     &usage();
  52.     exit(1);
  53.   }
  54.   $lno = &'listen($args[2], 0) || die "cannot listen port\n";
  55.   for (;;) {
  56.     $nf = select($rout = $'rin, undef, undef, undef);
  57.     die "error in select\n" if $nf < 0;
  58.     foreach $no (&'array($slist)) {
  59.       next unless vec($rout, $no, 1);
  60.       $tmp = '';
  61.       if (sysread($'socket[$no], $tmp, $READSIZE)) {
  62.         $socket = $'socket[$peer[$no]];
  63.         print $socket $tmp if fileno($socket);
  64.       } else {
  65.         &'close($no);
  66.         &'close($peer[$no]);
  67.         $slist = &'remove($slist, $no, $peer[$no]);
  68.       }
  69.     }
  70.     if (vec($rout, $lno, 1)) {
  71.       if ($cno = &'accept($lno)) {
  72.         if ($sno = &'connect($args[0], $args[1])) {
  73.           $peer[$sno] = $cno;
  74.           $peer[$cno] = $sno;
  75.           $slist = &'add($slist, $sno, $cno);
  76.         } else {
  77.           &'close($cno);
  78.         }
  79.       }
  80.     }
  81.   }
  82. }
  83.  
  84. sub usage {
  85.   print 'usage: perl proxy <server> <port> <listen-port>', "\n";
  86. }
  87.  
  88. sub 'connect {
  89.   local($host, $port) = @_;
  90.   local($serverno, $socket, $addr);
  91.   if ($host =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) {
  92.     $addr = pack('C4', $1, $2, $3, $4);
  93.   } elsif ($host =~ /^\d+$/) {
  94.     $addr = pack('N', $host);
  95.   } else {
  96.     $addr = (gethostbyname($host))[4];
  97.   }
  98.   return 0 unless $addr;
  99.   $socket = '\'S' . ++$handle;
  100.   socket($socket, $PF_INET, $SOCK_STREAM, $PROTO) || return 0;
  101.   connect($socket, pack($SOCKADDR, $AF_INET, $port, $addr)) || return 0;
  102.   $serverno = fileno($socket);
  103.   vec($'rin, $serverno, 1) = 1;
  104.   $'socket[$serverno] = $socket;
  105.   select((select($socket), $| = 1)[0]);
  106.   $'access[$serverno] = time();
  107.   return $serverno;
  108. }
  109.  
  110. sub 'listen {
  111.   local($port, $count) = @_;
  112.   local($listenno, $socket);
  113.   $socket = '\'L' . ++$handle;
  114.   socket($socket, $PF_INET, $SOCK_STREAM, $PROTO) || return 0;
  115.   if (defined($SOL_SOCKET)) {
  116.     setsockopt($socket, $SOL_SOCKET, $SO_REUSEADDR, pack('l', 1)) if defined($SO_REUSEADDR);
  117.     setsockopt($socket, $SOL_SOCKET, $SO_KEEPALIVE, pack('l', 1)) if defined($SO_KEEPALIVE);
  118.   }
  119.   bind($socket, pack($SOCKADDR, $AF_INET, $port, $INADDR_ANY)) || return 0;
  120.   listen($socket, $count || $SOMAXCONN) || return 0;
  121.   $listenno = fileno($socket);
  122.   vec($'rin, $listenno, 1) = 1;
  123.   $'socket[$listenno] = $socket;
  124.   select((select($socket), $| = 1)[0]);
  125.   $'access[$listenno] = time();
  126.   return $listenno;
  127. }
  128.  
  129. sub 'accept {
  130.   local($listenno) = @_;
  131.   local($clientno, $socket);
  132.   $socket = '\'C' . ++$handle;
  133.   accept($socket, $'socket[$listenno]) || return 0;
  134.   $clientno = fileno($socket);
  135.   vec($'rin, $clientno, 1) = 1;
  136.   $'socket[$clientno] = $socket;
  137.   select((select($socket), $| = 1)[0]);
  138.   $'access[$clientno] = time();
  139.   return $clientno;
  140. }
  141.  
  142. sub 'close {
  143.   local($no) = @_;
  144.   close($'socket[$no]);
  145.   vec($'rin, $no, 1) = 0;
  146. }
  147.  
  148. sub 'add {
  149.   local($list, @items) = @_;
  150.   $list = $NIL unless $list;
  151.   foreach $item (@items) {
  152.     next if &'exist($list, $item);
  153.     $list = $list . $item . $NIL;
  154.   }
  155.   $list = '' if $list eq $NIL;
  156.   return $list;
  157. }
  158.  
  159. sub 'remove {
  160.   local($list, @items) = @_;
  161.   local($idx);
  162.   $list = $NIL unless $list;
  163.   foreach $item (@items) {
  164.     $idx = index("\L$list\E", $NIL . "\L$item\E" . $NIL);
  165.     next if $idx == -1;
  166.     substr($list, $idx, length($NIL . $item . $NIL)) = $NIL;
  167.   }
  168.   $list = '' if $list eq $NIL;
  169.   return $list;
  170. }
  171.  
  172. sub 'exist {
  173.   local($list, @items) = @_;
  174.   return 0 unless $list;
  175.   foreach $item (@items) {
  176.     return 1 if index("\L$list\E", $NIL . "\L$item\E" . $NIL) != -1;
  177.   }
  178.   return 0;
  179. }
  180.  
  181. sub 'list {
  182.   local(@array) = @_;
  183.   local($list);
  184.   if (scalar(@array)) {
  185.     $list = $NIL . join($NIL, @array) . $NIL;
  186.   } else {
  187.     $list = '';
  188.   }
  189.   return $list;
  190. }
  191.  
  192. sub 'array {
  193.   local($list) = @_;
  194.   $list = $NIL unless $list;
  195.   return () if $list eq $NIL;
  196.   $list = substr($list, 1, length($list) - 2);
  197.   return split(/$NIL/, $list);
  198. }
  199.