use DXVars;
use DXDebug;
use DXUtil;
-use Net::Telnet qw(TELOPT_ECHO);
+use Net::Telnet qw(TELOPT_ECHO TELOPT_BINARY);
use IO::File;
use IO::Socket;
use IPC::Open2;
-use Carp qw{cluck};
# cease communications
sub cease
{
my $sendz = shift;
- if ($conn && $sendz) {
- $conn->send_now("Z$call|bye...\n");
- sleep(1);
- }
+# if ($conn && $sendz) {
+# $conn->send_now("Z$call|bye...");
+# sleep(1);
+# }
$stdout->flush if $stdout;
if ($pid) {
dbg('connect', "killing $pid");
{
my ($con, $msg, $err) = @_;
if (defined $err && $err) {
- cease(1);
+ cease(0);
}
if (defined $msg) {
- my ($sort, $call, $line) = $msg =~ /^(\w)([A-Z0-9\-]+)\|(.*)$/;
+ my ($sort, $call, $line) = $msg =~ /^(\w)([^\|]+)\|(.*)$/;
if ($sort eq 'D') {
my $snl = $mynl;
my $newsavenl = "";
$snl = "" if $mode == 0;
+ $snl = "\r\n" if $mode == 3;
+ $snl = "\n" if $mode == 2;
if ($mode == 2 && $line =~ />$/) {
$newsavenl = $snl;
$snl = ' ';
$buffered = $line; # set buffered or unbuffered
} elsif ($sort eq 'Z') { # end, disconnect, go, away .....
cease(0);
- }
+ }
+
+ # ******************************************************
+ # ******************************************************
+ # any other sorts that might happen are silently ignored.
+ # ******************************************************
+ # ******************************************************
+ } else {
+ cease(0);
}
$lasttime = time;
}
cease(1);
} elsif ($r > 0) {
if ($mode) {
- $buf =~ s/\r/\n/og if $mode == 1;
- $buf =~ s/\r\n/\n/og if $mode == 2;
+ $buf =~ s/\r/\n/g if $mode == 1;
+ $buf =~ s/[\r\x00]//g if $mode == 2 || $mode == 3;
+
$dangle = !($buf =~ /\n$/);
if ($buf eq "\n") {
@lines = (" ");
my ($host, $port) = split /\s+/, $line;
$port = 23 if !$port;
-# if ($port == 23) {
-
- $sock = new Net::Telnet (Timeout => $timeout, Port => $port);
- $sock->option_callback(\&optioncb);
- $sock->output_record_separator('');
-# $sock->option_log('option_log');
-# $sock->dump_log('dump');
- $sock->option_accept(Dont => TELOPT_ECHO, Wont => TELOPT_ECHO);
- $sock->open($host) or die "Can't connect to $host port $port $!";
-# } else {
-# $sock = IO::Socket::INET->new(PeerAddr => "$host:$port", Proto => 'tcp')
-# or die "Can't connect to $host port $port $!";
-# }
+ $sock = new Net::Telnet (Timeout => $timeout, Port => $port);
+ $sock->option_callback(\&optioncb);
+ $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 = 3;
} elsif ($sort eq 'ax25' || $sort eq 'prog') {
my @args = split /\s+/, $line;
$rfh = new IO::File;
die "no transmit channel $!" unless $wfh;
dbg('connect', "got pid $pid");
$wfh->autoflush(1);
+ $mode = 1;
} else {
die "invalid type of connection ($sort)";
}
if ($csort eq 'telnet') {
$line = $sock->get();
cease(11) unless $line; # the socket has gone away?
- $line =~ s/\r\n/\n/og;
+ if (length $line == 0) {
+ dbg('connect', "received 0 length line, aborting...");
+ cease(11);
+ }
+ $line =~ s/\r//g;
chomp;
} elsif ($csort eq 'ax25' || $csort eq 'prog') {
local $/ = "\r";
$line = <$rfh>;
- $line =~ s/\r//og;
- }
- if (length $line == 0) {
- dbg('connect', "received 0 length line, aborting...");
- cease(11);
+ if (length $line == 0) {
+ dbg('connect', "received 0 length line, aborting...");
+ cease(11);
+ }
+ $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);
$outbound = 1;
$connsort = $csort;
$stdout->autoflush(1);
+ $mode = ($connsort eq 'ax25') ? 1 : $mode;
close STDIN;
close STDOUT;
close STDERR;
}
-$mode = ($connsort eq 'ax25') ? 1 : 2;
setmode();
# adjust the callsign if it has an SSID, SSID <= 8 are legal > 8 are netrom connections