made all protocol except PC29 reject %xx characters
[spider.git] / perl / client.pl
index 9e948a181a64bee603208586c1573d65ddccf327..2e6a4f1727452652d1b32f3ccf7353e2016cedd9 100755 (executable)
@@ -98,7 +98,7 @@ sub rec_socket
                cease(1);
        }
        if (defined $msg) {
-               my ($sort, $call, $line) = $msg =~ /^(\w)(\S+)\|(.*)$/;
+               my ($sort, $call, $line) = $msg =~ /^(\w)([A-Z0-9\-]+)\|(.*)$/;
                
                if ($sort eq 'D') {
                        my $snl = $mynl;
@@ -163,7 +163,9 @@ sub rec_stdin
        #  $prbuf =~ s/\r/\\r/;
        #  $prbuf =~ s/\n/\\n/;
        #  print "sys: $r ($prbuf)\n";
-       if ($r > 0) {
+       if (!defined $r || $r == 0) {
+               cease(1);
+       } elsif ($r > 0) {
                if ($mode) {
                        $buf =~ s/\r/\n/og if $mode == 1;
                        $buf =~ s/\r\n/\n/og if $mode == 2;
@@ -189,9 +191,7 @@ sub rec_stdin
                } else {
                        $conn->send_later("I$call|$buf");
                }
-       } elsif ($r == 0) {
-               cease(1);
-       }
+       } 
        $lasttime = time;
 }
 
@@ -225,6 +225,8 @@ sub doconnect
                $rfh = new IO::File;
                $wfh = new IO::File;
                $pid = open2($rfh, $wfh, "$line") or die "can't do $line $!";
+               die "no receive channel $!" unless $rfh;
+               die "no transmit channel $!" unless $wfh;
                dbg('connect', "got pid $pid");
                $wfh->autoflush(1);
        } else {
@@ -259,6 +261,7 @@ sub dochat
                for (;;) {
                        if ($csort eq 'telnet') {
                                $line = $sock->get();
+                               cease(11) unless $line;          # the socket has gone away?
                                $line =~ s/\r\n/\n/og;
                                chomp;
                        } elsif ($csort eq 'ax25' || $csort eq 'prog') {
@@ -325,9 +328,9 @@ $waitedpid = 0;
 # deal with args
 #
 
-$call = uc shift @ARGV;
+$call = uc shift @ARGV if @ARGV;
 $call = uc $myalias if !$call;
-$connsort = lc shift @ARGV;
+$connsort = lc shift @ARGV if @ARGV;
 $connsort = 'local' if !$connsort;
 
 $loginreq = $call eq 'LOGIN';