#include #include #include #include #include #include #include #include #include #include #include #include #include "dat.h" #include "protos.h" #include "y.tab.h" int opendevice(char *dev, int promisc) { int fd; struct ifreq ifr; struct sockaddr_ll sa; if((fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) return -1; if(dev){ memset(&ifr, 0, sizeof ifr); strncpy(ifr.ifr_name, dev, sizeof ifr.ifr_name); if(ioctl(fd, SIOCGIFINDEX, &ifr) < 0){ close(fd); return -1; } memset(&sa, 0, sizeof sa); sa.sll_family = AF_PACKET; sa.sll_protocol = htons(ETH_P_ALL); sa.sll_ifindex = ifr.ifr_ifindex; if(bind(fd, (struct sockaddr*)&sa, sizeof sa) < 0){ close(fd); return -1; } } if(promisc){ memset(&ifr, 0, sizeof ifr); strncpy(ifr.ifr_name, dev, sizeof ifr.ifr_name); if(ioctl(fd, SIOCGIFFLAGS, &ifr) < 0){ close(fd); return -1; } ifr.ifr_flags |= IFF_PROMISC; if(ioctl(fd, SIOCSIFFLAGS, &ifr) < 0){ close(fd); return -1; } } return fd; }