home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_15_2.lzh / module / ctcp / dcc / gate.plm < prev    next >
Text File  |  1997-12-22  |  7KB  |  224 lines

  1. # <!-- -*- perl -*-
  2. # $Id: gate.plm,v 2.3 1997/12/23 00:14:41 hasegawa Exp $
  3. # copyright (c)1997 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. package ctcp_dcc_gate;
  6.  
  7. $READSIZE = 4096;
  8. $REPLYSIZE = 4;
  9. $CLIENTINFO = 'DCC';
  10. $SOCKADDR = 'S n N x8';
  11.  
  12. $_ = 'ctcp_dcc_gate';
  13.  
  14. sub main_loop {
  15.   foreach $dccclientno (&'array($dccclientlist)) {
  16.     &dcc_client($dccclientno) if vec($'rout, $dccclientno, 1);
  17.   }
  18.   foreach $dccserverno (&'array($dccserverlist)) {
  19.     &dcc_server($dccserverno) if vec($'rout, $dccserverno, 1);
  20.   }
  21.   foreach $dcclistenno (&'array($dcclistenlist)) {
  22.     &dcc_accept($dcclistenno) if vec($'rout, $dcclistenno, 1);
  23.   }
  24. }
  25.  
  26. sub cpss_dcc {
  27.   local($serverno, $prefix, $cmd, $msg) = @_;
  28.   local($userno, $regex, @params);
  29.   $userno = $'userno[$serverno];
  30.   foreach $not (&'property($userno, 'not')) {
  31.     $regex = &'regex($not);
  32.     return ($prefix, $cmd, $msg) if $prefix =~ /$regex/i;
  33.   }
  34.   foreach $user (&'property($userno, 'user')) {
  35.     $regex = &'regex($user);
  36.     next unless $prefix =~ /$regex/i;
  37.     @params = &server_gate($serverno, $prefix, split(/\s+/, $msg));
  38.     if (@params) {
  39.       return ($prefix, $cmd, join(' ', @params));
  40.     } else {
  41.       return ();
  42.     }
  43.   }
  44.   return ($prefix, $cmd, $msg)
  45. }
  46.  
  47. sub cpsp_dcc {
  48.   local($serverno, $prefix, $cmd, $msg) = @_;
  49.   local($userno, $regex, @params);
  50.   $userno = $'userno[$serverno];
  51.   foreach $not (&'property($userno, 'not')) {
  52.     $regex = &'regex($not);
  53.     return ($prefix, $cmd, $msg) if $prefix =~ /$regex/i;
  54.   }
  55.   foreach $user (&'property($userno, 'user')) {
  56.     $regex = &'regex($user);
  57.     if ($prefix =~ /$regex/i) {
  58.       @params = &client_gate($serverno, $prefix, split(/\s+/, $msg));
  59.       if (@params) {
  60.         return ($prefix, $cmd, join(' ', @params));
  61.       } else {
  62.         return ();
  63.       }
  64.     }
  65.   }
  66.   return ($prefix, $cmd, $msg);
  67. }
  68.  
  69. sub dcc_client {
  70.   local($dccclientno) = @_;
  71.   local($input, $output, $tmp);
  72.   $input = $'socket[$dccclientno];
  73.   $tmp = '';
  74.   if (sysread($input, $tmp, $REPLYSIZE)) {
  75.     $output = $'socket[$dccpeer[$dccclientno]];
  76.     print $output $tmp if fileno($output);
  77.   } else {
  78.     &'close($dccclientno);
  79.     $dccclientlist = &'remove($dccclientlist, $dccclientno);
  80.   }
  81. }
  82.  
  83. sub dcc_server {
  84.   local($dccserverno) = @_;
  85.   local($input, $output, $tmp);
  86.   $input = $'socket[$dccserverno];
  87.   $tmp = '';
  88.   if (sysread($input, $tmp, $READSIZE)) {
  89.     $output = $'socket[$dccpeer[$dccserverno]];
  90.     print $output $tmp if fileno($output);
  91.   } else {
  92.     &'close($dccserverno);
  93.     $dccserverlist = &'remove($dccserverlist, $dccserverno);
  94.   }
  95. }
  96.  
  97. sub dcc_accept {
  98.   local($dcclistenno) = @_;
  99.   local($dccclientno, $dccserverno);
  100.   if ($dccclientno = &'accept($dcclistenno)) {
  101.     $dccserverno = $dccpeer[$dcclistenno];
  102.     $dccpeer[$dccclientno] = $dccserverno;
  103.     $dccpeer[$dccserverno] = $dccclientno;
  104.     vec($'rin, $dcclistenno, 1) = 0;
  105.     $dcclistenlist = &'remove($dcclistenlist, $dcclistenno);
  106.     $dccclientlist = &'add($dccclientlist, $dccclientno);
  107.     $dccserverlist = &'add($dccserverlist, $dccserverno);
  108.   }
  109.   &'close($dcclistenno);
  110. }
  111.  
  112. sub server_gate {
  113.   local($serverno, $prefix, @params) = @_;
  114.   local($dccsereverno, $dcclistenno, $host, $port);
  115.   if ($params[0] eq 'SEND') {
  116.     if ($dcclistenno = &'listen(0, 1)) {
  117.       if (!($dccserverno = &'connect($params[2], $params[3]))) {
  118.         &'close($dcclistenno);
  119.         return @params;
  120.       }
  121.       $dcclistenlist = &'add($dcclistenlist, $dcclistenno);
  122.       $dccpeer[$dcclistenno] = $dccserverno;
  123.       $params[3] = (unpack($SOCKADDR, getsockname($'socket[$dcclistenno])))[1];
  124.       foreach $cno (&'array($'clientlist)) {
  125.         next unless $'avail[$cno];
  126.         next unless $'userno[$cno] == $'userno[$serverno];
  127.         $params[2] = (unpack($SOCKADDR, getsockname($'socket[$cno])))[2];
  128.         &'c_print($cno, $prefix, 'PRIVMSG', $'nick[$cno], "\cA" . join(' ', 'DCC', @params) . "\cA");
  129.       }
  130.       return ();
  131.     }
  132.   } elsif ($params[0] eq 'CANCEL') {
  133.     $host = (unpack($SOCKADDR, getsockname($'socket[$serverno])))[2];
  134.     if ($host == $params[2]) {
  135.       foreach $lno (&'array($dcclistenlist)) {
  136.         $port = (unpack($SOCKADDR, getsockname($'socket[$lno])))[1];
  137.         next unless $port == $params[3];
  138.         &'close($lno);
  139.         $dcclistenlist = &'remove($dcclistenlist, $lno);
  140.         &'close($dccpeer[$lno]);
  141.         return ();
  142.       }
  143.     }
  144.   }
  145.   return @params;
  146. }
  147.  
  148. sub client_gate {
  149.   local($serverno, $prefix, @params) = @_;
  150.   local($dccsereverno, $dcclistenno, $host, $port);
  151.   if ($params[0] eq 'SEND') {
  152.     if ($dcclistenno = &'listen(0, 1)) {
  153.       if (!($dccserverno = &'connect($params[2], $params[3]))) {
  154.         &'close($dcclistenno);
  155.         return @params;
  156.       }
  157.       $dcclistenlist = &'add($dcclistenlist, $dcclistenno);
  158.       $dccpeer[$dcclistenno] = $dccserverno;
  159.       $params[2] = (unpack($SOCKADDR, getsockname($'socket[$dccserverno])))[2];
  160.       $params[3] = (unpack($SOCKADDR, getsockname($'socket[$dcclistenno])))[1];
  161.       return @params;
  162.     }
  163.   } elsif ($params[0] eq 'CANCEL') {
  164.     foreach $lno (&'array($dcclistenlist)) {
  165.       $port = (unpack($SOCKADDR, getsockname($'socket[$lno])))[1];
  166.       next unless $port == $params[3];
  167.       foreach $cno (&'array($'clientlist)) {
  168.         next unless $'avail[$cno];
  169.         next unless $'userno[$cno] == $'userno[$serverno];
  170.         $host = (unpack($SOCKADDR, getsockname($'socket[$cno])))[2];
  171.         next unless $host == $params[2];
  172.         &'close($lno);
  173.         $dcclistenlist = &'remove($dcclistenlist, $lno);
  174.         &'close($dccpeer[$lno]);
  175.         return ();
  176.       }
  177.     }
  178.   }
  179.   return @params;
  180. }
  181.  
  182. __END__
  183. --><!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
  184. <HTML><HEAD><TITLE> ctcp/dcc.gate.plm </TITLE></HEAD><BODY>
  185.  
  186. $B%*%s%i%$%s%I%-%e%a%s%H(B
  187.  
  188.  
  189. <HR><H3> $BL>A0(B </H3>
  190.  
  191. ctcp/dcc/gate.plm - CTCP DCC SEND$B$KH?1~$7$FE>Aw$NCf7Q$r9T$&(B
  192.  
  193.  
  194. <HR><H3> $B@bL@(B </H3>
  195.  
  196. CTCP DCC SNED$B$,Aw$i$l$F$-$?$H$-!"(B
  197. $BAw$j85$H%/%i%$%"%s%H$N4V$N%U%!%$%k$NAw<u?.$NCf7Q$r9T$$$^$9!#(B
  198.  
  199.  
  200. <HR><H3> $B%W%m%Q%F%#(B </H3>
  201.  
  202. <DL>
  203. <DT> ctcp.dcc.gate.not* $B%f!<%6%^%9%/(B
  204. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i!"(B
  205.         $BE>Aw$NCf7Q$O$7$^$;$s!#(B
  206. <DT> ctcp.dcc.gate.user* $B%f!<%6%^%9%/(B
  207. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i!"(B
  208.         $BE>Aw$NCf7Q$r$7$^$9!#(B
  209. </DL>
  210.  
  211.  
  212. <HR><H3> $B@_DjNc(B </H3>
  213.  
  214. <PRE>
  215. + ctcp/dcc/gate.plm
  216. ctcp.dcc.gate.not: *!*@*.nagoya-u.ac.jp
  217. ctcp.dcc.gate.user: *!*@*
  218. </PRE>
  219.  
  220. $B%U%!%$%k$rAw$C$F$-$??M$,!V(B*!*@*.nagoya-u.ac.jp$B!W$K%^%C%A$7$J$1$l$P!"(B
  221. $BE>Aw$NCf7Q$r9T$$$^$9!#(B
  222.  
  223. </BODY></HTML>
  224.