Listing 4. /home/ejb/moni/monitor.pl

#!/usr/bin/perl -Tw
use strict;
my $FIFO = '/tmp/tricky.fifo';
my $DIALDCTL = '/etc/diald/diald.ctl';
my $STATUS = '/tmp/diald.status';
my $st = 0;
my $dialdState = "DOWN";
$SIG{CHLD} = sub { wait };
unless (-p $FIFO) {
   unlink $FIFO;
   system('/usr/bin/mkfifo','-m','666',$FIFO)  &&
     die "Can't mkfifo $FIFO: $!";
}

my $pid;

if ($pid = fork) {
   open (FIFO, "< $FIFO") ||
     die "can't read $FIFO: $!";
} elsif (defined $pid) {
   open (DIALDCTL, "> $DIALDCTL") ||
     die "can't open $DIALDCTL: $!";
   print DIALDCTL "monitor $FIFO\n";
   close DIALDCTL;
   exit;
} else {
   die "Can't fork: $!\n";
}
my $msg = 0;
open (STATUS, "> $STATUS") ||
  die "can't open status file $STATUS: $!";
select STATUS;
$| = 1;  # set flush-on-write
while (<FIFO>)
{
   if ($st == 1) {
      $st = 0;
      if (m/^CONNECT/) {
         close STATUS;
         unlink $STATUS;
         open (STATUS, "> $STATUS") || die
            "can't open status file $STATUS: $!";
         select STATUS;
      }
      print;
   }
   if ($msg == 1) {
      $msg = 0;
      print;
   }
   if (m/^STATE/) {
      $st = 1;
   }
   elsif (m/^MESSAGE/) {
      $msg = 1;
   }
}