/* Code style: -*- linux-c -*- */ /* File : xfw/find/grab_ips_from_net.c */ #include #include "range.h" #include #include 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; } .