X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/2fa88fe1a328847927e6c991adaeecc6983856a0..052094d865be2d613f1e0ec7c220f9e4d38a0b22:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index 625e5df6..25feb7a0 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -275,6 +275,15 @@ static struct printer printers[] = { #endif #if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H) { bt_if_print, DLT_BLUETOOTH_HCI_H4_WITH_PHDR}, +#endif +#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX) + { usb_linux_print, DLT_USB_LINUX}, +#endif +#if defined(HAVE_PCAP_USB_H) && defined(DLT_USB_LINUX_MMAPPED) + { usb_linux_print, DLT_USB_LINUX_MMAPPED}, +#endif +#ifdef DLT_IPNET + { ipnet_if_print, DLT_IPNET }, #endif { NULL, 0 }, }; @@ -545,6 +554,9 @@ main(int argc, char **argv) case 'A': ++Aflag; break; + case 'b': + ++bflag; + break; #if defined(HAVE_PCAP_CREATE) || defined(WIN32) case 'B': @@ -646,11 +658,17 @@ main(int argc, char **argv) if (pcap_findalldevs(&devpointer, ebuf) < 0) error("%s", ebuf); else { - for (i = 0; i < devnum-1; i++){ - devpointer = devpointer->next; - if (devpointer == NULL) - error("Invalid adapter index"); - } + /* + * Look for the devnum-th entry + * in the list of devices + * (1-based). + */ + for (i = 0; + i < devnum-1 && devpointer != NULL; + i++, devpointer = devpointer->next) + ; + if (devpointer == NULL) + error("Invalid adapter index"); } device = devpointer->name; break; @@ -745,10 +763,10 @@ main(int argc, char **argv) snaplen = strtol(optarg, &end, 0); if (optarg == end || *end != '\0' - || snaplen < 0 || snaplen > 65535) + || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN) error("invalid snaplen %s", optarg); else if (snaplen == 0) - snaplen = 65535; + snaplen = MAXIMUM_SNAPLEN; break; } @@ -1073,6 +1091,7 @@ main(int argc, char **argv) if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0) error("%s", pcap_geterr(pd)); + free(cmdbuf); if (dflag) { bpf_dump(&fcode, dflag); pcap_close(pd); @@ -1128,10 +1147,10 @@ main(int argc, char **argv) if (printinfo.printer == NULL) { gndo->ndo_dltname = pcap_datalink_val_to_name(type); if (gndo->ndo_dltname != NULL) - error("unsupported data link type %s", + error("packet printing is not supported for link type %s: use -w", gndo->ndo_dltname); else - error("unsupported data link type %d", type); + error("packet printing is not supported for link type %d: use -w", type); } callback = print_packet; pcap_userdata = (u_char *)&printinfo; @@ -1287,6 +1306,11 @@ info(register int verbose) { struct pcap_stat stat; + /* + * Older versions of libpcap didn't set ps_ifdrop on some + * platforms; initialize it to 0 to handle that. + */ + stat.ps_ifdrop = 0; if (pcap_stats(pd, &stat) < 0) { (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd)); infoprint = 0; @@ -1301,12 +1325,21 @@ info(register int verbose) fputs(", ", stderr); else putc('\n', stderr); - (void)fprintf(stderr, "%d packets received by filter", stat.ps_recv); + (void)fprintf(stderr, "%u packets received by filter", stat.ps_recv); if (!verbose) fputs(", ", stderr); else putc('\n', stderr); - (void)fprintf(stderr, "%d packets dropped by kernel\n", stat.ps_drop); + (void)fprintf(stderr, "%u packets dropped by kernel", stat.ps_drop); + if (stat.ps_ifdrop != 0) { + if (!verbose) + fputs(", ", stderr); + else + putc('\n', stderr); + (void)fprintf(stderr, "%u packets dropped by interface\n", + stat.ps_ifdrop); + } else + putc('\n', stderr); infoprint = 0; } @@ -1324,7 +1357,7 @@ compress_savefile(const char *filename) #else setpriority(PRIO_PROCESS, 0, 19); #endif - if (execlp(zflag, zflag, filename, NULL) == -1) + if (execlp(zflag, zflag, filename, (char *)NULL) == -1) fprintf(stderr, "compress_savefile:execlp(%s, %s): %s\n", zflag,