X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fclient.pl;h=1914ab3179e53e54365c685a05b1022c95937f05;hb=d9db74c1b2b9b57cb6d31e8c8c425f3636f62f87;hp=6358d0225f6e4ad7fa1ae02f781ff4fff676cae8;hpb=678715c76fa49f08acb30df0760b34407f49675c;p=spider.git diff --git a/perl/client.pl b/perl/client.pl index 6358d022..1914ab31 100755 --- a/perl/client.pl +++ b/perl/client.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/perl -w # # A thing that implements dxcluster 'protocol' # @@ -41,12 +41,11 @@ BEGIN { use Msg; use DXVars; use DXDebug; -use DXUser; 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 +59,8 @@ sub cease dbg('connect', "killing $pid"); 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; @@ -128,7 +129,8 @@ sub rec_socket $mode = $line; # set echo mode from cluster my $term = POSIX::Termios->new; $term->getattr(fileno($sock)); - $term->setflag( &POSIX::ISIG ); + $term->setiflag( 0 ); + $term->setoflag( 0 ); $term->setattr(fileno($sock), &POSIX::TCSANOW ); } } elsif ($sort eq 'I') { @@ -161,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; @@ -187,9 +191,7 @@ sub rec_stdin } else { $conn->send_later("I$call|$buf"); } - } elsif ($r == 0) { - cease(1); - } + } $lasttime = time; } @@ -223,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 { @@ -323,9 +327,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'; @@ -345,6 +349,7 @@ $SIG{'INT'} = \&sig_term; $SIG{'TERM'} = \&sig_term; $SIG{'HUP'} = 'IGNORE'; $SIG{'CHLD'} = \&sig_chld; +$SIG{'ALRM'} = \&timeout; dbgadd('connect'); @@ -364,6 +369,8 @@ if ($loginreq) { } + use DXUser; + DXUser->init($userfn); # allow a login from an existing user. I could create a user but @@ -415,7 +422,7 @@ if ($connsort eq "connect") { open(IN, "$cpath/$mcall") or cease(2); @in = ; close IN; - + alarm($timeout); for (@in) { @@ -469,7 +476,7 @@ if (! $conn) { open IN, "$data/offline" or die; while () { s/\n/\r/og if $mode == 1; - print $stdout; + print $stdout $_; } close IN; } else {