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
);
195 for(a
=d
->addresses
;a
;a
=a
->next
) {
197 switch(a
->addr
->sa_family
) {
199 printf("\tAddress Family: AF_INET\n");
201 printf("\t\tAddress: %s\n",
203 &((struct sockaddr_in
*)(a
->addr
))->sin_addr
,
204 ipv4_buf
, sizeof ipv4_buf
));
206 printf("\t\tNetmask: %s\n",
208 &((struct sockaddr_in
*)(a
->netmask
))->sin_addr
,
209 ipv4_buf
, sizeof ipv4_buf
));
211 printf("\t\tBroadcast Address: %s\n",
213 &((struct sockaddr_in
*)(a
->broadaddr
))->sin_addr
,
214 ipv4_buf
, sizeof ipv4_buf
));
216 printf("\t\tDestination Address: %s\n",
218 &((struct sockaddr_in
*)(a
->dstaddr
))->sin_addr
,
219 ipv4_buf
, sizeof ipv4_buf
));
223 printf("\tAddress Family: AF_INET6\n");
225 printf("\t\tAddress: %s\n",
227 ((struct sockaddr_in6
*)(a
->addr
))->sin6_addr
.s6_addr
,
228 ipv6_buf
, sizeof ipv6_buf
));
230 printf("\t\tNetmask: %s\n",
232 ((struct sockaddr_in6
*)(a
->netmask
))->sin6_addr
.s6_addr
,
233 ipv6_buf
, sizeof ipv6_buf
));
235 printf("\t\tBroadcast Address: %s\n",
237 ((struct sockaddr_in6
*)(a
->broadaddr
))->sin6_addr
.s6_addr
,
238 ipv6_buf
, sizeof ipv6_buf
));
240 printf("\t\tDestination Address: %s\n",
242 ((struct sockaddr_in6
*)(a
->dstaddr
))->sin6_addr
.s6_addr
,
243 ipv6_buf
, sizeof ipv6_buf
));
247 printf("\tAddress Family: Unknown (%d)\n", a
->addr
->sa_family
);
252 fprintf(stderr
, "\tWarning: a->addr is NULL, skipping this address.\n");
260 /* From tcptraceroute */
261 #define IPTOSBUFFERS 12
262 static char *iptos(bpf_u_int32 in
)
264 static char output
[IPTOSBUFFERS
][3*4+3+1];
269 which
= (which
+ 1 == IPTOSBUFFERS
? 0 : which
+ 1);
270 sprintf(output
[which
], "%d.%d.%d.%d", p
[0], p
[1], p
[2], p
[3]);
271 return output
[which
];