home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / plum2_33_1.lzh / support / killplum < prev    next >
Text File  |  1999-03-24  |  4KB  |  159 lines

  1. #!/bin/perl -w
  2. # $Id: killplum,v 2.8 1999/01/20 15:01:56 hasegawa Exp $
  3. # copyright (c)1998-1999 Yoshinori Hasegawa <hasegawa@madoka.org>
  4.  
  5. $NAME = 'plum';
  6.  
  7. if ($] < 5) {
  8.   foreach $inc (@INC) {
  9.     if (-r "$inc/sys/socket.ph") {
  10.       eval 'require "sys/socket.ph"';
  11.       $SOCKET = "$inc/sys/socket.ph" unless $@;
  12.       last;
  13.     }
  14.     if (-r "$inc/socket.ph") {
  15.       eval 'require "socket.ph"';
  16.       $SOCKET = "$inc/socket.ph" unless $@;
  17.       last;
  18.     }
  19.   }
  20. } else {
  21.   eval 'use Socket';
  22.   $SOCKET = 'Socket.pm' unless $@;
  23. }
  24.  
  25. $NIL = $;;
  26.  
  27. $NOTRAILING = &'list('004', '215', '221', '324', '341', '367', 'mode');
  28.  
  29. $IRCPORT = 6667;
  30. $SOCKADDR = 'S n N x8';
  31.  
  32. $PROTO = (getprotobyname('tcp'))[2];
  33.  
  34. $AF_INET = eval '&AF_INET' || 2;
  35. $PF_INET = eval '&PF_INET' || 2;
  36. $SOCK_STREAM = eval '&SOCK_STREAM' || 1;
  37.  
  38. $'rin = '';
  39.  
  40. $handle = 0;
  41.  
  42. &main(@ARGV);
  43.  
  44. sub main {
  45.   local(@args) = @_;
  46.   local($path);
  47.   if ($0 =~ /^(.*)[\\\/][^\\\/]*$/) {
  48.     $path =  "$1/..";
  49.   } else {
  50.     $path = '..';
  51.   }
  52.   &load("$path/$NAME.conf") if -r "$path/$NAME.conf";
  53.   &load("$NAME.conf") if -r "$NAME.conf";
  54.   foreach $user (@args) {
  55.     &load("$path/$NAME-$user.conf") if -r "$path/$NAME-$user.conf";
  56.     &load("$NAME-$user.conf") if -r "$NAME-$user.conf";
  57.   }
  58. }
  59.  
  60. sub load {
  61.   local($file) = @_;
  62.   local($line, $var, $arg, $host, $pass, $name, $port);
  63.   open(FILE, $file) || return;
  64.   while (defined($line = <FILE>)) {
  65.     $line =~ s/^\s+//;
  66.     next if $line =~ /^[\#\;]/;
  67.     $line =~ tr/\r\n//d;
  68.     next unless $line;
  69.     $line =~ s/\s+$//;
  70.     if (!($line =~ /^[\+\-\=]\s*(\S+)/)) {
  71.       if ((($var, $arg) = split(/\s*\:\s*/, $line, 2)) == 2) {
  72.         if ($var eq 'plum.client') {
  73.           ($host, $pass) = split(/\s+/, $arg, 2);
  74.           ($name, $port) = split(/\:/, $host, 2);
  75.           $port = $IRCPORT unless $port;
  76.           &exit($port, $pass || '');
  77.         }
  78.       }
  79.     }
  80.   }
  81.   close(FILE);
  82. }
  83.  
  84. sub exit {
  85.   local($port, $pass) = @_;
  86.   local($no);
  87.   if ($no = &'connect("127.0.0.1", $port)) {
  88.     &print($no, &'build('', 'PASS', $pass));
  89.     &print($no, &'build('', 'NICK', $NAME));
  90.     &print($no, &'build('', 'USER', $NAME, '*', '*', $NAME));
  91.     &print($no, &'build('', 'EXIT', $NAME));
  92.   }
  93. }
  94.  
  95. sub print {
  96.   local($no, $str) = @_;
  97.   local($socket);
  98.   $socket = $'socket[$no];
  99.   print $socket $str;
  100. }
  101.  
  102. sub 'build {
  103.   local($prefix, $cmd, @params) = @_;
  104.   local($trailing);
  105.   return '' unless $cmd;
  106.   if (@params) {
  107.     $trailing = pop(@params) || '';
  108.     if (&'exist($NOTRAILING, "\L$cmd\E")) {
  109.       push(@params, "$trailing ");
  110.     } else {
  111.       push(@params, ":$trailing");
  112.     }
  113.   } else {
  114.     @params = ();
  115.   }
  116.   unshift(@params, $cmd);
  117.   unshift(@params, ":$prefix") if $prefix;
  118.   return join(' ', @params) . "\r\n";
  119. }
  120.  
  121. sub 'exist {
  122.   local($list, @items) = @_;
  123.   return 0 unless $list;
  124.   $list .= $NIL;
  125.   foreach $item (@items) {
  126.     return 1 if index("\L$list\E", $NIL . "\L$item\E" . $NIL) != -1;
  127.   }
  128.   return 0;
  129. }
  130.  
  131. sub 'list {
  132.   local(@array) = @_;
  133.   return join($NIL, '', @array);
  134. }
  135.  
  136. sub 'connect {
  137.   local($host, $port) = @_;
  138.   local($serverno, $socket, $ip, @addr, $name);
  139.   if ($host =~ /^\d+$/) {
  140.     $ip = $host;
  141.   } elsif ($host =~ /^[\d\.]+$/) {
  142.     @addr = split(/\./, $host);
  143.     $ip = unpack('N', pack('C4', @addr, 0, 0, 0));
  144.   } else {
  145.     $ip = unpack('N', (gethostbyname($host))[4] || "\0\0\0\0");
  146.   }
  147.   return 0 unless $ip;
  148.   $socket = '\'S' . ++$handle;
  149.   socket($socket, $PF_INET, $SOCK_STREAM, $PROTO) || return 0;
  150.   $name = pack($SOCKADDR, $AF_INET, $port, $ip);
  151.   connect($socket, $name) || return 0;
  152.   binmode($socket);
  153.   $serverno = fileno($socket);
  154.   vec($'rin, $serverno, 1) = 1;
  155.   $'socket[$serverno] = $socket;
  156.   select((select($socket), $| = 1)[0]);
  157.   return $serverno;
  158. }
  159.