]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
From Andrew Silent: Realtek Remote Control Protocol support (see
[tcpdump] / tcpdump.c
index 918121a8e023a4c4847b5eba79dac24fe71d2d2f..561c91492050c498775a8b1473ce2d8297d81bf9 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
@@ -30,7 +30,7 @@ static const char copyright[] _U_ =
     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
 The Regents of the University of California.  All rights reserved.\n";
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.268 2006-03-23 17:33:01 hannes Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.271.2.5 2008-01-29 10:50:28 guy Exp $ (LBL)";
 #endif
 
 /*
@@ -66,14 +66,15 @@ extern int SIZE_BUF;
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
-#include <sys/resource.h>
-#include <sys/wait.h>
 #ifndef WIN32
+#include <sys/wait.h>
+#include <sys/resource.h>
 #include <pwd.h>
 #include <grp.h>
 #include <errno.h>
 #endif /* WIN32 */
 
+
 #include "netdissect.h"
 #include "interface.h"
 #include "addrtoname.h"
@@ -191,7 +192,7 @@ static struct printer printers[] = {
 #ifdef DLT_LTALK
        { ltalk_if_print,       DLT_LTALK },
 #endif
-#ifdef DLT_PFLOG
+#if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
        { pflog_if_print,       DLT_PFLOG },
 #endif
 #ifdef DLT_FR
@@ -221,6 +222,9 @@ static struct printer printers[] = {
 #ifdef DLT_APPLE_IP_OVER_IEEE1394
        { ap1394_if_print,      DLT_APPLE_IP_OVER_IEEE1394 },
 #endif
+#ifdef DLT_IEEE802_11_RADIO_AVS
+       { ieee802_11_radio_avs_if_print,        DLT_IEEE802_11_RADIO_AVS },
+#endif
 #ifdef DLT_JUNIPER_ATM1
        { juniper_atm1_print,   DLT_JUNIPER_ATM1 },
 #endif
@@ -268,6 +272,9 @@ static struct printer printers[] = {
 #endif
 #ifdef DLT_MFR
        { mfr_if_print, DLT_MFR },
+#endif
+#ifdef DLT_BLUETOOTH_HCI_H4_WITH_PHDR
+       { bt_if_print, DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
 #endif
        { NULL,                 0 },
 };
@@ -327,10 +334,10 @@ show_dlts_and_exit(pcap_t *pd)
                         * OK, does tcpdump handle that type?
                         */
                        if (lookup_printer(dlts[n_dlts]) == NULL)
-                               (void) fprintf(stderr, " (not supported)");
+                               (void) fprintf(stderr, " (printing not supported)");
                        putchar('\n');
                } else {
-                       (void) fprintf(stderr, "  DLT %d (not supported)\n",
+                       (void) fprintf(stderr, "  DLT %d (printing not supported)\n",
                            dlts[n_dlts]);
                }
        }
@@ -523,7 +530,7 @@ main(int argc, char **argv)
 
        opterr = 0;
        while (
-           (op = getopt(argc, argv, "aA" B_FLAG "c:C:d" D_FLAG "eE:fF:G:i:lLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
+           (op = getopt(argc, argv, "aA" B_FLAG "c:C:d" D_FLAG "eE:fF:G:i:KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1)
                switch (op) {
 
                case 'a':
@@ -668,12 +675,8 @@ main(int argc, char **argv)
 #endif /* WIN32 */
                        break;
 
-               case 'n':
-                       ++nflag;
-                       break;
-
-               case 'N':
-                       ++Nflag;
+               case 'K':
+                       ++Kflag;
                        break;
 
                case 'm':
@@ -697,6 +700,14 @@ main(int argc, char **argv)
                        tcpmd5secret = optarg;
                        break;
 
+               case 'n':
+                       ++nflag;
+                       break;
+
+               case 'N':
+                       ++Nflag;
+                       break;
+
                case 'O':
                        Oflag = 0;
                        break;
@@ -999,10 +1010,10 @@ main(int argc, char **argv)
 
 #ifndef WIN32  
        (void)setsignal(SIGPIPE, cleanup);
-#endif /* WIN32 */
        (void)setsignal(SIGTERM, cleanup);
        (void)setsignal(SIGINT, cleanup);
        (void)setsignal(SIGCHLD, child_cleanup);
+#endif /* WIN32 */
        /* Cooperate with nohup(1) */
 #ifndef WIN32  
        if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
@@ -1063,7 +1074,12 @@ main(int argc, char **argv)
        }
 #endif /* WIN32 */
 #ifdef SIGINFO
-       (void)setsignal(SIGINFO, requestinfo);
+       /*
+        * We can't get statistics when reading from a file rather
+        * than capturing from a device.
+        */
+       if (RFileName == NULL)
+               (void)setsignal(SIGINFO, requestinfo);
 #endif
 
        if (vflag > 0 && WFileName) {
@@ -1181,11 +1197,17 @@ cleanup(int signo _U_)
 #endif
 }
 
+/*
+  On windows, we do not use a fork, so we do not care less about
+  waiting a child processes to die
+ */
+#ifndef WIN32
 static RETSIGTYPE
 child_cleanup(int signo _U_)
 {
   wait(NULL);
 }
+#endif /* WIN32 */
 
 static void
 info(register int verbose)
@@ -1194,6 +1216,7 @@ info(register int verbose)
 
        if (pcap_stats(pd, &stat) < 0) {
                (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
+               infoprint = 0;
                return;
        }
 
@@ -1214,6 +1237,7 @@ info(register int verbose)
        infoprint = 0;
 }
 
+#ifndef WIN32
 static void
 compress_savefile(const char *filename)
 {
@@ -1234,6 +1258,14 @@ compress_savefile(const char *filename)
                        filename,
                        strerror(errno));
 }
+#else  /* WIN32 */
+static void
+compress_savefile(const char *filename)
+{
+       fprintf(stderr,
+               "compress_savefile failed. Functionality not implemented under windows\n");
+}
+#endif /* WIN32 */
 
 static void
 dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
@@ -1567,7 +1599,7 @@ usage(void)
 #endif /* WIN32 */
 #endif /* HAVE_PCAP_LIB_VERSION */
        (void)fprintf(stderr,
-"Usage: %s [-aAd" D_FLAG "eflLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [-c count] [ -C file_size ]\n", program_name);
+"Usage: %s [-aAd" D_FLAG "efKlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [-c count] [ -C file_size ]\n", program_name);
        (void)fprintf(stderr,
 "\t\t[ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ]\n");
        (void)fprintf(stderr,