#!/usr/bin/perl
# This is a network sniffer that does nothing with it's data, other
# than setting a timer so that when data stops, we react.
#
# $Source: /cvs/failoverd/watchd,v $
# $Revision: 1.13 $ 
# $Date: 1999/06/07 19:06:27 $
# sub init --> get values to run with- NIC, network, etc.
# sub dotquad --> get network numbers reliably.

## fork
my $pid;
unless ( $pid = fork) {
  unless (fork) {

use strict;
use Net::Pcap;
use Failover;
use vars qw($network0 $retry $pcap_t0 $pcap_dumper_t0);
use vars qw($dev $net0 $mask0 $err0 $linktype );

chomp((@{$dev}[0]) = $ARGV[0]);

$0 = "watchd (@{$dev}[0])";
 my $device = \@{$dev};

  logger("watchd($$device[0]) booting as $type");
  logger("watchd version $version");
  logger("watchd($$device[0]) Timer: $timer_seconds");
  if ( $$device[4]  == 0 ) {
      logger("watchd($$device[0]) low_water is 0, never failing");
    }
    
    setup_dump();
    timer($timer_seconds);

    Net::Pcap::loop($pcap_t0, -1, \&pcap_callback, ''); 
        sub pcap_callback {
           ($$device[2])++; 
        } # pcap_callback

sub setup_dump {
   my $dev = ($$device[0]);
	if ($dev eq "" ) { 
		logger("watchd no interface specified");
	        exit(1);	
         } elsif ( $dev eq "$plip_interface" ) {
                logger("watchd cannot monitor $plip_interface");
                logger("watchd $plip_interface is handled seperately");
                exit(1);
	} else {
		logger("watchd using interface: $dev");
	}

   $network0 = Net::Pcap::lookupnet($dev, \$net0, \$mask0, \$err0);
	if ($network0 == -1) {
		logger("watchd($dev) cannot determine network, exiting");
		exit(1);
	} else {
		my $net0 = (dotquad($net0));
		my $nm0 = (dotquad($mask0));
		logger("watchd($dev) Net : $net0");
 		logger("watchd($dev) Mask: $nm0");
	} # if $network0

# this tells Pcap how much to take from each packet.  See manpage.

 $pcap_t0 = Net::Pcap::open_live($dev, $packet_count, 0, $read_timeout, \$err0);
  logger("watchd($dev) Timeout: $read_timeout Packet Count: $packet_count");
	if ( !defined($pcap_t0)) {
		logger("Error opening $dev for snooping: $err0");
		exit(1);
	}
  } # setup_dump

 sub dotquad {
	my($na, $nb, $nc, $nd);
	my ( $net ) = @_ ;
	$na=$net >> 24 & 255 ;
	$nb=$net >> 16 & 255 ;
	$nc=$net >>  8 & 255 ;
	$nd=$net & 255 ;
	return ( "$na.$nb.$nc.$nd") ;
   } # sub dotquad

  } # unless pid=fork
} # unless fork

