X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fclient.pl;h=a7185ab208de387c0a58df593ca3c4597e2a5151;hb=refs%2Ftags%2FR_1_33;hp=c6f5bd2806c12d0ad0359af074fbf132cc7821ed;hpb=5ff2fd1ff97212e4e490107d69f25572b71d2409;p=spider.git diff --git a/perl/client.pl b/perl/client.pl index c6f5bd28..a7185ab2 100755 --- a/perl/client.pl +++ b/perl/client.pl @@ -41,11 +41,11 @@ BEGIN { use Msg; use DXVars; use DXDebug; +use Net::Telnet qw(TELOPT_ECHO); use IO::File; use IO::Socket; use IPC::Open2; -use Net::Telnet qw(TELOPT_ECHO); -use Carp; +use Carp qw{cluck}; # cease communications sub cease @@ -60,6 +60,7 @@ sub cease kill(9, $pid); } dbgclose(); +# $SIG{__WARN__} = sub {my $a = shift; cluck($a); }; sleep(1); exit(0); } @@ -97,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; @@ -162,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; @@ -188,9 +191,7 @@ sub rec_stdin } else { $conn->send_later("I$call|$buf"); } - } elsif ($r == 0) { - cease(1); - } + } $lasttime = time; } @@ -208,12 +209,13 @@ sub doconnect $port = 23 if !$port; # if ($port == 23) { + $sock = new Net::Telnet (Timeout => $timeout, Port => $port); $sock->option_callback(\&optioncb); $sock->output_record_separator(''); - $sock->option_log('option_log'); - $sock->dump_log('dump'); - $sock->option_accept(Wont => TELOPT_ECHO); +# $sock->option_log('option_log'); +# $sock->dump_log('dump'); + $sock->option_accept(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO); $sock->open($host) or die "Can't connect to $host port $port $!"; # } else { # $sock = IO::Socket::INET->new(PeerAddr => "$host:$port", Proto => 'tcp') @@ -224,6 +226,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 { @@ -258,6 +262,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') { @@ -324,9 +329,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'; @@ -473,7 +478,7 @@ if (! $conn) { open IN, "$data/offline" or die; while () { s/\n/\r/og if $mode == 1; - print $stdout; + print $stdout $_; } close IN; } else { @@ -488,7 +493,7 @@ Msg->set_event_handler($stdin, "read" => \&rec_stdin); for (;;) { my $t; - Msg->event_loop(1, 0.010); + Msg->event_loop(1, 1); $t = time; if ($t > $lasttime) { if ($outqueue) {