|  | #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" | 
|  |  | 
|  | 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; | 
|  | } |