]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
updated print-ipnet.c to use netdissect options structure
[tcpdump] / tcpdump.c
index 625e5df65a37e79b4c81aa783add8cfb6cc747c0..25feb7a04457083ffa55abc51ee0c9eb0b1a80e4 100644 (file)
--- 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,