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

  1. package dccget;
  2.  
  3. $DCCREADSIZE = 4096;
  4. $DCCDIR = '~/tmp';
  5.  
  6. $_ = 'dccget';
  7.  
  8. sub main_loop {
  9.   local($socket, $length, $size, $tmp);
  10.   foreach $dccserverno (&'array($dccserverlist || $;)) {
  11.     next unless vec($'rout, $dccserverno, 1);
  12.     if ($size[$dccserverno] - $done[$dccserverno] < $DCCREADSIZE) {
  13.       $size = $size[$dccserverno] - $done[$dccserverno];
  14.     } else {
  15.       $size = $DCCREADSIZE;
  16.     }
  17.     $tmp = '';
  18.     $socket = "'$'socket[$dccserverno]";
  19.     if ($length = sysread($socket, $tmp, $size)) {
  20.       if (open(FILE, ">>$file[$dccserverno]")) {
  21.         select((select(FILE), $| = 1)[0]);
  22.         print FILE $tmp;
  23.         close(FILE);
  24.       }
  25.       $done[$dccserverno] += $length;
  26.       if (int(($done[$dccserverno] - $length) / $DCCREADSIZE) != int($done[$dccserverno] / $DCCREADSIZE)) {
  27.         print $socket pack('N', int($done[$dccserverno] / $DCCREADSIZE) * $DCCREADSIZE);
  28.       }
  29.       if ($done[$dccserverno] == $size[$dccserverno]) {
  30.         print $socket pack('N', int($done[$dccserverno]));
  31.         &dcc_close($dccserverno);
  32.       }
  33.     } else {
  34.       &dcc_close($dccserverno);
  35.     }
  36.   }
  37. }
  38.  
  39. sub xss_dcc {
  40.   local($serverno, $prefix, $cmd, @params) = @_;
  41.   local($nick) = (&'prefix($prefix))[0];
  42.   local($dccserverno, $dir, $dirmode, $filemode, $name, $ext);
  43.   $dir = &'expand(&'property($'userno[$serverno], 'dccdir') || $DCCDIR);
  44.   $dir .= '/' if substr($dir, -1, 1) ne '/';
  45.   $dirmode = oct(&'property($'userno[$serverno], 'dirmode') || 0);
  46.   mkdir($dir, ($dirmode || (umask ^ 0777)) | 0200) unless -d $dir;
  47.   if ($params[0] eq 'SEND') {
  48.     $name = "$dir$params[1]";
  49.     if (-f $name) {
  50.       $ext = '0';
  51.       while (-f "$name.$ext") {
  52.         $ext++;
  53.       }
  54.       $name = "$name.$ext";
  55.     }
  56.     if (open(FILE, ">$name")) {
  57.       close(FILE);
  58.       $filemode = oct(&'property($'userno[$serverno], 'filemode') || 0);
  59.       chmod(($filemode || (umask ^ 0666)) | 0200, $name);
  60.       if ($dccserverno = &'connect($params[2], $params[3])) {
  61.         vec($'rin, $dccserverno, 1) = 1;
  62.         $file[$dccserverno] = $name;
  63.         $size[$dccserverno] = $params[4];
  64.         $done[$dccserverno] = 0;
  65.         $userno[$dccserverno] = $'userno[$serverno];
  66.         $nick[$dccserverno] = $nick;
  67.         $dccserverlist = &'add($dccserverlist || $;, $dccserverno);
  68.         foreach $clientno (&'array($'clientlist)) {
  69.           next unless $'avail[$clientno];
  70.           next unless $'userno[$clientno] == $'userno[$serverno];
  71.           &'c_print($clientno, '', 'NOTICE', $'nick[$clientno], "*** DCC SEND request from $nick: $params[1] ($params[4] bytes)");
  72.           &'c_print($clientno, '', 'NOTICE', $'nick[$clientno], "*** DCC getting file $name ($params[4] bytes) from $nick");
  73.         }
  74.         return ();
  75.       }
  76.     }
  77.   }
  78.   return ($prefix, $cmd, @params);
  79. }
  80.  
  81. sub dcc_close {
  82.   local($dccserverno) = @_;
  83.   foreach $clientno (&'array($'clientlist)) {
  84.     next unless $'avail[$clientno];
  85.     next unless $'userno[$clientno] == $userno[$dccserverno];
  86.     &'c_print($clientno, '', 'NOTICE', $'nick[$clientno], "*** DCC got file $file[$dccserverno] ($size[$dccserverno] bytes) from $nick[$dccserverno]");
  87.   }
  88.   &'close($dccserverno);
  89.   vec($'rin, $dccserverno, 1) = 0;
  90.   $dccserverlist = &'remove($dccserverlist, $dccserverno);
  91. }
  92.  
  93.