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 / get.plm < prev    next >
Text File  |  1998-10-15  |  6KB  |  226 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: get.plm,v 2.26 1998/08/27 02:47:24 hasegawa Exp $
  3. # copyright (c)1997-1998 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. package ctcp_dcc_get;
  6.  
  7. $READSIZE = 4096;
  8. $DIRECTORY = '.';
  9. $MODE = umask() ^ 0666;
  10. $CLIENTINFO = 'DCC';
  11. $TIMEOUT = 3600;
  12.  
  13. $_ = 'ctcp_dcc_get';
  14.  
  15. sub main_loop {
  16.   local($userno) = @_;
  17.   local($socket, $length, $size, $tmp);
  18.   foreach $sno (&'array($dccserverlist)) {
  19.     if (vec($'rout, $sno, 1)) {
  20.       if ($size[$sno] - $done[$sno] < $READSIZE) {
  21.         $size = $size[$sno] - $done[$sno];
  22.       } else {
  23.         $size = $READSIZE;
  24.       }
  25.       $tmp = '';
  26.       $socket = $'socket[$sno];
  27.       if ($length = sysread($socket, $tmp, $size)) {
  28.         if (open(FILE, ">>$file[$sno]")) {
  29.           select((select(FILE), $| = 1)[0]);
  30.           print FILE $tmp;
  31.           close(FILE);
  32.         }
  33.         $done[$sno] += $length;
  34.         print $socket pack('N', $done[$sno]);
  35.         if ($done[$sno] >= $size[$sno]) {
  36.           &dcc_close($sno);
  37.         }
  38.       } else {
  39.         &dcc_close($sno);
  40.       }
  41.       vec($'rout, $sno, 1) = 0;
  42.     } elsif (time() - $'access[$sno] > $TIMEOUT) {
  43.       &'close($sno);
  44.       $dccserverlist = &'remove($dccserverlist, $sno);
  45.     }
  46.   }
  47. }
  48.  
  49. sub cpss_dcc {
  50.   local($serverno, $prefix, $cmd, @params) = @_;
  51.   local($userno, $regex);
  52.   $userno = $'userno[$serverno];
  53.   if (&checkmask($userno, $prefix, $params[0])) {
  54.     ($cmd, $params[1]) = &dcc_open($serverno, $cmd, $params[1]);
  55.     return ($prefix, $cmd, @params);
  56.   }
  57.   return ($prefix, $cmd, @params);
  58. }
  59.  
  60. sub dcc_open {
  61.   local($serverno, $cmd, $msg) = @_;
  62.   local($userno, $nick, $dir, $name, $mode, @params, $sno);
  63.   $userno = $'userno[$serverno];
  64.   $nick = &'prefix($prefix);
  65.   @params = split(/\s+/, $msg);
  66.   if ("\L$params[0]\E" eq 'send') {
  67.     $dir = &'expand(&'property($userno, 'directory') || $DIRECTORY);
  68.     $name = &newfile($dir, $params[1]);
  69.     if (open(FILE, ">$name")) {
  70.       close(FILE);
  71.       $mode = &'property($userno, 'mode');
  72.       if (defined($mode)) {
  73.         $mode = oct($mode) | 0200;
  74.       } else {
  75.         $mode = $MODE | 0200;
  76.       }
  77.       chmod($mode, $name);
  78.       if ($sno = &'connect($params[2], $params[3])) {
  79.         $file[$sno] = $name;
  80.         $size[$sno] = $params[4];
  81.         $done[$sno] = 0;
  82.         $nick[$sno] = $nick;
  83.         $server[$sno] = $serverno;
  84.         $userno[$sno] = $userno;
  85.         $dccserverlist = &'add($dccserverlist, $sno);
  86.         foreach $cno (&'array($'clientlist)) {
  87.           next unless $'avail[$cno];
  88.           next unless $'server[$cno] == $serverno;
  89.           &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC SEND request from $nick: $params[1] ($params[4] bytes)");
  90.           &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC getting file $name ($params[4] bytes) from $nick");
  91.         }
  92.         return ();
  93.       }
  94.     }
  95.   }
  96.   return ($prefix, $cmd, $msg);
  97. }
  98.  
  99. sub dcc_close {
  100.   local($sno) = @_;
  101.   foreach $cno (&'array($'clientlist)) {
  102.     next unless $'avail[$cno];
  103.     next unless $'server[$cno] == $server[$sno];
  104.     &'c_print($cno, '', 'NOTICE', $'nick[$cno], "*** DCC got file $file[$sno] ($size[$sno] bytes) from $nick[$sno]");
  105.   }
  106.   &'close($sno);
  107.   $dccserverlist = &'remove($dccserverlist, $sno);
  108. }
  109.  
  110. sub newfile {
  111.   local($dir, $file) = @_;
  112.   local($name, $ext);
  113.   $file =~ s/^.*[\\\/]([^\\\/]+)$/$1/;
  114.   $name = "$dir/$file";
  115.   if (-e $name) {
  116.     $ext = '';
  117.     if (rindex($file, '.') > 0) {
  118.       $ext = substr($file, rindex($file, '.'));
  119.       $file = substr($file, 0, rindex($file, '.'));
  120.     }
  121.     $num = 1;
  122.     $name = "$dir/$file-$num$ext";
  123.     while (-e $name) {
  124.       $num++;
  125.       $name = "$dir/$file-$num$ext";
  126.     }
  127.   }
  128.   return $name;
  129. }
  130.  
  131. sub checkmask {
  132.   local($userno, $prefix, $chan) = @_;
  133.   local($user, $chlist, $list);
  134.   foreach $mask (&'property($userno, 'mask')) {
  135.     ($user, $chlist) = split(/\s+/, $mask);
  136.     $list = '';
  137.     foreach $vchan (split(/\,/, $chlist || '')) {
  138.       $list = &'add($list, &'real($vchan));
  139.     }
  140.     if ($chan =~ /^[\#\&\+]/) {
  141.       next unless (!$list || &'exist($list, $chan));
  142.     } else {
  143.       next unless (!$list || &'exist($list, '*'));
  144.     }
  145.     if ($user =~ /^\-/) {
  146.       $regex = &'regex(substr($user, 1));
  147.       return 0 if $prefix =~ /$regex/i;
  148.     }
  149.     if ($user =~ /^\+/) {
  150.       $regex = &'regex(substr($user, 1));
  151.     } else {
  152.       $regex = &'regex($user);
  153.     }
  154.     return 1 if $prefix =~ /$regex/i;
  155.   }
  156.   return 0;
  157. }
  158.  
  159. __END__
  160. --><HTML><HEAD>
  161. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  162. <LINK REV="made" HREF="mailto:hasegawa@agusa.nuie.nagoya-u.ac.jp">
  163. <TITLE>ctcp/dcc.get.plm</TITLE></HEAD><BODY>
  164.  
  165. $B%*%s%i%$%s%I%-%e%a%s%H(B
  166.  
  167.  
  168. <HR><H3>$BL>A0(B</H3>
  169.  
  170. ctcp/dcc/get.plm - DCC SEND$B$KH?1~$7$FAw$i$l$F$-$?%U%!%$%k$r<u$1<h$k(B
  171.  
  172.  
  173. <HR><H3>$B@bL@(B</H3>
  174.  
  175. DCC SEND$B%j%/%(%9%H$,Aw$i$l$F$-$?$H$-!"(B
  176. $B$=$l$KH?1~$7$FAw$i$l$F$-$?%U%!%$%k$r<+F0E*$K<u?.$7$^$9!#(B
  177.  
  178.  
  179. <HR><H3>$B%W%m%Q%F%#(B</H3>
  180.  
  181. <DL>
  182. <DT>  ctcp.dcc.get.directory $B%G%#%l%/%H%j(B
  183. </DT>
  184. <DD>    $B<u?.$7$?%U%!%$%k$rCV$/%G%#%l%/%H%j$r;XDj$7$^$9(B
  185.         $B%G%#%l%/%H%j$,B8:_$7$J$$$H$-$d!"(B
  186.         $B%G%#%l%/%H%j$K=q$-9~$_$,$G$-$J$$$H$-$O%U%!%$%k$r<u?.$7$^$;$s!#(B
  187.         $B%G%U%)%k%H$G$O%+%l%s%H%G%#%l%/%H%j$G$9!#(B
  188. </DD>
  189. <DT>  ctcp.dcc.get.mask* $B%f!<%6%^%9%/(B [($B%A%c%s%M%kL>(B)]
  190. </DT>
  191. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i!"(B
  192.         $BAw$i$l$F$-$?%U%!%$%k$r<u?.$7$^$9!#(B
  193. </DD>
  194. <DT>  ctcp.dcc.get.mode $B%U%!%$%k%b!<%I(B
  195. </DT>
  196. <DD>    $B%U%!%$%k$r<u?.$7$?$H$-!"$=$N%U%!%$%k$N%U%!%$%k$N%b!<%I$r(B
  197.         $B$3$3$G;XDj$7$?CM$K$7$^$9!#(B
  198. </DD>
  199. </DL>
  200.  
  201.  
  202. <HR><H3>$B@_DjNc(B</H3>
  203.  
  204. <PRE>
  205. + ctcp/dcc/get.plm
  206. ctcp.dcc.get.mask: *!*@*
  207. </PRE>
  208.  
  209. DCC SEND$B$G%U%!%$%k$,Aw?.$5$l$F$-$?$H$-!"(B
  210. $B$=$l$,C/$+$iAw$i$l$F$-$?$+$K$+$+$o$i$:!"$=$N%U%!%$%k$r<u?.$7$^$9!#(B
  211. $B<u?.$7$?%U%!%$%k$O%+%l%s%H%G%#%l%/%H%j$K:n@.$5$l$^$9!#(B
  212.  
  213. <PRE>
  214. + ctcp/dcc/get.plm
  215. ctcp.dcc.get.directory: dcc
  216. ctcp.dcc.get.mask: *!*@*.jp
  217. </PRE>
  218.  
  219. DCC SEND$B$G%U%!%$%k$,Aw?.$5$l$F$-$?$H$-!"(B
  220. $BAw?.$7$F$-$??M$,!V(B*!*@*.jp$B!W$K%^%C%A$7$?$i!"$=$N%U%!%$%k$r<u?.$7$^$9!#(B
  221. $B<u?.$7$?%U%!%$%k$O!V(Bdcc$B!W$H$$$&%G%#%l%/%H%j$NCf$K:n@.$5$l$^$9!#(B
  222. $B!V(Bdcc$B!W$H$$$&L>A0$N%G%#%l%/%H%j$,B8:_$7$J$$>l9g$d!"(B
  223. $B=q$-9~$_$,$G$-$J$$>l9g$O%U%!%$%k$O<u?.$7$^$;$s!#(B
  224.  
  225. </BODY></HTML>
  226.