/* Code style: -*- linux-c -*- */
/* File : xfw/find/grab_ips_from_net.c */

#include <stdio.h>
#include "range.h"
#include <sys/types.h>
#include <sys/socket.h>


struct ip_chain raw_list;


void grab_ips_from_net(void)
{
 int sd;
 int dest;
 char tmp[4];
 struct ifreq ifr, oldifr;
 struct sockaddr saddr;
 int sizeaddr;
 unsigned char buf[1600];
 int length;


 /* OPEN SOCKET */

 if ((sd = socket (AF_INET, SOCK_PACKET, htons (ETH_P_ALL))) < 0)
   {
     perror ("Can't get socket: ");
     exit (1);
   }

 /* SET PROMISC AND HOLD ONTO A COPY OF ORIGINAL STATE */

 strcpy (oldifr.ifr_name, "eth0");
 if (ioctl (sd, SIOCGIFFLAGS, &oldifr) < 0)
   {
     close (sd);
     perror ("Can't get flags: ");
     exit (2);
   }

 ifr = oldifr;
/*  ifr.ifr_flags |= IFF_PROMISC; */

 if (ioctl (sd, SIOCSIFFLAGS, &ifr) < 0)
   {
     close (sd);
     perror ("Can't set flags: ");
     exit (3);
   }

 while ( 1==1 ) {
   sizeaddr = 1600;
   length = recvfrom (sd, buf, 1600, 0, &saddr, &sizeaddr);

   /* if recvfrom() is interrupted by the sheduler, an EINTR happens. */

   if (length < 0 )
     continue;
   else {
     /* VERY hard coded - ip's at 26-29 inc & 30-33 inc*/

     dest = ((int)buf[30] << 24) +
       ((int)buf[31] << 16) +
         ((int)buf[32] << 8) +
           (int)buf[33];

     printf("src/dest: %s\n", ip_to_str(dest));

     new_ip = calloc(1, sizeof(ip_chain));
     new_ip.ip = dest
     new_ip.next = NULL;
     new_ip.prev =
   }
 }
}




int main()
{
 struct ip_chain start_raw_chain;

 start_raw_chain = calloc(1, sizeof(ip_chain));

 /* calloc does this but I'll do it anyway */
 start_raw_chain.prev = NULL;
 start_raw_chain.next = NULL;
 start_raw_chain.ip = 0;

 grab_ips_from_net(&start_raw_chain);

 return 0;
}