Diffstat (limited to 'noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | 66 |
1 files changed, 59 insertions, 7 deletions
diff --git a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc index d462488..def1a4b 100644 --- a/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc +++ b/noncore/net/wellenreiter/libwellenreiter/source/cardmode.cc | |||
@@ -71,11 +71,63 @@ int card_into_monitormode (pcap_t **orighandle, char *device, int cardtype) | |||
71 | /* Set card into promisc mode */ | 71 | /* Set card into promisc mode */ |
72 | int card_set_promisc_up (const char *device) | 72 | int card_set_promisc_up (const char *device) |
73 | { | 73 | { |
74 | char ifconfigcmd[48]; | 74 | struct ifconf ifc; |
75 | int retval=0; | 75 | struct ifreq ifr_x[50]; |
76 | 76 | u_int i; | |
77 | snprintf(ifconfigcmd, sizeof(ifconfigcmd) - 1, SBIN_PATH, device); | 77 | int sockfd, err; |
78 | retval = system(ifconfigcmd); | 78 | err=0; |
79 | 79 | /* opening a socket for issuing the iocalls */ | |
80 | return (retval ? 0 : 1); | 80 | sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); |
81 | |||
82 | if (sockfd < 0) | ||
83 | { | ||
84 | /* In case of an error - mjm proove that please*/ | ||
85 | perror("socket"); | ||
86 | return 1; | ||
87 | } | ||
88 | /* Define room for 50 interfaces */ | ||
89 | ifc.ifc_len = 50 * sizeof(struct ifreq); | ||
90 | ifc.ifc_req = ifr_x; | ||
91 | /* Get the config of the interfaces */ | ||
92 | err = ioctl(sockfd, SIOCGIFCONF, &ifc); | ||
93 | if (err == -1) return 1; | ||
94 | |||
95 | /* For each interface*/ | ||
96 | for (i = 0; i < ifc.ifc_len / sizeof(struct ifreq); i++) | ||
97 | { | ||
98 | /* To complete , should get the IP, if no is assigned, asign one */ | ||
99 | /*err = ioctl(sockfd, SIOCGIFADDR, &ifr_x[i]); | ||
100 | if (err == -1) perror("SIOCGIFADDR: "); | ||
101 | printf ("Address: %s\n",Sock_ntop_host(ifr_x[i].ifr_addr.sa_family,sizeof(ifr_x[i].ifr_addr.sa_family))); | ||
102 | */ | ||
103 | if(strncmp(ifr_x[i].ifr_name,device,5) == 0) | ||
104 | { | ||
105 | /* Get the flags */ | ||
106 | err = ioctl(sockfd, SIOCGIFFLAGS, &ifr_x[i]); | ||
107 | if (err == -1) | ||
108 | { | ||
109 | perror("SIOCGIFFLAGS: "); | ||
110 | return 1; | ||
111 | } | ||
112 | /* Check if the Interface is UP and PROMISC */ | ||
113 | if (ifr_x[i].ifr_flags & IFF_PROMISC && ifr_x[i].ifr_flags & IFF_UP) | ||
114 | { | ||
115 | /* only debug text */ | ||
116 | printf ("%s is PROMISC and UP \n",ifr_x[i].ifr_name); | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | /* Set the promisc flag to the interface */ | ||
121 | ifr_x[i].ifr_flags=ifr_x[i].ifr_flags+IFF_PROMISC; | ||
122 | err = ioctl(sockfd, SIOCSIFFLAGS, &ifr_x[i]); | ||
123 | if (err == -1) | ||
124 | { | ||
125 | /* Could not set the interface into promisc mode */ | ||
126 | perror("SIOCSIFFLAGS: "); | ||
127 | } | ||
128 | } | ||
129 | } | ||
130 | } | ||
131 | /* All is fine */ | ||
132 | return 0; | ||
81 | } | 133 | } |