]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Add printers for the Hilscher Ethernet link-layer types.
[tcpdump] / tcpdump.c
index 19318047f33f0c3169f850a2df10515e50f0329d..37ac27a76874aaffabb7bdd3748500c8ccb3515a 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -115,7 +115,8 @@ static void ndo_default_print(netdissect_options *, const u_char *, u_int);
 static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
 static void droproot(const char *, const char *);
-static void ndo_error(netdissect_options *ndo, const char *fmt, ...);
+static void ndo_error(netdissect_options *ndo, const char *fmt, ...)
+     __attribute__ ((noreturn, format (printf, 2, 3)));
 static void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
 
 #ifdef SIGINFO
@@ -133,10 +134,6 @@ RETSIGTYPE requestinfo(int);
 static void info(int);
 static u_int packets_captured;
 
-typedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *);
-typedef u_int (*if_ndo_printer)(struct netdissect_options *ndo,
-                                const struct pcap_pkthdr *, const u_char *);
-
 struct printer {
         if_printer f;
        int type;
@@ -314,11 +311,20 @@ static struct ndo_printer ndo_printers[] = {
 #endif
 #ifdef DLT_IEEE802_15_4_NOFCS
        { ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
+#endif
+#ifdef DLT_PPI
+       { ppi_if_print,         DLT_PPI },
+#endif
+#ifdef DLT_ETHERNET_HILSCHER
+       { ether_hilscher_if_print, DLT_ETHERNET_HILSCHER },
+#endif
+#ifdef DLT_ETHERNET_HILSCHER_TRANSPARENT
+       { ether_hilscher_transparent_if_print, DLT_ETHERNET_HILSCHER_TRANSPARENT },
 #endif
        { NULL,                 0 },
 };
 
-static if_printer
+if_printer
 lookup_printer(int type)
 {
        struct printer *p;
@@ -331,7 +337,7 @@ lookup_printer(int type)
        /* NOTREACHED */
 }
 
-static if_ndo_printer
+if_ndo_printer
 lookup_ndo_printer(int type)
 {
        struct ndo_printer *p;
@@ -652,9 +658,8 @@ main(int argc, char **argv)
        smiInit("tcpdump");
 #endif
 
-       opterr = 0;
        while (
-           (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
+           (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
                switch (op) {
 
                case 'a':
@@ -748,7 +753,11 @@ main(int argc, char **argv)
                        break;
 
                case 'h':
-                       ++hflag;
+                       usage();
+                       break;
+
+               case 'H':
+                       ++Hflag;
                        break;
 
                case 'i':
@@ -1493,24 +1502,27 @@ info(register int verbose)
        if (!verbose)
                fprintf(stderr, "%s: ", program_name);
 
-       (void)fprintf(stderr, "%u packets captured", packets_captured);
+       (void)fprintf(stderr, "%u packet%s captured", packets_captured,
+           PLURAL_SUFFIX(packets_captured));
        if (!verbose)
                fputs(", ", stderr);
        else
                putc('\n', stderr);
-       (void)fprintf(stderr, "%u packets received by filter", stat.ps_recv);
+       (void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv,
+           PLURAL_SUFFIX(stat.ps_recv));
        if (!verbose)
                fputs(", ", stderr);
        else
                putc('\n', stderr);
-       (void)fprintf(stderr, "%u packets dropped by kernel", stat.ps_drop);
+       (void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop,
+           PLURAL_SUFFIX(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);
+               (void)fprintf(stderr, "%u packet%s dropped by interface\n",
+                   stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
        } else
                putc('\n', stderr);
        infoprint = 0;
@@ -1892,7 +1904,7 @@ usage(void)
 #endif /* WIN32 */
 #endif /* HAVE_PCAP_LIB_VERSION */
        (void)fprintf(stderr,
-"Usage: %s [-aAbd" D_FLAG "efh" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
+"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
        (void)fprintf(stderr,
 "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
        (void)fprintf(stderr,