X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/20af93776dc9c23b9b1ef53ee7260941231c32d1..96afbce6fc40e89e4f215db5838ae00979185e11:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index 449bf928..84f30f2d 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -97,7 +97,10 @@ The Regents of the University of California. All rights reserved.\n"; #include #include #include -#ifndef _WIN32 +#ifdef _WIN32 +#include +#else +#include #include #include #include @@ -224,11 +227,8 @@ void requestinfo(int); #endif #ifdef _WIN32 - #ifdef USE_WIN32_MM_TIMER - #include - static UINT timer_id; - static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR); - #endif /* USE_WIN32_MM_TIMER */ + 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 */ @@ -929,10 +929,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; @@ -972,8 +972,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); @@ -1282,10 +1282,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; @@ -2205,15 +2205,30 @@ DIAG_ON_CLANG(assign-enum) * "v"erbosely report the number of packets captured. */ #ifdef _WIN32 - #ifdef USE_WIN32_MM_TIMER - /* call verbose_stats_dump() each 1000 +/-100msec */ - timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC); + /* + * https://blogs.msdn.microsoft.com/oldnewthing/20151230-00/?p=92741 + * + * suggests that this 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". + */ + CreateTimerQueueTimer(&timer_handle, NULL, + verbose_stats_dump, NULL, 1000, 1000, + WT_EXECUTEDEFAULT|WT_EXECUTELONGFUNCTION); setvbuf(stderr, NULL, _IONBF, 0); - #endif /* USE_WIN32_MM_TIMER */ #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 */ } @@ -2399,13 +2414,19 @@ static void cleanup(int signo _U_) { #ifdef _WIN32 - #ifdef USE_WIN32_MM_TIMER - if (timer_id) - timeKillEvent(timer_id); - timer_id = 0; - #endif /* USE_WIN32_MM_TIMER */ + 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 @@ -2450,7 +2471,7 @@ child_cleanup(int signo _U_) #endif /* HAVE_FORK && HAVE_VFORK */ static void -info(register int verbose) +info(int verbose) { struct pcap_stat stats; @@ -2827,18 +2848,15 @@ print_packets_captured (void) * Called once each second in verbose mode while dumping to file */ #ifdef _WIN32 - #ifdef USE_WIN32_MM_TIMER -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(); } - #endif /* USE_WIN32_MM_TIMER */ #else /* _WIN32 */ static void verbose_stats_dump(int sig _U_) { print_packets_captured(); - alarm(1); } #endif /* _WIN32 */