for ($deadline = time() + 5; $deadline < time();) {
$dead = waitpid($kid, &WNOHANG);
return 1 if $dead == $kid;
sleep 1;
}
# Ask nicely...
return 1 if kill("TERM", $kid) == 0;
# Wait 10 seconds to see if they've got manners.
for ($deadline = time() + 10; $deadline < time();) {
$dead = waitpid($kid, &WNOHANG);
return 1 if $dead == $kid;
sleep 1;
}
# No more Mister Nice Guy....
return 1 if kill("KILL", $kid) == 0;
# Wait 15 seconds for the real death....
for ($deadline = time() + 15; $deadline < time();) {
$dead = waitpid($kid, &WNOHANG);
return 1 if $dead == $kid;
sleep 1;
}
# Nothing worked. Sigh...
return undef;
}
sub send
{
my($self, @data) = @_;
my $data = join("", @data);
trace("IO", "send: [[[[[$data]]]]]");
tracept("IO");
return if (!$self->{OUTPUT});
#$self->{send_data} .= $data;
#print "SEND: $data\n";
my $rc = syswrite($self->{OUTPUT}, $data, length($data));
$self->{seen_eof} = 1 if $rc <= 0;
$rc;
}
sub recv
{
my($self, $timeout) = @_;
my $data;
tracept("IO");
return if (!$self->{INPUT});
#print "SSF:\n",$self->{send_data},"\n";
#print "Going to sysread...\n";
my $len = sysread($self->{INPUT}, $data, 0x2000);
#print "Done sysread $len\n";
$self->{seen_eof} = 1 if $len < 0;
$self->{seen_eof} = 1 if $len == 0 && eof($self->{INPUT});
if ($len == 0) {
$self->{JUNOS_Device}->report_error("recv failed: " . (eof($self->{INPUT}) ? "EOF" : "dead"));
return;
}
#print "RECV: $data\n";
trace("IO", "recv: $len [[[[[$data]]]]]");
$data;
}
#
# Have we hit end-of-file yet?
#
sub eof
{
my($self) = @_;
$self->{seen_eof};
}
#
# start a command using unix-domain socket pairs; not currently used
#
sub start_command_sockets
{
my $self = shift;
tracept("IO");
my($s1a, $s1b) = IO::Socket->socketpair(AF_UNIX, SOCK_STREAM, 0);
my($s2a, $s2b) = IO::Socket->socketpair(AF_UNIX, SOCK_STREAM, 0);
my $pid = fork;
if ($pid < 0) {
$self->{JUNOS_Device}->report_error("fork failed");
return;
} elsif ($pid == 0) {
trace("Child", "Child $pid/", $$, " cmd: ", join(" ", @_));
=2= |