#include <stdlib.h>
#include <arpa/inet.h>
#include <pcap.h>
#include <assert.h>

int
main (void)
{
  char *dev;
  char errbuf[PCAP_ERRBUF_SIZE];
  pcap_t *capture = NULL;
  bpf_u_int32 netp = 0;
  bpf_u_int32 maskp = 0;
  char *filter_string = "port 7600";
  struct bpf_program filter;
  int retcode = 0;
  struct in_addr addr;
  char *net = NULL;

  setbuf (stdout, NULL);

  dev = pcap_lookupdev (errbuf);
  if (NULL == dev)
    {
      printf ("pcap_lookupdev() failed: ");
      printf ("%s\n", errbuf);
    }

  printf ("using dev = %s\n", dev);

  retcode = pcap_lookupnet (dev, &netp, &maskp, errbuf);
  if (-1 == retcode)
    {
      printf ("pcap_lookupnet() failed: ");
      printf ("(%s) %s\n", errbuf, pcap_geterr (capture));
    }

  addr.s_addr = netp;
  net = inet_ntoa (addr);
  if (NULL == net)
    {
      printf ("inet_ntoa returned null\n");
    }

  printf ("using net = %s\n", net);

  addr.s_addr = maskp;
  net = inet_ntoa (addr);
  if (NULL == net)
    {
      printf ("inet_ntoa returned null for mask\n");
      exit (1);
    }

  printf ("using mask = %s\n", net);

  assert (capture = pcap_open_live (dev, 500, 0, 5000, errbuf));
  retcode = pcap_compile (capture, &filter, filter_string, 0, netp);
  if (-1 == retcode)
    {
      printf ("pcap_compile(%s) failed: ", filter_string);
      printf ("%s\n", pcap_geterr (capture));
    }

  retcode = pcap_setfilter (capture, &filter);
  if (-1 == retcode)
    {
      printf ("pcap_setfilter(%s) failed: ", filter_string);
      printf ("%s\n", pcap_geterr (capture));
    }
  pcap_close (capture);

  return 0;
}
