plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

Linux.c (1157B)


      1 #include <u.h>
      2 #include <sys/socket.h>
      3 #include <net/if.h>
      4 #include <netpacket/packet.h>
      5 #include <net/ethernet.h>
      6 #include <netinet/in.h>
      7 #include <sys/ioctl.h>
      8 #include <libc.h>
      9 #include <ip.h>
     10 #include <bio.h>
     11 #include <fcall.h>
     12 #include <libsec.h>
     13 #include "dat.h"
     14 #include "protos.h"
     15 #include "y.tab.h"
     16 
     17 int
     18 opendevice(char *dev, int promisc)
     19 {
     20 	int fd;
     21 	struct ifreq ifr;
     22 	struct sockaddr_ll sa;
     23 
     24 	if((fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0)
     25 		return -1;
     26 
     27 	if(dev){
     28 		memset(&ifr, 0, sizeof ifr);
     29 		strncpy(ifr.ifr_name, dev, sizeof ifr.ifr_name);
     30 		if(ioctl(fd, SIOCGIFINDEX, &ifr) < 0){
     31 			close(fd);
     32 			return -1;
     33 		}
     34 		memset(&sa, 0, sizeof sa);
     35 		sa.sll_family = AF_PACKET;
     36 		sa.sll_protocol = htons(ETH_P_ALL);
     37 		sa.sll_ifindex = ifr.ifr_ifindex;
     38 		if(bind(fd, (struct sockaddr*)&sa, sizeof sa) < 0){
     39 			close(fd);
     40 			return -1;
     41 		}
     42 	}
     43 
     44 	if(promisc){
     45 		memset(&ifr, 0, sizeof ifr);
     46 		strncpy(ifr.ifr_name, dev, sizeof ifr.ifr_name);
     47 		if(ioctl(fd, SIOCGIFFLAGS, &ifr) < 0){
     48 			close(fd);
     49 			return -1;
     50 		}
     51 		ifr.ifr_flags |= IFF_PROMISC;
     52 		if(ioctl(fd, SIOCSIFFLAGS, &ifr) < 0){
     53 			close(fd);
     54 			return -1;
     55 		}
     56 	}
     57 	return fd;
     58 }