From 87a52e0485d3281ebea6bf4b725aa8023690e96f Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 26 Dec 2005 04:48:52 +0000 Subject: new goodies --- src/cmd/ip/snoopy/Linux.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/cmd/ip/snoopy/Linux.c (limited to 'src/cmd/ip/snoopy/Linux.c') diff --git a/src/cmd/ip/snoopy/Linux.c b/src/cmd/ip/snoopy/Linux.c new file mode 100644 index 00000000..20bc899c --- /dev/null +++ b/src/cmd/ip/snoopy/Linux.c @@ -0,0 +1,58 @@ +#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; +} -- cgit v1.2.3