Blame


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