X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FExtMsg.pm;h=a601d4edfa01c0a09da64a74859e50ffdd9d94c6;hb=2f1b948ea733e0ece1909a31987dc8f03044e851;hp=f2d132645356c42e56e2778ae5feb15b9d15f1c6;hpb=2eb96829a9b19c1cf13d196a8e0da24345a5ba3c;p=spider.git diff --git a/perl/ExtMsg.pm b/perl/ExtMsg.pm index f2d13264..a601d4ed 100644 --- a/perl/ExtMsg.pm +++ b/perl/ExtMsg.pm @@ -29,8 +29,13 @@ sub enqueue { my ($conn, $msg) = @_; unless ($msg =~ /^[ABZ]/) { - if ($msg =~ /^E[-\w]+\|([01])/) { + if ($msg =~ /^E[-\w]+\|([01])/ && $conn->{csort} eq 'telnet') { $conn->{echo} = $1; + if ($1) { +# $conn->send_raw("\xFF\xFC\x01"); + } else { +# $conn->send_raw("\xFF\xFB\x01"); + } } else { $msg =~ s/^[-\w]+\|//; push (@{$conn->{outqueue}}, $msg . $conn->{lineend}); @@ -52,48 +57,62 @@ sub dequeue { my $conn = shift; my $msg; - - while ($msg = shift @{$conn->{inqueue}}){ - dbg('connect', $msg) unless $conn->{state} eq 'C'; - - $msg =~ s/\xff\xfa.*\xff\xf0|\xff[\xf0-\xfe].//g; # remove telnet options - $msg =~ s/[\x00-\x08\x0a-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters - if ($conn->{state} eq 'C') { - &{$conn->{rproc}}($conn, "I$conn->{call}|$msg", $!); - $! = 0; - } elsif ($conn->{state} eq 'WL' ) { - $msg = uc $msg; - if (is_callsign($msg)) { - _send_file($conn, "$main::data/connected"); - $conn->{call} = $msg; - &{$conn->{rproc}}($conn, "A$conn->{call}|telnet"); - $conn->{state} = 'C'; - } else { - $conn->send_now("Sorry $msg is an invalid callsign"); - $conn->disconnect; - } - } elsif ($conn->{state} eq 'WC') { - if (exists $conn->{cmd} && @{$conn->{cmd}}) { - $conn->_docmd($msg); - unless (exists $conn->{cmd} && @{$conn->{cmd}}) { - $conn->{state} = 'C'; - &{$conn->{rproc}}($conn, "O$conn->{call}|telnet"); - delete $conn->{cmd}; - $conn->{timeout}->del_timer if $conn->{timeout}; + if ($conn->{state} eq 'WC') { + if (exists $conn->{cmd}) { + if (@{$conn->{cmd}}) { + dbg('connect', $conn->{msg}); + $conn->_docmd($conn->{msg}); + } + } + if ($conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}} == 0) { + $conn->to_connected($conn->{call}, 'O', 'telnet'); + } + } elsif ($conn->{msg} =~ /\n/) { + my @lines = split /\r?\n/, $conn->{msg}; + if ($conn->{msg} =~ /\n$/) { + delete $conn->{msg}; + } else { + $conn->{msg} = pop @lines; + } + while (defined ($msg = shift @lines)) { + dbg('connect', $msg) unless $conn->{state} eq 'C'; + + $msg =~ s/\xff\xfa.*\xff\xf0|\xff[\xf0-\xfe].//g; # remove telnet options + $msg =~ s/[\x00-\x08\x0a-\x1f\x80-\x9f]/./g; # immutable CSI sequence + control characters + + if ($conn->{state} eq 'C') { + &{$conn->{rproc}}($conn, "I$conn->{call}|$msg"); + } elsif ($conn->{state} eq 'WL' ) { + $msg = uc $msg; + if (is_callsign($msg)) { + $conn->to_connected($msg, 'A', 'telnet'); + } else { + $conn->send_now("Sorry $msg is an invalid callsign"); + $conn->disconnect; + } + } elsif ($conn->{state} eq 'WC') { + if (exists $conn->{cmd} && @{$conn->{cmd}}) { + $conn->_docmd($msg); + if ($conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}} == 0) { + $conn->to_connected($conn->{call}, 'O', 'telnet'); + } } } } } - if ($conn->{msg} && $conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}}) { - $conn->_docmd($conn->{msg}); - unless (@{$conn->{cmd}}) { - $conn->{state} = 'C'; - &{$conn->{rproc}}($conn, "O$conn->{call}|telnet"); - delete $conn->{cmd}; - $conn->{timeout}->del_timer if $conn->{timeout}; - } - } +} + +sub to_connected +{ + my ($conn, $call, $dir, $sort) = @_; + $conn->{state} = 'C'; + $conn->conns($call); + delete $conn->{cmd}; + $conn->{timeout}->del if $conn->{timeout}; + delete $conn->{timeout}; + $conn->_send_file("$main::data/connected"); + &{$conn->{rproc}}($conn, "$dir$call|$sort"); } sub new_client { @@ -102,7 +121,11 @@ sub new_client { my $conn = $server_conn->new($server_conn->{rproc}); $conn->{sock} = $sock; - my $rproc = &{$server_conn->{rproc}} ($conn, $sock->peerhost(), $sock->peerport()); + my ($rproc, $eproc) = &{$server_conn->{rproc}} ($conn, $conn->{peerhost} = $sock->peerhost(), $conn->{peerport} = $sock->peerport()); + if ($eproc) { + $conn->{eproc} = $eproc; + Msg::set_event_handler ($sock, "error" => $eproc); + } if ($rproc) { $conn->{rproc} = $rproc; my $callback = sub {$conn->_rcv}; @@ -111,8 +134,10 @@ sub new_client { $conn->{state} = 'WL'; # $conn->send_raw("\xff\xfe\x01\xff\xfc\x01\ff\fd\x22"); # $conn->send_raw("\xff\xfa\x22\x01\x01\xff\xf0"); - _send_file($conn, "$main::data/issue"); - $conn->send_raw("Login: "); +# $conn->send_raw("\xFF\xFC\x01"); + $conn->_send_file("$main::data/issue"); + $conn->send_raw("login: "); + $conn->_dotimeout(60); } else { $conn->disconnect(); } @@ -122,13 +147,12 @@ sub start_connect { my $call = shift; my $fn = shift; - my $conn = ExtMsg->new(\&main::rec); - $conn->{call} = $call; + my $conn = ExtMsg->new(\&main::new_channel); + $conn->conns($call); my $f = new IO::File $fn; push @{$conn->{cmd}}, <$f>; $f->close; - push @main::outstanding_connects, {call => $call, conn => $conn}; $conn->_dotimeout($deftimeout); $conn->_docmd; } @@ -163,9 +187,6 @@ sub _docmd } last if $conn->{state} eq 'E'; } - unless (exists $conn->{cmd} && @{$conn->{cmd}}) { - @main::outstanding_connects = grep {$_->{call} ne $conn->{call}} @main::outstanding_connects; - } } sub _doconnect @@ -206,9 +227,9 @@ sub _dotimeout my $conn = shift; my $val = shift; dbg('connect', "timeout set to $val"); - $conn->{timeout}->del_timer if $conn->{timeout}; - $conn->{timeout} = ExtMsg->new_timer($val, sub{ _timeout($conn); }); + $conn->{timeout}->del if $conn->{timeout}; $conn->{timeval} = $val; + $conn->{timeout} = Timer->new($val, sub{ &_timedout($conn) }); } sub _dolineend @@ -234,6 +255,7 @@ sub _dochat if ($conn->{abort} && $line =~ /$conn->{abort}/i) { dbg('connect', "aborted on /$conn->{abort}/"); $conn->disconnect; + delete $conn->{cmd}; return; } if ($line =~ /$expect/i) { @@ -247,12 +269,13 @@ sub _dochat unshift @{$conn->{cmd}}, $cmd; } -sub _timeout +sub _timedout { my $conn = shift; dbg('connect', "timed out after $conn->{timeval} seconds"); + $conn->{timeout}->del; + delete $conn->{timeout}; $conn->disconnect; - @main::outstanding_connects = grep {$_->{call} ne $conn->{call}} @main::outstanding_connects; } # handle callsign and connection type firtling @@ -261,8 +284,13 @@ sub _doclient my $conn = shift; my $line = shift; my @f = split /\s+/, $line; - $conn->{call} = uc $f[0] if $f[0]; + my $call = uc $f[0] if $f[0]; + $conn->conns($call); $conn->{csort} = $f[1] if $f[1]; + $conn->{state} = 'C'; + &{$conn->{rproc}}($conn, "O$call|telnet"); + delete $conn->{cmd}; + $conn->{timeout}->del if $conn->{timeout}; } sub _send_file @@ -275,10 +303,9 @@ sub _send_file if ($f) { while (<$f>) { chomp; - $conn->send_later($_); + $conn->send_raw($_ . $conn->{lineend}); } $f->close; } } - $! = undef; }