X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FExtMsg.pm;h=a601d4edfa01c0a09da64a74859e50ffdd9d94c6;hb=2f1b948ea733e0ece1909a31987dc8f03044e851;hp=ce73b79f489ce3f042f34ae934d93f28c00a0877;hpb=55777026bbfa5b9cf988a85bbe28fe94993482b8;p=spider.git diff --git a/perl/ExtMsg.pm b/perl/ExtMsg.pm index ce73b79f..a601d4ed 100644 --- a/perl/ExtMsg.pm +++ b/perl/ExtMsg.pm @@ -57,59 +57,75 @@ sub dequeue { my $conn = shift; my $msg; - - while (@{$conn->{inqueue}}){ - $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); - if ($conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}} == 0) { - $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->{msg} && $conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}}) { - dbg('connect', $conn->{msg}); - $conn->_docmd($conn->{msg}); if ($conn->{state} eq 'WC' && exists $conn->{cmd} && @{$conn->{cmd}} == 0) { - $conn->{state} = 'C'; - &{$conn->{rproc}}($conn, "O$conn->{call}|telnet"); - delete $conn->{cmd}; - $conn->{timeout}->del_timer if $conn->{timeout}; + $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'); + } + } + } } } } +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 { my $server_conn = shift; my $sock = $server_conn->{sock}->accept(); 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}; @@ -118,9 +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"); - $conn->send_raw("\xFF\xFC\x01"); - _send_file($conn, "$main::data/issue"); +# $conn->send_raw("\xFF\xFC\x01"); + $conn->_send_file("$main::data/issue"); $conn->send_raw("login: "); + $conn->_dotimeout(60); } else { $conn->disconnect(); } @@ -130,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; } @@ -171,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 @@ -214,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 @@ -256,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 @@ -270,12 +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$conn->{call}|telnet"); + &{$conn->{rproc}}($conn, "O$call|telnet"); delete $conn->{cmd}; - $conn->{timeout}->del_timer if $conn->{timeout}; + $conn->{timeout}->del if $conn->{timeout}; } sub _send_file @@ -293,5 +308,4 @@ sub _send_file $f->close; } } - $! = undef; }