The IPADM Helper, ipadmh

The helper completes the communications link between ipadm and ipadmd by opening a socket. By far the easiest way of doing this is to use the IO::Socket module. ipadm provides the @ARGV values for the PeerAddr and PeerPort parameters, which specify the remote machine and port to contact. The connect status is piped to the Perl/Tk client by writing a message to STDOUT.

The helper then enters its main loop, transferring client IPADM commands over the socket to the daemon and piping responses back.

Notice that the helper is free to use signals, in particular SIGALRM, so it can timeout network reads and inform the client.

sub timeout {print "1 Socket Timeout\n$EOFn"; $SIG{ALRM} = \&timeout}
$SIG{PIPE} = sub {print "2 Pipe Error.\n$EOF\n"};

my $sock = IO::Socket::INET->new( PeerAddr => $ARGV[0],
                  Proto => 'tcp', PeerPort => $ARGV[1]);
print +((defined $sock) ? "0 Connect OK" : "3 Connect Failed"), "\n$EOF\n";

while (1) {

    while(<STDIN>) {
        print $sock $_;         # send parent's command/data to daemon
        last if /^$EOF$/;
    }

    my(@data) = (  );
    $SIG{ALRM} = \&timeout;     # reset handler
    alarm 60;

    while (<$sock>) {
        push @data, $_;         # accumulate command's reply
        last if /^$EOF$/;
    }

    alarm 0;
    print (/^$EOF$/ ? @data : "4 Daemon Failure\n$EOF\n");

} # whilend

Get Mastering Perl/Tk now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.