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 / module / ctcp / dcc / send.plm < prev   
Text File  |  1998-10-15  |  5KB  |  158 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: send.plm,v 2.4 1998/07/31 12:39:13 hasegawa Exp $
  3. # copyright (c)1998 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. package ctcp_dcc_send;
  6.  
  7. $READSIZE = 4096;
  8. $WRITESIZE = 4;
  9. $SOCKADDR = 'S n N x8';
  10. $TIMEOUT = 3600;
  11.  
  12. $_ = 'ctcp_dcc_send';
  13.  
  14. sub main_loop {
  15.   local($userno) = @_;
  16.   local($socket, $length, $size, $tmp, $cno);
  17.   foreach $cno (&'array($dccclientlist)) {
  18.     if (vec($'rout, $cno, 1)) {
  19.       &dcc_client($cno);
  20.       vec($'rout, $cno, 1) = 0;
  21.     } elsif (time() - $'access[$cno] > $TIMEOUT) {
  22.       &'close($cno);
  23.       $dccclientlist = &'remove($dccclientlist, $cno);
  24.       &'c_print($client[$cno], '', 'NOTICE', $'nick[$client[$cno]], "*** DCC sent file $file[$cno] ($done[$cno]/$size[$cno] bytes) to $nick[$cno]");
  25.     }
  26.   }
  27.   foreach $lno (&'array($dcclistenlist)) {
  28.     if (vec($'rout, $lno, 1)) {
  29.       &dcc_listen($lno);
  30.       vec($'rout, $lno, 1) = 0;
  31.     } elsif (time() - $'access[$lno] > $TIMEOUT) {
  32.       &'close($lno);
  33.       $dcclistenlist = &'remove($dcclistenlist, $lno);
  34.     }
  35.   }
  36. }
  37.  
  38. sub cs_send {
  39.   local($clientno, $prefix, $cmd, @params) = @_;
  40.   local($sno, $lno, $name, $size, $addr, $port, $file);
  41.   $sno = $'server[$clientno];
  42.   if ($params[1]) {
  43.     $file = &'expand($params[1]);
  44.     $size = (stat($file))[7];
  45.     if ($size) {
  46.       foreach $nick (split(/\,/, $params[0])) {
  47.         next unless $lno = &'listen(0, 1);
  48.         $name = $file;
  49.         $name =~ s/^.*[\\\/]([^\\\/]+)$/$1/;
  50.         $dcclistenlist = &'add($dcclistenlist, $lno);
  51.         $addr = (unpack($SOCKADDR, getsockname($'socket[$sno])))[2];
  52.         $port = (unpack($SOCKADDR, getsockname($'socket[$lno])))[1];
  53.         $file[$lno] = $file;
  54.         $size[$lno] = $size;
  55.         $nick[$lno] = $nick;
  56.         $client[$lno] = $clientno;
  57.         &'s_print($sno, $prefix, 'PRIVMSG', $nick, "\cA" . join(' ', 'DCC', 'SEND', $name, $addr, $port, $size) . "\cA");
  58.         &'c_print($clientno, '', 'NOTICE', $'nick[$clientno], "*** DCC SEND request file $file ($size bytes) to $nick");
  59.       }
  60.     }
  61.   }
  62.   return ();
  63. }
  64.  
  65. sub dcc_client {
  66.   local($cno) = @_;
  67.   local($tmp, $socket, $length);
  68.   $tmp = '';
  69.   $socket = $'socket[$cno];
  70.   if ($length = sysread($socket, $tmp, $WRITESIZE)) {
  71.     if (unpack('N', $tmp) == $done[$cno]) {
  72.       if ($done[$cno] == $size[$cno]) {
  73.         &'close($cno);
  74.         $dccclientlist = &'remove($dccclientlist, $cno);
  75.         &'c_print($client[$cno], '', 'NOTICE', $'nick[$client[$cno]], "*** DCC sent file $file[$cno] ($size[$cno] bytes) to $nick[$cno]");
  76.       } else {
  77.         &dcc_send($cno);
  78.       }
  79.     }
  80.   } else {
  81.     &'close($cno);
  82.     $dccclientlist = &'remove($dccclientlist, $cno);
  83.     &'c_print($client[$cno], '', 'NOTICE', $'nick[$client[$cno]], "*** DCC sent file $file[$cno] ($size[$cno] bytes) to $nick[$cno]");
  84.   }
  85. }
  86.  
  87. sub dcc_listen {
  88.   local($cno) = @_;
  89.   if ($cno = &'accept($lno)) {
  90.     $dccclientlist = &'add($dccclientlist, $cno);
  91.     $file[$cno] = $file[$lno];
  92.     $size[$cno] = $size[$lno];
  93.     $nick[$cno] = $nick[$lno];
  94.     $done[$cno] = 0;
  95.     $client[$cno] = $client[$lno];
  96.     &'c_print($client[$cno], '', 'NOTICE', $'nick[$client[$cno]], "*** DCC sending file $file[$cno] ($size[$cno] bytes) to $nick[$cno]");
  97.     &dcc_send($cno);
  98.   }
  99.   $dcclistenlist = &'remove($dcclistenlist, $lno);
  100.   &'close($lno);
  101. }
  102.  
  103. sub dcc_send {
  104.   local($cno) = @_;
  105.   local($size, $tmp, $socket);
  106.   if ($size[$cno] - $done[$cno] < $READSIZE) {
  107.     $size = $size[$cno] - $done[$cno];
  108.   } else {
  109.     $size = $READSIZE;
  110.   }
  111.   if (open(FILE, $file[$cno])) {
  112.     $tmp = '';
  113.     seek(FILE, $done[$cno], 0);
  114.     if (read(FILE, $tmp, $size)) {
  115.       $socket = $'socket[$cno];
  116.       print $socket $tmp;
  117.       $done[$cno] += $size;
  118.     }
  119.     close(FILE);
  120.   }
  121. }
  122.  
  123. __END__
  124. --><HTML><HEAD>
  125. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  126. <LINK REV="made" HREF="mailto:hasegawa@agusa.nuie.nagoya-u.ac.jp">
  127. <TITLE>ctcp/dcc/send.plm</TITLE></HEAD><BODY>
  128.  
  129. $B%*%s%i%$%s%I%-%e%a%s%H(B
  130.  
  131.  
  132. <HR><H3>$BL>A0(B</H3>
  133.  
  134. ctcp/dcc/send.plm - DCC SEND$B$G%U%!%$%k$rAw?.$9$k(B
  135.  
  136.  
  137. <HR><H3>$B@bL@(B</H3>
  138.  
  139. $B$3$N%b%8%e!<%k$rF~$l$k$H!"(BSEND$B$H$$$&%3%^%s%I$,;H$($k$h$&$K$J$j!"(B
  140. $B$3$N%3%^%s%I$r;H$C$F(BDCC$B$G%U%!%$%k$rAw?.$9$k$3$H$,$G$-$k$h$&$K$J$j$^$9!#(B
  141. SEND$B%3%^%s%I$N%Q%i%a!<%?$O%K%C%/%M!<%`$H%U%!%$%kL>$G!"(B
  142. $B0J2<$N$h$&$K;HMQ$7$^$9!#(B
  143.  
  144. <PRE>
  145. /SEND nick filename
  146. </PRE>
  147.  
  148. <HR><H3>$B%W%m%Q%F%#(B</H3>
  149.  
  150.  
  151. <HR><H3>$B@_DjNc(B</H3>
  152.  
  153. <PRE>
  154. + ctcp/dcc/send.plm
  155. </PRE>
  156.  
  157. </BODY></HTML>
  158.