From 15ee0303d77c205e68144dfd8d8a4e0110bbe5ea Mon Sep 17 00:00:00 2001 From: minima Date: Wed, 14 Mar 2001 01:23:35 +0000 Subject: [PATCH] first cut at outgoing ax25 / external connects --- Changes | 2 ++ perl/DXCron.pm | 11 ++--------- perl/ExtMsg.pm | 31 +++++++++++++++++++++++++++++-- perl/Msg.pm | 3 +-- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/Changes b/Changes index 31774c13..5d94c2c9 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ +14Mar01======================================================================= +1. first cut at outgoing ax25 /external program connects 13Mar01======================================================================= 1. implemented first cut at non blocking connect 2. removed memory leakage in connects diff --git a/perl/DXCron.pm b/perl/DXCron.pm index 5bb12422..1c698f75 100644 --- a/perl/DXCron.pm +++ b/perl/DXCron.pm @@ -217,14 +217,7 @@ sub disconnect { my $call = uc shift; my $dxchan = DXChannel->get($call); - if ($dxchan) { - if ($dxchan->is_ak1a) { - $dxchan->send_now("D", DXProt::pc39($main::mycall, "$main::mycall DXCron")); - } else { - $dxchan->send_now('D', ""); - } - $dxchan->disconnect; - } + $dxchan->disconnect if $dxchan; } # start a connect process off @@ -255,7 +248,6 @@ sub spawn # in child, unset warnings, disable debugging and general clean up from us $^W = 0; eval "{ package DB; sub DB {} }"; - alarm(0); DXChannel::closeall(); for (@main::listeners) { $_->close_server; @@ -263,6 +255,7 @@ sub spawn unless ($^O =~ /^MS/) { $SIG{HUP} = 'IGNORE'; $SIG{CHLD} = $SIG{TERM} = $SIG{INT} = $SIG{__WARN__} = 'DEFAULT'; + alarm(0); } exec "$line" or dbg('cron', "exec '$line' failed $!"); } diff --git a/perl/ExtMsg.pm b/perl/ExtMsg.pm index 01a30924..6ea47a51 100644 --- a/perl/ExtMsg.pm +++ b/perl/ExtMsg.pm @@ -58,6 +58,9 @@ sub dequeue my $conn = shift; my $msg; + if ($conn->{sort} eq 'ax25' && exists $conn->{msg}) { + $conn->{msg} =~ s/\cM/\cJ/g; + } if ($conn->{state} eq 'WC') { if (exists $conn->{cmd}) { if (@{$conn->{cmd}}) { @@ -193,7 +196,8 @@ sub _doconnect { my ($conn, $sort, $line) = @_; my $r; - + + $sort = lc $sort; dbg('connect', "CONNECT sort: $sort command: $line"); if ($sort eq 'telnet') { # this is a straight network connect @@ -206,7 +210,30 @@ sub _doconnect dbg('connect', "***Connect Failed to $host $port $!"); } } elsif ($sort eq 'ax25' || $sort eq 'prog') { - ; + my $pid = fork(); + if (defined $pid) { + if (!$pid) { + # in child, unset warnings, disable debugging and general clean up from us + $^W = 0; + eval "{ package DB; sub DB {} }"; + DXChannel::closeall(); + for (@main::listeners) { + $_->close_server; + } + unless ($^O =~ /^MS/) { + $SIG{HUP} = 'IGNORE'; + $SIG{CHLD} = $SIG{TERM} = $SIG{INT} = $SIG{__WARN__} = 'DEFAULT'; + alarm(0); + } + exec "$line" or dbg('cron', "exec '$line' failed $!"); + } + dbg('connect', "program $sort $line started"); + $conn->{pid} = $pid; + $conn->{sort} = $sort; + $conn->{lineend} = "\cM" if $sort eq 'ax25'; + } else { + dbg('connect', "can't $sort fork for $line $!"); + } } else { dbg('err', "invalid type of connection ($sort)"); $conn->disconnect; diff --git a/perl/Msg.pm b/perl/Msg.pm index f3dec8b1..eb6892a8 100644 --- a/perl/Msg.pm +++ b/perl/Msg.pm @@ -167,8 +167,6 @@ sub disconnect { $call ||= 'unallocated'; dbg('connll', "Connection $call disconnected"); - set_event_handler ($sock, read => undef, write => undef, error => undef); - unless ($^O =~ /^MS/i) { kill 'TERM', $conn->{pid} if exists $conn->{pid}; } @@ -181,6 +179,7 @@ sub disconnect { } return unless defined($sock); + set_event_handler ($sock, read => undef, write => undef, error => undef); shutdown($sock, 3); close($sock); } -- 2.34.1