home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 1.x / plum10b9.lzh / plum10b9 / dccgate.plm < prev    next >
Text File  |  1997-06-30  |  3KB  |  116 lines

  1. package dccgate;
  2.  
  3. $DCCREADSIZE = 4096;
  4. $DCCREPLYSIZE = 4;
  5.  
  6. $_ = 'dccgate';
  7.  
  8. sub main_loop {
  9.   foreach $dccclientno (&'array($dccclientlist || $;)) {
  10.     &dcc_client($dccclientno) if vec($'rout, $dccclientno, 1);
  11.   }
  12.   foreach $dccserverno (&'array($dccserverlist || $;)) {
  13.     &dcc_server($dccserverno) if vec($'rout, $dccserverno, 1);
  14.   }
  15.   foreach $dcclistenno (&'array($dcclistenlist || $;)) {
  16.     &dcc_accept($dcclistenno) if vec($'rout, $dcclistenno, 1);
  17.   }
  18. }
  19.  
  20. sub xss_dcc {
  21.   local($serverno, $prefix, $cmd, @params) = @_;
  22.   @params = &gateway(@params);
  23.   if (scalar(@params) > 0) {
  24.     return ($prefix, $cmd, @params);
  25.   } else {
  26.     return ();
  27.   }
  28. }
  29.  
  30. sub xsp_dcc {
  31.   local($serverno, $prefix, $cmd, @params) = @_;
  32.   @params = &gateway(@params);
  33.   if (scalar(@params) > 0) {
  34.     return ($prefix, $cmd, @params);
  35.   } else {
  36.     return ();
  37.   }
  38. }
  39.  
  40. sub dcc_client {
  41.   local($dccclientno) = @_;
  42.   local($input, $output, $tmp);
  43.   $input = "'$'socket[$dccclientno]";
  44.   $tmp = '';
  45.   if (sysread($input, $tmp, $DCCREPLYSIZE)) {
  46.     $output = "'$'socket[$dccpeer[$dccclientno]]";
  47.     print $output $tmp if fileno($output);
  48.   } else {
  49.     &'close($dccclientno);
  50.     vec($'rin, $dccclientno, 1) = 0;
  51.     $dccclientlist = &'remove($dccclientlist, $dccclientno);
  52.   }
  53. }
  54.  
  55. sub dcc_server {
  56.   local($dccserverno) = @_;
  57.   local($input, $output, $tmp);
  58.   $input = "'$'socket[$dccserverno]";
  59.   $tmp = '';
  60.   if (sysread($input, $tmp, $DCCREADSIZE)) {
  61.     $output = "'$'socket[$dccpeer[$dccserverno]]";
  62.     print $output $tmp if fileno($output);
  63.   } else {
  64.     &'close($dccserverno);
  65.     vec($'rin, $dccserverno, 1) = 0;
  66.     $dccserverlist = &'remove($dccserverlist, $dccserverno);
  67.   }
  68. }
  69.  
  70. sub dcc_accept {
  71.   local($dcclistenno) = @_;
  72.   local($dccclientno, $dccserverno);
  73.   if ($dccclientno = &'accept($dcclistenno)) {
  74.     $dccserverno = $dccpeer[$dcclistenno];
  75.     $dccpeer[$dccclientno] = $dccserverno;
  76.     $dccpeer[$dccserverno] = $dccclientno;
  77.     vec($'rin, $dcclistenno, 1) = 0;
  78.     vec($'rin, $dccclientno, 1) = 1;
  79.     vec($'rin, $dccserverno, 1) = 1;
  80.     $dcclistenlist = &'remove($dcclistenlist, $dcclistenno);
  81.     $dccclientlist = &'add($dccclientlist || $;, $dccclientno);
  82.     $dccserverlist = &'add($dccserverlist || $;, $dccserverno);
  83.   }
  84.   &'close($dcclistenno);
  85. }
  86.  
  87. sub gateway {
  88.   local(@params) = @_;
  89.   local($dccserverno, $dcclistenno);
  90.   if ($params[0] eq 'SEND') {
  91.     if ($dcclistenno = &'listen(0, 1)) {
  92.       if ($dccserverno = &'connect($params[2], $params[3])) {
  93.         $dcclistenlist = &'add($dcclistenlist || $;, $dcclistenno);
  94.         vec($'rin, $dcclistenno, 1) = 1;
  95.         $dccpeer[$dcclistenno] = $dccserverno;
  96.         $params[2] = unpack('N', $'THISADDR);
  97.         $params[3] = $'port[$dcclistenno];
  98.       }
  99.     }
  100.   } elsif ($params[0] eq 'CANCEL') {
  101.     if ($params[2] == unpack('N', $'THISADDR)) {
  102.       foreach $dcclistenno (&'array($dcclistenlist)) {
  103.         next unless $params[3] == $'port[$dcclistenno];
  104.         &'close($dcclistenno);
  105.         $dccserverno = $dccpeer[$dcclistenno];
  106.         &'close($dccserverno);
  107.         vec($'rin, $dccserverno, 1) = 0;
  108.         $dccserverlist = &'remove($dccserverlist, $dccserverno);
  109.         return ();
  110.       }
  111.     }
  112.   }
  113.   return @params;
  114. }
  115.  
  116.