]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
Travis: avoid useless lines from 'brew' command in the logs
[tcpdump] / tcpdump.c
index 40b930d3b4ffe10609b1cb37ffed9d65289a83c0..d77b4bdaca45802dd43d406e5d23ec4e0588ecf9 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -43,6 +43,17 @@ The Regents of the University of California.  All rights reserved.\n";
 #include "config.h"
 #endif
 
+/*
+ * Mac OS X may ship pcap.h from libpcap 0.6 with a libpcap based on
+ * 0.8.  That means it has pcap_findalldevs() but the header doesn't
+ * define pcap_if_t, meaning that we can't actually *use* pcap_findalldevs().
+ */
+#ifdef HAVE_PCAP_FINDALLDEVS
+#ifndef HAVE_PCAP_IF_T
+#undef HAVE_PCAP_FINDALLDEVS
+#endif
+#endif
+
 #include <tcpdump-stdinc.h>
 
 #ifdef WIN32
@@ -53,7 +64,7 @@ extern int SIZE_BUF;
 #define uint UINT
 #endif /* WIN32 */
 
-#ifdef HAVE_SMI_H
+#ifdef USE_LIBSMI
 #include <smi.h>
 #endif
 
@@ -66,12 +77,10 @@ extern int SIZE_BUF;
 #else
 #include "getopt_long.h"
 #endif
-#include <pcap.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
+/* Capsicum-specific code requires macros from <net/bpf.h>, which will fail
+ * to compile if <pcap.h> has already been included; including the headers
+ * in the opposite order works fine.
+ */
 #ifdef HAVE_CAPSICUM
 #include <sys/capability.h>
 #include <sys/ioccom.h>
@@ -79,6 +88,12 @@ extern int SIZE_BUF;
 #include <fcntl.h>
 #include <libgen.h>
 #endif /* HAVE_CAPSICUM */
+#include <pcap.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
 #ifndef WIN32
 #include <sys/wait.h>
 #include <sys/resource.h>
@@ -614,12 +629,6 @@ show_devices_and_exit (void)
 #define J_FLAG
 #endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
 
-#ifdef HAVE_PCAP_FINDALLDEVS
-#ifndef HAVE_PCAP_IF_T
-#undef HAVE_PCAP_FINDALLDEVS
-#endif
-#endif
-
 #ifdef HAVE_PCAP_FINDALLDEVS
 #define D_FLAG "D"
 #else
@@ -658,9 +667,8 @@ show_devices_and_exit (void)
  * component of the entry for the long option, and have a case for that
  * option in the switch statement.
  */
-#define OPTION_NUMBER          128
-#define OPTION_VERSION         129
-#define OPTION_TSTAMP_PRECISION        130
+#define OPTION_VERSION         128
+#define OPTION_TSTAMP_PRECISION        129
 
 static const struct option longopts[] = {
 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
@@ -696,7 +704,7 @@ static const struct option longopts[] = {
        { "debug-filter-parser", no_argument, NULL, 'Y' },
 #endif
        { "relinquish-privileges", required_argument, NULL, 'Z' },
-       { "number", no_argument, NULL, OPTION_NUMBER },
+       { "number", no_argument, NULL, '#' },
        { "version", no_argument, NULL, OPTION_VERSION },
        { NULL, 0, NULL, 0 }
 };
@@ -952,15 +960,22 @@ main(int argc, char **argv)
        else
                program_name = argv[0];
 
+       /*
+        * On platforms where the CPU doesn't support unaligned loads,
+        * force unaligned accesses to abort with SIGBUS, rather than
+        * being fixed up (slowly) by the OS kernel; on those platforms,
+        * misaligned accesses are bugs, and we want tcpdump to crash so
+        * that the bugs are reported.
+        */
        if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
                error("%s", ebuf);
 
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
        smiInit("tcpdump");
 #endif
 
        while (
-           (op = getopt_long(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:", longopts, NULL)) != -1)
+           (op = getopt_long(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOpq" Q_FLAG "r:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:#", longopts, NULL)) != -1)
                switch (op) {
 
                case 'a':
@@ -1136,7 +1151,7 @@ main(int argc, char **argv)
                        break;
 
                case 'm':
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
                        if (smiLoadModule(optarg) == 0) {
                                error("could not load MIB module %s", optarg);
                        }
@@ -1321,7 +1336,7 @@ main(int argc, char **argv)
                        username = strdup(optarg);
                        break;
 
-               case OPTION_NUMBER:
+               case '#':
                        gndo->ndo_packet_number = 1;
                        break;
 
@@ -2304,7 +2319,8 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
        /*
         * Some printers want to check that they're not walking off the
         * end of the packet.
-        * Rather than pass it all the way down, we set this global.
+        * Rather than pass it all the way down, we set this member
+        * of the netdissect_options structure.
         */
        ndo->ndo_snapend = sp + h->caplen;
 
@@ -2314,6 +2330,11 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
                 hdrlen = (*print_info->p.printer)(h, sp);
         }
 
+       /*
+        * Restore the original snapend, as a printer might have
+        * changed it.
+        */
+       ndo->ndo_snapend = sp + h->caplen;
        if (ndo->ndo_Xflag) {
                /*
                 * Print the raw packet data in hex and ASCII.
@@ -2412,7 +2433,7 @@ print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
 static void
 ndo_default_print(netdissect_options *ndo, const u_char *bp, u_int length)
 {
-       hex_and_ascii_print(ndo, "\n\t", bp, length); /* pass on lf and identation string */
+       hex_and_ascii_print(ndo, "\n\t", bp, length); /* pass on lf and indentation string */
 }
 
 void
@@ -2488,7 +2509,7 @@ print_version(void)
        (void)fprintf (stderr, "%s\n", SSLeay_version(SSLEAY_VERSION));
 #endif
 
-#if defined(HAVE_SMI_H)
+#ifdef USE_LIBSMI
        (void)fprintf (stderr, "SMI-library: %s\n", smi_version_string);
 #endif
 }
@@ -2499,7 +2520,7 @@ print_usage(void)
 {
        print_version();
        (void)fprintf(stderr,
-"Usage: %s [-aAbd" D_FLAG "efhH" 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,