13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <arpa/inet.h>
22 #include "pcap/funcattrs.h"
24 static int ifprint(pcap_if_t *d);
25 static char *iptos(bpf_u_int32 in);
28 #include "portability.h"
31 * Generate a string for a Win32-specific error (i.e. an error generated when
32 * calling a Win32 API).
33 * For errors occurred during standard C calls, we still use pcap_strerror()
35 #define ERRBUF_SIZE 1024
37 win32_strerror(DWORD error)
39 static char errbuf[ERRBUF_SIZE+1];
42 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, 0, errbuf,
46 * "FormatMessage()" "helpfully" sticks CR/LF at the end of the
47 * message. Get rid of it.
49 errlen = strlen(errbuf);
51 errbuf[errlen - 1] = '\0';
52 errbuf[errlen - 2] = '\0';
59 getpass(const char *prompt)
61 HANDLE console_handle = GetStdHandle(STD_INPUT_HANDLE);
62 DWORD console_mode, save_console_mode;
63 static char password[128+1];
66 fprintf(stderr, "%s", prompt);
71 if (!GetConsoleMode(console_handle, &console_mode)) {
72 fprintf(stderr, "Can't get console mode: %s\n",
73 win32_strerror(GetLastError()));
76 save_console_mode = console_mode;
77 console_mode &= ~ENABLE_ECHO_INPUT;
78 if (!SetConsoleMode(console_handle, console_mode)) {
79 fprintf(stderr, "Can't set console mode: %s\n",
80 win32_strerror(GetLastError()));
83 if (fgets(password, sizeof password, stdin) == NULL) {
84 fprintf(stderr, "\n");
85 SetConsoleMode(console_handle, save_console_mode);
88 fprintf(stderr, "\n");
89 SetConsoleMode(console_handle, save_console_mode);
90 p = strchr(password, '\n');
97 int main(int argc, char **argv)
101 bpf_u_int32 net, mask;
103 char errbuf[PCAP_ERRBUF_SIZE+1];
105 struct pcap_rmtauth auth;
106 char username[128+1];
114 if (pcap_findalldevs_ex(argv[1], NULL, &alldevs, errbuf) == -1)
117 * OK, try it with a user name and password.
119 fprintf(stderr, "User name: ");
120 if (fgets(username, sizeof username, stdin) == NULL)
122 p = strchr(username, '\n');
125 password = getpass("Password: ");
126 auth.type = RPCAP_RMTAUTH_PWD;
127 auth.username = username;
128 auth.password = password;
129 if (pcap_findalldevs_ex(argv[1], &auth, &alldevs, errbuf) == -1)
131 fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
139 if (pcap_findalldevs(&alldevs, errbuf) == -1)
141 fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
145 for(d=alldevs;d;d=d->next)
153 if (pcap_lookupnet(alldevs->name, &net, &mask, errbuf) < 0)
155 fprintf(stderr,"Error in pcap_lookupnet: %s\n",errbuf);
160 printf("Preferred device is on network: %s/%s\n",iptos(net), iptos(mask));
164 pcap_freealldevs(alldevs);
168 static int ifprint(pcap_if_t *d)
171 char ipv4_buf[INET_ADDRSTRLEN];
172 char ipv6_buf[INET6_ADDRSTRLEN];
174 int status = 1; /* success */
176 printf("%s\n",d->name);
178 printf("\tDescription: %s\n",d->description);
181 if (d->flags & PCAP_IF_UP) {
185 if (d->flags & PCAP_IF_RUNNING) {
186 printf("%sRUNNING", sep);
189 if (d->flags & PCAP_IF_LOOPBACK) {
190 printf("%sLOOPBACK", sep);
193 if (d->flags & PCAP_IF_WIRELESS) {
194 printf("%sWIRELESS", sep);
195 switch (d->flags & PCAP_IF_CONNECTION_STATUS) {
197 case PCAP_IF_CONNECTION_STATUS_UNKNOWN:
198 printf(" (association status unknown)");
201 case PCAP_IF_CONNECTION_STATUS_CONNECTED:
202 printf(" (associated)");
205 case PCAP_IF_CONNECTION_STATUS_DISCONNECTED:
206 printf(" (not associated)");
209 case PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE:
213 switch (d->flags & PCAP_IF_CONNECTION_STATUS) {
215 case PCAP_IF_CONNECTION_STATUS_UNKNOWN:
216 printf(" (connection status unknown)");
219 case PCAP_IF_CONNECTION_STATUS_CONNECTED:
220 printf(" (connected)");
223 case PCAP_IF_CONNECTION_STATUS_DISCONNECTED:
224 printf(" (disconnected)");
227 case PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE:
234 for(a=d->addresses;a;a=a->next) {
236 switch(a->addr->sa_family) {
238 printf("\tAddress Family: AF_INET\n");
240 printf("\t\tAddress: %s\n",
242 &((struct sockaddr_in *)(a->addr))->sin_addr,
243 ipv4_buf, sizeof ipv4_buf));
245 printf("\t\tNetmask: %s\n",
247 &((struct sockaddr_in *)(a->netmask))->sin_addr,
248 ipv4_buf, sizeof ipv4_buf));
250 printf("\t\tBroadcast Address: %s\n",
252 &((struct sockaddr_in *)(a->broadaddr))->sin_addr,
253 ipv4_buf, sizeof ipv4_buf));
255 printf("\t\tDestination Address: %s\n",
257 &((struct sockaddr_in *)(a->dstaddr))->sin_addr,
258 ipv4_buf, sizeof ipv4_buf));
262 printf("\tAddress Family: AF_INET6\n");
264 printf("\t\tAddress: %s\n",
266 ((struct sockaddr_in6 *)(a->addr))->sin6_addr.s6_addr,
267 ipv6_buf, sizeof ipv6_buf));
269 printf("\t\tNetmask: %s\n",
271 ((struct sockaddr_in6 *)(a->netmask))->sin6_addr.s6_addr,
272 ipv6_buf, sizeof ipv6_buf));
274 printf("\t\tBroadcast Address: %s\n",
276 ((struct sockaddr_in6 *)(a->broadaddr))->sin6_addr.s6_addr,
277 ipv6_buf, sizeof ipv6_buf));
279 printf("\t\tDestination Address: %s\n",
281 ((struct sockaddr_in6 *)(a->dstaddr))->sin6_addr.s6_addr,
282 ipv6_buf, sizeof ipv6_buf));
286 printf("\tAddress Family: Unknown (%d)\n", a->addr->sa_family);
291 fprintf(stderr, "\tWarning: a->addr is NULL, skipping this address.\n");
299 /* From tcptraceroute */
300 #define IPTOSBUFFERS 12
301 static char *iptos(bpf_u_int32 in)
303 static char output[IPTOSBUFFERS][3*4+3+1];
308 which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
309 sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
310 return output[which];