X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FExtMsg.pm;h=78daffe263483b32d53a405c154ee696adadac47;hb=407d9a80a8af1fa6c1ae2c8fbca833e49da6e816;hp=4efb3484c0621d58c90631ab247ff6c67d87304a;hpb=c33a59698b9c2a7c319200620765d37706e12c5f;p=spider.git diff --git a/perl/ExtMsg.pm b/perl/ExtMsg.pm index 4efb3484..78daffe2 100644 --- a/perl/ExtMsg.pm +++ b/perl/ExtMsg.pm @@ -21,6 +21,12 @@ use IO::File; use IO::Socket; use IPC::Open3; +use vars qw($VERSION $BRANCH); +$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ ); +$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0; +$main::build += $VERSION; +$main::branch += $BRANCH; + use vars qw(@ISA $deftimeout); @ISA = qw(Msg); @@ -50,10 +56,16 @@ sub send_raw my $sock = $conn->{sock}; return unless defined($sock); push (@{$conn->{outqueue}}, $msg); - dbg('connect', "connect $conn->{cnum}: $msg") unless $conn->{state} eq 'C'; + dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect'); Msg::set_event_handler ($sock, "write" => sub {$conn->_send(0)}); } +sub echo +{ + my $conn = shift; + $conn->{echo} = shift; +} + sub dequeue { my $conn = shift; @@ -65,7 +77,7 @@ sub dequeue if ($conn->{state} eq 'WC') { if (exists $conn->{cmd}) { if (@{$conn->{cmd}}) { - dbg('connect', "connect $conn->{cnum}: $conn->{msg}"); + dbg("connect $conn->{cnum}: $conn->{msg}") if isdbg('connect'); $conn->_docmd($conn->{msg}); } } @@ -77,10 +89,10 @@ sub dequeue if ($conn->{msg} =~ /\cJ$/) { delete $conn->{msg}; } else { - $conn->{msg} = pop @lines; + $conn->{msg} =~ s/([^\cM\cJ]*)\cM?\cJ//g; } while (defined ($msg = shift @lines)) { - dbg('connect', "connect $conn->{cnum}: $msg") unless $conn->{state} eq 'C'; + dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect'); $msg =~ s/\xff\xfa.*\xff\xf0|\xff[\xf0-\xfe].//g; # remove telnet options $msg =~ s/[\x00-\x08\x0a-\x19\x1b-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters @@ -89,7 +101,7 @@ sub dequeue &{$conn->{rproc}}($conn, "I$conn->{call}|$msg"); } elsif ($conn->{state} eq 'WL' ) { $msg = uc $msg; - if (is_callsign($msg)) { + if (is_callsign($msg) && $msg !~ m|/| ) { my $sort = $conn->{csort}; $sort = 'local' if $conn->{peerhost} eq "127.0.0.1"; $conn->to_connected($msg, 'A', $sort); @@ -118,7 +130,7 @@ sub to_connected $conn->{timeout}->del if $conn->{timeout}; delete $conn->{timeout}; &{$conn->{rproc}}($conn, "$dir$call|$sort"); - $conn->_send_file("$main::data/connected"); + $conn->_send_file("$main::data/connected") unless $conn->{outgoing}; } sub new_client { @@ -131,13 +143,13 @@ sub new_client { $conn->{blocking} = 0; eval {$conn->{peerhost} = $sock->peerhost}; if ($@) { - dbg('conn', $@); + dbg($@) if isdbg('connll'); $conn->disconnect; } else { eval {$conn->{peerport} = $sock->peerport}; $conn->{peerport} = 0 if $@; my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost}, $conn->{peerport}); - dbg('connll', "accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}"); + dbg("accept $conn->{cnum} from $conn->{peerhost} $conn->{peerport}") if isdbg('connll'); if ($eproc) { $conn->{eproc} = $eproc; Msg::set_event_handler ($sock, "error" => $eproc); @@ -154,13 +166,14 @@ sub new_client { $conn->_send_file("$main::data/issue"); $conn->send_raw("login: "); $conn->_dotimeout(60); + $conn->{echo} = 1; } else { &{$conn->{eproc}}() if $conn->{eproc}; $conn->disconnect(); } } } else { - dbg('err', "ExtMsg: error on accept ($!)"); + dbg("ExtMsg: error on accept ($!)") if isdbg('err'); } } @@ -169,6 +182,7 @@ sub start_connect my $call = shift; my $fn = shift; my $conn = ExtMsg->new(\&main::new_channel); + $conn->{outgoing} = 1; $conn->conns($call); my $f = new IO::File $fn; @@ -199,8 +213,8 @@ sub _docmd last; } } - if ($cmd =~ /^\s*\'.*\'\s+\'.*\'/i) { - $conn->_dochat($cmd, $msg); + if ($cmd =~ /^\s*\'([^\']*)\'\s+\'([^\']*)\'/) { + $conn->_dochat($cmd, $msg, $1, $2); last; } if ($cmd =~ /^\s*cl\w+\s+(.*)/i) { @@ -217,16 +231,16 @@ sub _doconnect my $r; $sort = lc $sort; - dbg('connect', "CONNECT $conn->{cnum} sort: $sort command: $line"); + dbg("CONNECT $conn->{cnum} sort: $sort command: $line") if isdbg('connect'); if ($sort eq 'telnet') { # this is a straight network connect my ($host, $port) = split /\s+/, $line; $port = 23 if !$port; $r = $conn->connect($host, $port); if ($r) { - dbg('connect', "Connected $conn->{cnum} to $host $port"); + dbg("Connected $conn->{cnum} to $host $port") if isdbg('connect'); } else { - dbg('connect', "***Connect $conn->{cnum} Failed to $host $port $!"); + dbg("***Connect $conn->{cnum} Failed to $host $port $!") if isdbg('connect'); } } elsif ($sort eq 'agw') { # turn it into an AGW object @@ -251,7 +265,7 @@ sub _doconnect my $callback = sub {$conn->_rcv}; Msg::set_event_handler ($a, read => $callback); } - dbg('connect', "connect $conn->{cnum}: started pid: $conn->{pid} as $line"); + dbg("connect $conn->{cnum}: started pid: $conn->{pid} as $line") if isdbg('connect'); } else { $^W = 0; dbgclose(); @@ -267,17 +281,17 @@ sub _doconnect $SIG{HUP} = $SIG{CHLD} = $SIG{TERM} = $SIG{INT} = 'DEFAULT'; alarm(0); } - exec "$line" or dbg('err', "exec '$line' failed $!"); + exec "$line" or dbg("exec '$line' failed $!"); } } else { - dbg('err', "cannot fork"); + dbg("cannot fork"); $r = undef; } } else { - dbg('err', "no socket pair $!"); + dbg("no socket pair $!"); } } else { - dbg('err', "invalid type of connection ($sort)"); + dbg("invalid type of connection ($sort)"); } $conn->disconnect unless $r; return $r; @@ -287,7 +301,7 @@ sub _doabort { my $conn = shift; my $string = shift; - dbg('connect', "connect $conn->{cnum}: abort $string"); + dbg("connect $conn->{cnum}: abort $string") if isdbg('connect'); $conn->{abort} = $string; } @@ -295,7 +309,7 @@ sub _dotimeout { my $conn = shift; my $val = shift; - dbg('connect', "connect $conn->{cnum}: timeout set to $val"); + dbg("connect $conn->{cnum}: timeout set to $val") if isdbg('connect'); $conn->{timeout}->del if $conn->{timeout}; $conn->{timeval} = $val; $conn->{timeout} = Timer->new($val, sub{ &_timedout($conn) }); @@ -305,7 +319,7 @@ sub _dolineend { my $conn = shift; my $val = shift; - dbg('connect', "connect $conn->{cnum}: lineend set to $val "); + dbg("connect $conn->{cnum}: lineend set to $val ") if isdbg('connect'); $val =~ s/\\r/\r/g; $val =~ s/\\n/\n/g; $conn->{lineend} = $val; @@ -316,20 +330,21 @@ sub _dochat my $conn = shift; my $cmd = shift; my $line = shift; + my $expect = shift; + my $send = shift; if ($line) { - my ($expect, $send) = $cmd =~ /^\s*\'(.*)\'\s+\'(.*)\'/; if ($expect) { - dbg('connect', "connect $conn->{cnum}: expecting: \"$expect\" received: \"$line\""); + dbg("connect $conn->{cnum}: expecting: \"$expect\" received: \"$line\"") if isdbg('connect'); if ($conn->{abort} && $line =~ /\Q$conn->{abort}/i) { - dbg('connect', "connect $conn->{cnum}: aborted on /$conn->{abort}/"); + dbg("connect $conn->{cnum}: aborted on /$conn->{abort}/") if isdbg('connect'); $conn->disconnect; delete $conn->{cmd}; return; } if ($line =~ /\Q$expect/i) { if (length $send) { - dbg('connect', "connect $conn->{cnum}: got: \"$expect\" sending: \"$send\""); + dbg("connect $conn->{cnum}: got: \"$expect\" sending: \"$send\"") if isdbg('connect'); $conn->send_later("D$conn->{call}|$send"); } delete $conn->{msg}; # get rid any input if a match @@ -344,7 +359,7 @@ sub _dochat sub _timedout { my $conn = shift; - dbg('connect', "connect $conn->{cnum}: timed out after $conn->{timeval} seconds"); + dbg("connect $conn->{cnum}: timed out after $conn->{timeval} seconds") if isdbg('connect'); $conn->disconnect; } @@ -374,7 +389,7 @@ sub _send_file while (<$f>) { chomp; my $l = $_; - dbg('connll', "connect $conn->{cnum}: $l"); + dbg("connect $conn->{cnum}: $l") if isdbg('connll'); $conn->send_raw($l . $conn->{lineend}); } $f->close;