rscnew goodies4d5929e20 years agoHistory
58 lines · 1.1 KB · C
RawDownload
#include <u.h>#include <sys/socket.h>#include <net/if.h>#include <netpacket/packet.h>#include <net/ethernet.h>#include <netinet/in.h>#include <sys/ioctl.h>#include <libc.h>#include <ip.h>#include <bio.h>#include <fcall.h>#include <libsec.h>#include "dat.h"#include "protos.h"#include "y.tab.h" intopendevice(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;}