X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fclient.pl;h=57a5d45b0fa4ea373ac434a08d9c2b623687febe;hb=04ff9a5a6bf8f3ab55bc2922b76a44e2798af8ee;hp=47e05463a08fc4dc4ed13ce287a7759fbbe08732;hpb=ec71999de3f6f9d5014ff76bb1e489e7ab4b1136;p=spider.git diff --git a/perl/client.pl b/perl/client.pl index 47e05463..57a5d45b 100755 --- a/perl/client.pl +++ b/perl/client.pl @@ -39,6 +39,7 @@ BEGIN { } use Msg; +use IntMsg; use DXVars; use DXDebug; use DXUtil; @@ -78,8 +79,10 @@ sub sig_term # terminate a child sub sig_chld { - $SIG{CHLD} = \&sig_chld; - $waitedpid = wait; + unless ($^O =~ /^MS/i) { + $SIG{CHLD} = \&sig_chld; + $waitedpid = wait; + } dbg('connect', "caught $pid"); } @@ -88,10 +91,13 @@ sub setmode { if ($mode == 1) { $mynl = "\r"; + $out_lineend = "\r"; } else { $mynl = "\n"; + $out_lineend = "\r\n"; } $/ = $mynl; + $out_lineend = $mynl; } # handle incoming messages @@ -119,6 +125,8 @@ sub rec_socket if ($buffered) { if (length $outqueue >= $client_buffer_lth) { print $stdout $outqueue; + pop @echo while (@echo > $maxecho); + push @echo, $outqueue; $outqueue = ""; } $outqueue .= "$savenl$line$snl"; @@ -144,6 +152,8 @@ sub rec_socket } elsif ($sort eq 'B') { if ($buffered && $outqueue) { print $stdout $outqueue; + pop @echo while(@echo > $maxecho); + push @echo, $outqueue; $outqueue = ""; } $buffered = $line; # set buffered or unbuffered @@ -182,7 +192,7 @@ sub rec_stdin } elsif ($r > 0) { if ($mode) { $buf =~ s/\r/\n/g if $mode == 1; - $buf =~ s/[\r\x00]//g if $mode == 2; + $buf =~ s/[\r\x00]//g if $mode == 2 || $mode == 3; $dangle = !($buf =~ /\n$/); if ($buf eq "\n") { @@ -199,6 +209,7 @@ sub rec_stdin unshift @lines, ($lastbit . $first) if ($first); foreach $first (@lines) { # print "send_now $call $first\n"; + next if grep {$_ eq $first } @echo; $conn->send_later("I$call|$first"); } $lastbit = $buf; @@ -228,8 +239,14 @@ sub doconnect $sock->output_record_separator(''); $sock->option_accept(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO); $sock->open($host) or die "Can't connect to $host port $port $!"; - $sock->binmode(1); - $mode = ($port == 23) ? 2 : 3; + if ($port == 23) { + $sock->telnetmode(1); + $sock->option_send(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO) if $port == 23; + } else { + $sock->telnetmode(0); + } + $sock->binmode(0); + $mode = 3; } elsif ($sort eq 'ax25' || $sort eq 'prog') { my @args = split /\s+/, $line; $rfh = new IO::File; @@ -260,6 +277,16 @@ sub dotimeout $timeout = $val; } +sub dolineend +{ + my $val = shift; + $out_lineend = $val; + $out_lineend =~ s/\\r/\r/g; + $out_lineend =~ s/\\n/\n/g; + dbg('connect', "lineend set to $val "); + $out_lineend = $mynl unless $out_lineend; +} + sub dochat { my ($expect, $send) = @_; @@ -289,7 +316,7 @@ sub dochat $line =~ s/\r/\n/g; chomp; } - dbg('connect', "received \"$line\""); + dbg('connect', map { "received \"$_\"" } split /\n/, $line); if ($abort && $line =~ /$abort/i) { dbg('connect', "aborted on /$abort/"); cease(11); @@ -299,9 +326,10 @@ sub dochat } if ($send) { if ($csort eq 'telnet') { +# local $\ = $out_lineend; $sock->print("$send\n"); } elsif ($csort eq 'ax25') { - local $\ = "\r"; + local $\ = $out_lineend; $wfh->print("$send"); } dbg('connect', "sent \"$send\""); @@ -340,10 +368,12 @@ $savenl = ""; # an NL that has been saved from last time $timeout = 60; # default timeout for connects $abort = ""; # the current abort string $cpath = "$root/connect"; # the basic connect directory +$maxecho = 5; # length of max echo queue $pid = 0; # the pid of the child program $csort = ""; # the connection type $sock = 0; # connection socket +$out_lineend = $mynl; # connection lineending (used for outgoing connects) $stdin = *STDIN; $stdout = *STDOUT; @@ -374,11 +404,12 @@ if ($call eq $mycall) { $stdout->autoflush(1); -$SIG{'INT'} = \&sig_term; -$SIG{'TERM'} = \&sig_term; -$SIG{'HUP'} = \&sig_term; -$SIG{'CHLD'} = \&sig_chld; -$SIG{'ALRM'} = \&timeout; +unless ($^O =~ /^MS/i) { + $SIG{'INT'} = \&sig_term; + $SIG{'TERM'} = \&sig_term; + $SIG{'HUP'} = \&sig_term; + $SIG{'CHLD'} = \&sig_chld; +} dbgadd('connect'); @@ -413,7 +444,7 @@ if ($loginreq) { $s =~ s/\s+//og; $s =~ s/-\d+$//o; # no ssids! cease(0) unless $s && $s gt ' '; - unless (iscallsign($s)) { + unless (is_callsign($s)) { $stdout->print("Sorry, $s is an invalid callsign"); cease(0); } @@ -438,7 +469,9 @@ if ($connsort eq "connect") { doconnect($1, $2) if /^\s*co\w*\s+(\w+)\s+(.*)$/io; doabort($1) if /^\s*a\w*\s+(.*)/io; dotimeout($1) if /^\s*t\w*\s+(\d+)/io; + dolineend($1) if /^\s*[Ll]\w*\s+\'((?:\\[rn])+)\'/; dochat($1, $2) if /^\s*\'(.*)\'\s+\'(.*)\'/io; + if (/^\s*cl\w+\s+(.*)/io) { doclient($1); last; @@ -477,6 +510,7 @@ if ($connsort eq "connect") { setmode(); # adjust the callsign if it has an SSID, SSID <= 8 are legal > 8 are netrom connections +$call =~ s/-0$//; # strip off -0 as this is equiv to just call on its own my ($scall, $ssid) = split /-/, $call; $ssid = undef unless $ssid && $ssid =~ /^\d+$/; if ($ssid) { @@ -490,7 +524,7 @@ if ($ssid) { } -$conn = Msg->connect("$clusteraddr", $clusterport, \&rec_socket); +$conn = IntMsg->connect("$clusteraddr", $clusterport, \&rec_socket); if (! $conn) { if (-r "$data/offline") { open IN, "$data/offline" or die; @@ -511,7 +545,7 @@ Msg->set_event_handler($stdin, "read" => \&rec_stdin); for (;;) { my $t; - Msg->event_loop(1, 1); + Msg->event_loop(1, 0.1); $t = time; if ($t > $lasttime) { if ($outqueue) {