]> The Tcpdump Group git mirrors - tcpdump/blobdiff - tcpdump.c
RIPng: Use more ND_TCHECK_SIZE() macros
[tcpdump] / tcpdump.c
index 5973f327d43d3f11ba7a54dede90a51bae2bfdab..ddd5551d2e4dac110dd8f6ae35060c58cf4e3d37 100644 (file)
--- a/tcpdump.c
+++ b/tcpdump.c
  *     Seth Webster <[email protected]>
  */
 
-#ifndef lint
-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";
-#endif
-
 /*
  * tcpdump - dump traffic on a network
  *
@@ -40,7 +34,7 @@ The Regents of the University of California.  All rights reserved.\n";
  */
 
 #ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
 #endif
 
 /*
@@ -55,7 +49,17 @@ The Regents of the University of California.  All rights reserved.\n";
 #endif
 #endif
 
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
+
+/*
+ * This must appear after including netdissect-stdinc.h, so that _U_ is
+ * defined.
+ */
+#ifndef lint
+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";
+#endif
 
 #include <sys/stat.h>
 
@@ -97,7 +101,10 @@ The Regents of the University of California.  All rights reserved.\n";
 #include <stdlib.h>
 #include <string.h>
 #include <limits.h>
-#ifndef _WIN32
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
 #include <sys/wait.h>
 #include <sys/resource.h>
 #include <pwd.h>
@@ -224,9 +231,8 @@ void requestinfo(int);
 #endif
 
 #ifdef _WIN32
-    #include <MMsystem.h>
-    static UINT timer_id;
-    static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
+    static HANDLE timer_handle = INVALID_HANDLE_VALUE;
+    static void CALLBACK verbose_stats_dump(PVOID param, BOOLEAN timer_fired);
 #else /* _WIN32 */
   static void verbose_stats_dump(int sig);
 #endif /* _WIN32 */
@@ -501,22 +507,22 @@ show_remote_devices_and_exit(void)
  * only use them for the same purposes that the other versions of tcpdump
  * use them:
  *
- * OS X tcpdump uses -g to force non--v output for IP to be on one
+ * macOS tcpdump uses -g to force non--v output for IP to be on one
  * line, making it more "g"repable;
  *
- * OS X tcpdump uses -k to specify that packet comments in pcap-ng files
+ * macOS tcpdump uses -k to specify that packet comments in pcapng files
  * should be printed;
  *
  * OpenBSD tcpdump uses -o to indicate that OS fingerprinting should be done
  * for hosts sending TCP SYN packets;
  *
- * OS X tcpdump uses -P to indicate that -w should write pcap-ng rather
+ * macOS tcpdump uses -P to indicate that -w should write pcapng rather
  * than pcap files.
  *
- * OS X tcpdump also uses -Q to specify expressions that match packet
+ * macOS tcpdump also uses -Q to specify expressions that match packet
  * metadata, including but not limited to the packet direction.
  * The expression syntax is different from a simple "in|out|inout",
- * and those expressions aren't accepted by OS X tcpdump, but the
+ * and those expressions aren't accepted by macOS tcpdump, but the
  * equivalents would be "in" = "dir=in", "out" = "dir=out", and
  * "inout" = "dir=in or dir=out", and the parser could conceivably
  * special-case "in", "out", and "inout" as expressions for backwards
@@ -927,10 +933,10 @@ set_dumper_capsicum_rights(pcap_dumper_t *p)
  * Copy arg vector into a new buffer, concatenating arguments with spaces.
  */
 static char *
-copy_argv(register char **argv)
+copy_argv(char **argv)
 {
-       register char **p;
-       register u_int len = 0;
+       char **p;
+       u_int len = 0;
        char *buf;
        char *src, *dst;
 
@@ -970,8 +976,8 @@ copy_argv(register char **argv)
 static char *
 read_infile(char *fname)
 {
-       register int i, fd, cc;
-       register char *cp;
+       int i, fd, cc;
+       char *cp;
        struct stat buf;
 
        fd = open(fname, O_RDONLY|O_BINARY);
@@ -1280,10 +1286,10 @@ fprintf(stderr, "Opening %s\n", device);
 int
 main(int argc, char **argv)
 {
-       register int cnt, op, i;
+       int cnt, op, i;
        bpf_u_int32 localnet = 0, netmask = 0;
        int timezone_offset = 0;
-       register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
+       char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
        char *endp;
        pcap_handler callback;
        int dlt;
@@ -2204,22 +2210,29 @@ DIAG_ON_CLANG(assign-enum)
                 */
 #ifdef _WIN32
                /*
-                * call verbose_stats_dump() each 1000 +/-100msec
+                * https://blogs.msdn.microsoft.com/oldnewthing/20151230-00/?p=92741
                 *
-                * XXX - as of XP/Server 2003, this is deprecated in
-                * favor of CreateTimerQueueTimer().  We should
-                * probably use that, instead.  (And
+                * suggests that this dates back to W2K.
                 *
-                *  https://blogs.msdn.microsoft.com/oldnewthing/20151230-00/?p=92741
-                *
-                * suggests that it dates back to W2K.)
+                * I don't know what a "long wait" is, but we'll assume
+                * that printing the stats could be a "long wait".
                 */
-               timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
+               CreateTimerQueueTimer(&timer_handle, NULL,
+                   verbose_stats_dump, NULL, 1000, 1000,
+                   WT_EXECUTEDEFAULT|WT_EXECUTELONGFUNCTION);
                setvbuf(stderr, NULL, _IONBF, 0);
 #else /* _WIN32 */
-               /* UN*X has alarm() */
+               /*
+                * Assume this is UN*X, and that it has setitimer(); that
+                * dates back to UNIX 95.
+                */
+               struct itimerval timer;
                (void)setsignal(SIGALRM, verbose_stats_dump);
-               alarm(1);
+               timer.it_interval.tv_sec = 1;
+               timer.it_interval.tv_usec = 0;
+               timer.it_value.tv_sec = 1;
+               timer.it_value.tv_usec = 1;
+               setitimer(ITIMER_REAL, &timer, NULL);
 #endif /* _WIN32 */
        }
 
@@ -2405,11 +2418,19 @@ static void
 cleanup(int signo _U_)
 {
 #ifdef _WIN32
-       if (timer_id)
-               timeKillEvent(timer_id);
-       timer_id = 0;
+       if (timer_handle != INVALID_HANDLE_VALUE) {
+               DeleteTimerQueueTimer(NULL, timer_handle, NULL);
+               CloseHandle(timer_handle);
+               timer_handle = INVALID_HANDLE_VALUE;
+        }
 #else /* _WIN32 */
-       alarm(0);
+       struct itimerval timer;
+
+       timer.it_interval.tv_sec = 0;
+       timer.it_interval.tv_usec = 0;
+       timer.it_value.tv_sec = 0;
+       timer.it_value.tv_usec = 0;
+       setitimer(ITIMER_REAL, &timer, NULL);
 #endif /* _WIN32 */
 
 #ifdef HAVE_PCAP_BREAKLOOP
@@ -2454,7 +2475,7 @@ child_cleanup(int signo _U_)
 #endif /* HAVE_FORK && HAVE_VFORK */
 
 static void
-info(register int verbose)
+info(int verbose)
 {
        struct pcap_stat stats;
 
@@ -2831,8 +2852,8 @@ print_packets_captured (void)
  * Called once each second in verbose mode while dumping to file
  */
 #ifdef _WIN32
-void CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
-                                 DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
+static void CALLBACK verbose_stats_dump(PVOID param _U_,
+    BOOLEAN timer_fired _U_)
 {
        print_packets_captured();
 }
@@ -2840,7 +2861,6 @@ void CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg
 static void verbose_stats_dump(int sig _U_)
 {
        print_packets_captured();
-       alarm(1);
 }
 #endif /* _WIN32 */