/* 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;
}