Home | History | Annotate | Download | only in tcpdump
      1 /*
      2  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
      3  *	The Regents of the University of California.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that: (1) source code distributions
      7  * retain the above copyright notice and this paragraph in its entirety, (2)
      8  * distributions including binary code include the above copyright notice and
      9  * this paragraph in its entirety in the documentation or other materials
     10  * provided with the distribution, and (3) all advertising materials mentioning
     11  * features or use of this software display the following acknowledgement:
     12  * ``This product includes software developed by the University of California,
     13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
     14  * the University nor the names of its contributors may be used to endorse
     15  * or promote products derived from this software without specific prior
     16  * written permission.
     17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     20  *
     21  * Support for splitting captures into multiple files with a maximum
     22  * file size:
     23  *
     24  * Copyright (c) 2001
     25  *	Seth Webster <swebster (at) sst.ll.mit.edu>
     26  */
     27 
     28 #ifndef lint
     29 static const char copyright[] _U_ =
     30     "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
     31 The Regents of the University of California.  All rights reserved.\n";
     32 static const char rcsid[] _U_ =
     33     "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.283 2008-09-25 21:45:50 guy Exp $ (LBL)";
     34 #endif
     35 
     36 /*
     37  * tcpdump - monitor tcp/ip traffic on an ethernet.
     38  *
     39  * First written in 1987 by Van Jacobson, Lawrence Berkeley Laboratory.
     40  * Mercilessly hacked and occasionally improved since then via the
     41  * combined efforts of Van, Steve McCanne and Craig Leres of LBL.
     42  */
     43 
     44 #ifdef HAVE_CONFIG_H
     45 #include "config.h"
     46 #endif
     47 
     48 #include <tcpdump-stdinc.h>
     49 
     50 #ifdef WIN32
     51 #include "getopt.h"
     52 #include "w32_fzs.h"
     53 extern int strcasecmp (const char *__s1, const char *__s2);
     54 extern int SIZE_BUF;
     55 #define off_t long
     56 #define uint UINT
     57 #endif /* WIN32 */
     58 
     59 #ifdef HAVE_SMI_H
     60 #include <smi.h>
     61 #endif
     62 
     63 #include <pcap.h>
     64 #include <signal.h>
     65 #include <stdio.h>
     66 #include <stdlib.h>
     67 #include <string.h>
     68 #include <limits.h>
     69 #ifndef WIN32
     70 #include <sys/wait.h>
     71 #include <sys/resource.h>
     72 #include <pwd.h>
     73 #include <grp.h>
     74 #include <errno.h>
     75 #endif /* WIN32 */
     76 
     77 /* capabilities convinience library */
     78 #ifdef HAVE_CAP_NG_H
     79 #include <cap-ng.h>
     80 #endif /* HAVE_CAP_NG_H */
     81 
     82 #include "netdissect.h"
     83 #include "interface.h"
     84 #include "addrtoname.h"
     85 #include "machdep.h"
     86 #include "setsignal.h"
     87 #include "gmt2local.h"
     88 #include "pcap-missing.h"
     89 
     90 #ifndef PATH_MAX
     91 #define PATH_MAX 1024
     92 #endif
     93 
     94 #ifdef SIGINFO
     95 #define SIGNAL_REQ_INFO SIGINFO
     96 #elif SIGUSR1
     97 #define SIGNAL_REQ_INFO SIGUSR1
     98 #endif
     99 
    100 netdissect_options Gndo;
    101 netdissect_options *gndo = &Gndo;
    102 
    103 static int dflag;			/* print filter code */
    104 static int Lflag;			/* list available data link types and exit */
    105 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
    106 static int Jflag;			/* list available time stamp types */
    107 #endif
    108 #ifdef HAVE_PCAP_SETDIRECTION
    109 int Pflag = -1;	/* Restrict captured packet by sent/receive direction */
    110 #endif
    111 static char *zflag = NULL;		/* compress each savefile using a specified command (like gzip or bzip2) */
    112 
    113 static int infodelay;
    114 static int infoprint;
    115 
    116 char *program_name;
    117 
    118 int32_t thiszone;		/* seconds offset from gmt to local time */
    119 
    120 /* Forwards */
    121 static RETSIGTYPE cleanup(int);
    122 static RETSIGTYPE child_cleanup(int);
    123 static void usage(void) __attribute__((noreturn));
    124 static void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn));
    125 
    126 static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
    127 static void ndo_default_print(netdissect_options *, const u_char *, u_int);
    128 static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
    129 static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
    130 static void droproot(const char *, const char *);
    131 static void ndo_error(netdissect_options *ndo, const char *fmt, ...)
    132      __attribute__ ((noreturn, format (printf, 2, 3)));
    133 static void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
    134 
    135 #ifdef SIGNAL_REQ_INFO
    136 RETSIGTYPE requestinfo(int);
    137 #endif
    138 
    139 #if defined(USE_WIN32_MM_TIMER)
    140   #include <MMsystem.h>
    141   static UINT timer_id;
    142   static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
    143 #elif defined(HAVE_ALARM)
    144   static void verbose_stats_dump(int sig);
    145 #endif
    146 
    147 static void info(int);
    148 static u_int packets_captured;
    149 
    150 struct printer {
    151         if_printer f;
    152 	int type;
    153 };
    154 
    155 
    156 struct ndo_printer {
    157         if_ndo_printer f;
    158 	int type;
    159 };
    160 
    161 
    162 static struct printer printers[] = {
    163 	{ arcnet_if_print,	DLT_ARCNET },
    164 #ifdef DLT_ARCNET_LINUX
    165 	{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
    166 #endif
    167 	{ token_if_print,	DLT_IEEE802 },
    168 #ifdef DLT_LANE8023
    169 	{ lane_if_print,        DLT_LANE8023 },
    170 #endif
    171 #ifdef DLT_CIP
    172 	{ cip_if_print,         DLT_CIP },
    173 #endif
    174 #ifdef DLT_ATM_CLIP
    175 	{ cip_if_print,		DLT_ATM_CLIP },
    176 #endif
    177 	{ sl_if_print,		DLT_SLIP },
    178 #ifdef DLT_SLIP_BSDOS
    179 	{ sl_bsdos_if_print,	DLT_SLIP_BSDOS },
    180 #endif
    181 	{ ppp_if_print,		DLT_PPP },
    182 #ifdef DLT_PPP_WITHDIRECTION
    183 	{ ppp_if_print,		DLT_PPP_WITHDIRECTION },
    184 #endif
    185 #ifdef DLT_PPP_BSDOS
    186 	{ ppp_bsdos_if_print,	DLT_PPP_BSDOS },
    187 #endif
    188 	{ fddi_if_print,	DLT_FDDI },
    189 	{ null_if_print,	DLT_NULL },
    190 #ifdef DLT_LOOP
    191 	{ null_if_print,	DLT_LOOP },
    192 #endif
    193 	{ raw_if_print,		DLT_RAW },
    194 	{ atm_if_print,		DLT_ATM_RFC1483 },
    195 #ifdef DLT_C_HDLC
    196 	{ chdlc_if_print,	DLT_C_HDLC },
    197 #endif
    198 #ifdef DLT_HDLC
    199 	{ chdlc_if_print,	DLT_HDLC },
    200 #endif
    201 #ifdef DLT_PPP_SERIAL
    202 	{ ppp_hdlc_if_print,	DLT_PPP_SERIAL },
    203 #endif
    204 #ifdef DLT_PPP_ETHER
    205 	{ pppoe_if_print,	DLT_PPP_ETHER },
    206 #endif
    207 #ifdef DLT_LINUX_SLL
    208 	{ sll_if_print,		DLT_LINUX_SLL },
    209 #endif
    210 #ifdef DLT_IEEE802_11
    211 	{ ieee802_11_if_print,	DLT_IEEE802_11},
    212 #endif
    213 #ifdef DLT_LTALK
    214 	{ ltalk_if_print,	DLT_LTALK },
    215 #endif
    216 #if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
    217 	{ pflog_if_print,	DLT_PFLOG },
    218 #endif
    219 #ifdef DLT_FR
    220 	{ fr_if_print,		DLT_FR },
    221 #endif
    222 #ifdef DLT_FRELAY
    223 	{ fr_if_print,		DLT_FRELAY },
    224 #endif
    225 #ifdef DLT_SUNATM
    226 	{ sunatm_if_print,	DLT_SUNATM },
    227 #endif
    228 #ifdef DLT_IP_OVER_FC
    229 	{ ipfc_if_print,	DLT_IP_OVER_FC },
    230 #endif
    231 #ifdef DLT_PRISM_HEADER
    232 	{ prism_if_print,	DLT_PRISM_HEADER },
    233 #endif
    234 #ifdef DLT_IEEE802_11_RADIO
    235 	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
    236 #endif
    237 #ifdef DLT_ENC
    238 	{ enc_if_print,		DLT_ENC },
    239 #endif
    240 #ifdef DLT_SYMANTEC_FIREWALL
    241 	{ symantec_if_print,	DLT_SYMANTEC_FIREWALL },
    242 #endif
    243 #ifdef DLT_APPLE_IP_OVER_IEEE1394
    244 	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
    245 #endif
    246 #ifdef DLT_IEEE802_11_RADIO_AVS
    247 	{ ieee802_11_radio_avs_if_print,	DLT_IEEE802_11_RADIO_AVS },
    248 #endif
    249 #ifdef DLT_JUNIPER_ATM1
    250 	{ juniper_atm1_print,	DLT_JUNIPER_ATM1 },
    251 #endif
    252 #ifdef DLT_JUNIPER_ATM2
    253 	{ juniper_atm2_print,	DLT_JUNIPER_ATM2 },
    254 #endif
    255 #ifdef DLT_JUNIPER_MFR
    256 	{ juniper_mfr_print,	DLT_JUNIPER_MFR },
    257 #endif
    258 #ifdef DLT_JUNIPER_MLFR
    259 	{ juniper_mlfr_print,	DLT_JUNIPER_MLFR },
    260 #endif
    261 #ifdef DLT_JUNIPER_MLPPP
    262 	{ juniper_mlppp_print,	DLT_JUNIPER_MLPPP },
    263 #endif
    264 #ifdef DLT_JUNIPER_PPPOE
    265 	{ juniper_pppoe_print,	DLT_JUNIPER_PPPOE },
    266 #endif
    267 #ifdef DLT_JUNIPER_PPPOE_ATM
    268 	{ juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
    269 #endif
    270 #ifdef DLT_JUNIPER_GGSN
    271 	{ juniper_ggsn_print,	DLT_JUNIPER_GGSN },
    272 #endif
    273 #ifdef DLT_JUNIPER_ES
    274 	{ juniper_es_print,	DLT_JUNIPER_ES },
    275 #endif
    276 #ifdef DLT_JUNIPER_MONITOR
    277 	{ juniper_monitor_print, DLT_JUNIPER_MONITOR },
    278 #endif
    279 #ifdef DLT_JUNIPER_SERVICES
    280 	{ juniper_services_print, DLT_JUNIPER_SERVICES },
    281 #endif
    282 #ifdef DLT_JUNIPER_ETHER
    283 	{ juniper_ether_print,	DLT_JUNIPER_ETHER },
    284 #endif
    285 #ifdef DLT_JUNIPER_PPP
    286 	{ juniper_ppp_print,	DLT_JUNIPER_PPP },
    287 #endif
    288 #ifdef DLT_JUNIPER_FRELAY
    289 	{ juniper_frelay_print,	DLT_JUNIPER_FRELAY },
    290 #endif
    291 #ifdef DLT_JUNIPER_CHDLC
    292 	{ juniper_chdlc_print,	DLT_JUNIPER_CHDLC },
    293 #endif
    294 #ifdef DLT_MFR
    295 	{ mfr_if_print,		DLT_MFR },
    296 #endif
    297 #if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
    298 	{ bt_if_print,		DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
    299 #endif
    300 #ifdef HAVE_PCAP_USB_H
    301 #ifdef DLT_USB_LINUX
    302 	{ usb_linux_48_byte_print, DLT_USB_LINUX},
    303 #endif /* DLT_USB_LINUX */
    304 #ifdef DLT_USB_LINUX_MMAPPED
    305 	{ usb_linux_64_byte_print, DLT_USB_LINUX_MMAPPED},
    306 #endif /* DLT_USB_LINUX_MMAPPED */
    307 #endif /* HAVE_PCAP_USB_H */
    308 #ifdef DLT_IPV4
    309 	{ raw_if_print,		DLT_IPV4 },
    310 #endif
    311 #ifdef DLT_IPV6
    312 	{ raw_if_print,		DLT_IPV6 },
    313 #endif
    314 	{ NULL,			0 },
    315 };
    316 
    317 static struct ndo_printer ndo_printers[] = {
    318 	{ ether_if_print,	DLT_EN10MB },
    319 #ifdef DLT_IPNET
    320 	{ ipnet_if_print,	DLT_IPNET },
    321 #endif
    322 #ifdef DLT_IEEE802_15_4
    323 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
    324 #endif
    325 #ifdef DLT_IEEE802_15_4_NOFCS
    326 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
    327 #endif
    328 #ifdef DLT_PPI
    329 	{ ppi_if_print,		DLT_PPI },
    330 #endif
    331 #ifdef DLT_NETANALYZER
    332 	{ netanalyzer_if_print, DLT_NETANALYZER },
    333 #endif
    334 #ifdef DLT_NETANALYZER_TRANSPARENT
    335 	{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
    336 #endif
    337 #if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
    338 	{ nflog_if_print,	DLT_NFLOG},
    339 #endif
    340 	{ NULL,			0 },
    341 };
    342 
    343 if_printer
    344 lookup_printer(int type)
    345 {
    346 	struct printer *p;
    347 
    348 	for (p = printers; p->f; ++p)
    349 		if (type == p->type)
    350 			return p->f;
    351 
    352 	return NULL;
    353 	/* NOTREACHED */
    354 }
    355 
    356 if_ndo_printer
    357 lookup_ndo_printer(int type)
    358 {
    359 	struct ndo_printer *p;
    360 
    361 	for (p = ndo_printers; p->f; ++p)
    362 		if (type == p->type)
    363 			return p->f;
    364 
    365 	return NULL;
    366 	/* NOTREACHED */
    367 }
    368 
    369 static pcap_t *pd;
    370 
    371 static int supports_monitor_mode;
    372 
    373 extern int optind;
    374 extern int opterr;
    375 extern char *optarg;
    376 
    377 struct print_info {
    378         netdissect_options *ndo;
    379         union {
    380                 if_printer     printer;
    381                 if_ndo_printer ndo_printer;
    382         } p;
    383         int ndo_type;
    384 };
    385 
    386 struct dump_info {
    387 	char	*WFileName;
    388 	char	*CurrentFileName;
    389 	pcap_t	*pd;
    390 	pcap_dumper_t *p;
    391 };
    392 
    393 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
    394 static void
    395 show_tstamp_types_and_exit(const char *device, pcap_t *pd)
    396 {
    397 	int n_tstamp_types;
    398 	int *tstamp_types = 0;
    399 	const char *tstamp_type_name;
    400 	int i;
    401 
    402 	n_tstamp_types = pcap_list_tstamp_types(pd, &tstamp_types);
    403 	if (n_tstamp_types < 0)
    404 		error("%s", pcap_geterr(pd));
    405 
    406 	if (n_tstamp_types == 0) {
    407 		fprintf(stderr, "Time stamp type cannot be set for %s\n",
    408 		    device);
    409 		exit(0);
    410 	}
    411 	fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
    412 	    device);
    413 	for (i = 0; i < n_tstamp_types; i++) {
    414 		tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
    415 		if (tstamp_type_name != NULL) {
    416 			(void) fprintf(stderr, "  %s (%s)\n", tstamp_type_name,
    417 			    pcap_tstamp_type_val_to_description(tstamp_types[i]));
    418 		} else {
    419 			(void) fprintf(stderr, "  %d\n", tstamp_types[i]);
    420 		}
    421 	}
    422 	pcap_free_tstamp_types(tstamp_types);
    423 	exit(0);
    424 }
    425 #endif
    426 
    427 static void
    428 show_dlts_and_exit(const char *device, pcap_t *pd)
    429 {
    430 	int n_dlts;
    431 	int *dlts = 0;
    432 	const char *dlt_name;
    433 
    434 	n_dlts = pcap_list_datalinks(pd, &dlts);
    435 	if (n_dlts < 0)
    436 		error("%s", pcap_geterr(pd));
    437 	else if (n_dlts == 0 || !dlts)
    438 		error("No data link types.");
    439 
    440 	/*
    441 	 * If the interface is known to support monitor mode, indicate
    442 	 * whether these are the data link types available when not in
    443 	 * monitor mode, if -I wasn't specified, or when in monitor mode,
    444 	 * when -I was specified (the link-layer types available in
    445 	 * monitor mode might be different from the ones available when
    446 	 * not in monitor mode).
    447 	 */
    448 	if (supports_monitor_mode)
    449 		(void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
    450 		    device,
    451 		    Iflag ? "when in monitor mode" : "when not in monitor mode");
    452 	else
    453 		(void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
    454 		    device);
    455 
    456 	while (--n_dlts >= 0) {
    457 		dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
    458 		if (dlt_name != NULL) {
    459 			(void) fprintf(stderr, "  %s (%s)", dlt_name,
    460 			    pcap_datalink_val_to_description(dlts[n_dlts]));
    461 
    462 			/*
    463 			 * OK, does tcpdump handle that type?
    464 			 */
    465 			if (lookup_printer(dlts[n_dlts]) == NULL
    466                             && lookup_ndo_printer(dlts[n_dlts]) == NULL)
    467 				(void) fprintf(stderr, " (printing not supported)");
    468 			fprintf(stderr, "\n");
    469 		} else {
    470 			(void) fprintf(stderr, "  DLT %d (printing not supported)\n",
    471 			    dlts[n_dlts]);
    472 		}
    473 	}
    474 #ifdef HAVE_PCAP_FREE_DATALINKS
    475 	pcap_free_datalinks(dlts);
    476 #endif
    477 	exit(0);
    478 }
    479 
    480 /*
    481  * Set up flags that might or might not be supported depending on the
    482  * version of libpcap we're using.
    483  */
    484 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
    485 #define B_FLAG		"B:"
    486 #define B_FLAG_USAGE	" [ -B size ]"
    487 #else /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
    488 #define B_FLAG
    489 #define B_FLAG_USAGE
    490 #endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
    491 
    492 #ifdef HAVE_PCAP_CREATE
    493 #define I_FLAG		"I"
    494 #else /* HAVE_PCAP_CREATE */
    495 #define I_FLAG
    496 #endif /* HAVE_PCAP_CREATE */
    497 
    498 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
    499 #define j_FLAG		"j:"
    500 #define j_FLAG_USAGE	" [ -j tstamptype ]"
    501 #define J_FLAG		"J"
    502 #else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
    503 #define j_FLAG
    504 #define j_FLAG_USAGE
    505 #define J_FLAG
    506 #endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
    507 
    508 #ifdef HAVE_PCAP_FINDALLDEVS
    509 #ifndef HAVE_PCAP_IF_T
    510 #undef HAVE_PCAP_FINDALLDEVS
    511 #endif
    512 #endif
    513 
    514 #ifdef HAVE_PCAP_FINDALLDEVS
    515 #define D_FLAG	"D"
    516 #else
    517 #define D_FLAG
    518 #endif
    519 
    520 #ifdef HAVE_PCAP_DUMP_FLUSH
    521 #define U_FLAG	"U"
    522 #else
    523 #define U_FLAG
    524 #endif
    525 
    526 #ifdef HAVE_PCAP_SETDIRECTION
    527 #define P_FLAG "P:"
    528 #define Q_FLAG "Q:"
    529 #else
    530 #define P_FLAG
    531 #define Q_FLAG
    532 #endif
    533 
    534 #ifndef WIN32
    535 /* Drop root privileges and chroot if necessary */
    536 static void
    537 droproot(const char *username, const char *chroot_dir)
    538 {
    539 	struct passwd *pw = NULL;
    540 
    541 	if (chroot_dir && !username) {
    542 		fprintf(stderr, "tcpdump: Chroot without dropping root is insecure\n");
    543 		exit(1);
    544 	}
    545 
    546 	pw = getpwnam(username);
    547 	if (pw) {
    548 		if (chroot_dir) {
    549 			if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
    550 				fprintf(stderr, "tcpdump: Couldn't chroot/chdir to '%.64s': %s\n",
    551 				    chroot_dir, pcap_strerror(errno));
    552 				exit(1);
    553 			}
    554 		}
    555 #ifdef HAVE_CAP_NG_H
    556 		int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG);
    557 		if (ret < 0) {
    558 			printf("error : ret %d\n", ret);
    559 		}
    560 		/* We don't need CAP_SETUID and CAP_SETGID */
    561 		capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_SETUID);
    562 		capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_SETUID);
    563 		capng_update(CAPNG_DROP, CAPNG_PERMITTED, CAP_SETUID);
    564 		capng_update(CAPNG_DROP, CAPNG_PERMITTED, CAP_SETUID);
    565 		capng_apply(CAPNG_SELECT_BOTH);
    566 
    567 #else
    568 		if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
    569 		    setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
    570 			fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
    571 			    username,
    572 			    (unsigned long)pw->pw_uid,
    573 			    (unsigned long)pw->pw_gid,
    574 			    pcap_strerror(errno));
    575 			exit(1);
    576 		}
    577 #endif /* HAVE_CAP_NG_H */
    578 	}
    579 	else {
    580 		fprintf(stderr, "tcpdump: Couldn't find user '%.32s'\n",
    581 		    username);
    582 		exit(1);
    583 	}
    584 }
    585 #endif /* WIN32 */
    586 
    587 static int
    588 getWflagChars(int x)
    589 {
    590 	int c = 0;
    591 
    592 	x -= 1;
    593 	while (x > 0) {
    594 		c += 1;
    595 		x /= 10;
    596 	}
    597 
    598 	return c;
    599 }
    600 
    601 
    602 static void
    603 MakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
    604 {
    605         char *filename = malloc(PATH_MAX + 1);
    606         if (filename == NULL)
    607             error("Makefilename: malloc");
    608 
    609         /* Process with strftime if Gflag is set. */
    610         if (Gflag != 0) {
    611           struct tm *local_tm;
    612 
    613           /* Convert Gflag_time to a usable format */
    614           if ((local_tm = localtime(&Gflag_time)) == NULL) {
    615                   error("MakeTimedFilename: localtime");
    616           }
    617 
    618           /* There's no good way to detect an error in strftime since a return
    619            * value of 0 isn't necessarily failure.
    620            */
    621           strftime(filename, PATH_MAX, orig_name, local_tm);
    622         } else {
    623           strncpy(filename, orig_name, PATH_MAX);
    624         }
    625 
    626 	if (cnt == 0 && max_chars == 0)
    627 		strncpy(buffer, filename, PATH_MAX + 1);
    628 	else
    629 		if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
    630                   /* Report an error if the filename is too large */
    631                   error("too many output files or filename is too long (> %d)", PATH_MAX);
    632         free(filename);
    633 }
    634 
    635 static int tcpdump_printf(netdissect_options *ndo _U_,
    636 			  const char *fmt, ...)
    637 {
    638 
    639   va_list args;
    640   int ret;
    641 
    642   va_start(args, fmt);
    643   ret=vfprintf(stdout, fmt, args);
    644   va_end(args);
    645 
    646   return ret;
    647 }
    648 
    649 static struct print_info
    650 get_print_info(int type)
    651 {
    652 	struct print_info printinfo;
    653 
    654 	printinfo.ndo_type = 1;
    655 	printinfo.ndo = gndo;
    656 	printinfo.p.ndo_printer = lookup_ndo_printer(type);
    657 	if (printinfo.p.ndo_printer == NULL) {
    658 		printinfo.p.printer = lookup_printer(type);
    659 		printinfo.ndo_type = 0;
    660 		if (printinfo.p.printer == NULL) {
    661 			gndo->ndo_dltname = pcap_datalink_val_to_name(type);
    662 			if (gndo->ndo_dltname != NULL)
    663 				error("packet printing is not supported for link type %s: use -w",
    664 				      gndo->ndo_dltname);
    665 			else
    666 				error("packet printing is not supported for link type %d: use -w", type);
    667 		}
    668 	}
    669 	return (printinfo);
    670 }
    671 
    672 static char *
    673 get_next_file(FILE *VFile, char *ptr)
    674 {
    675 	char *ret;
    676 
    677 	ret = fgets(ptr, PATH_MAX, VFile);
    678 	if (!ret)
    679 		return NULL;
    680 
    681 	if (ptr[strlen(ptr) - 1] == '\n')
    682 		ptr[strlen(ptr) - 1] = '\0';
    683 
    684 	return ret;
    685 }
    686 
    687 int
    688 main(int argc, char **argv)
    689 {
    690 	register int cnt, op, i;
    691 	bpf_u_int32 localnet, netmask;
    692 	register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
    693 	pcap_handler callback;
    694 	int type;
    695 	int dlt;
    696 	int new_dlt;
    697 	const char *dlt_name;
    698 	struct bpf_program fcode;
    699 #ifndef WIN32
    700 	RETSIGTYPE (*oldhandler)(int);
    701 #endif
    702 	struct print_info printinfo;
    703 	struct dump_info dumpinfo;
    704 	u_char *pcap_userdata;
    705 	char ebuf[PCAP_ERRBUF_SIZE];
    706 	char VFileLine[PATH_MAX + 1];
    707 	char *username = NULL;
    708 	char *chroot_dir = NULL;
    709 	char *ret = NULL;
    710 	char *end;
    711 #ifdef HAVE_PCAP_FINDALLDEVS
    712 	pcap_if_t *devpointer;
    713 	int devnum;
    714 #endif
    715 	int status;
    716 	FILE *VFile;
    717 #ifdef WIN32
    718 	if(wsockinit() != 0) return 1;
    719 #endif /* WIN32 */
    720 
    721 	jflag=-1;	/* not set */
    722         gndo->ndo_Oflag=1;
    723 	gndo->ndo_Rflag=1;
    724 	gndo->ndo_dlt=-1;
    725 	gndo->ndo_default_print=ndo_default_print;
    726 	gndo->ndo_printf=tcpdump_printf;
    727 	gndo->ndo_error=ndo_error;
    728 	gndo->ndo_warning=ndo_warning;
    729 	gndo->ndo_snaplen = DEFAULT_SNAPLEN;
    730 
    731 	cnt = -1;
    732 	device = NULL;
    733 	infile = NULL;
    734 	RFileName = NULL;
    735 	VFileName = NULL;
    736 	VFile = NULL;
    737 	WFileName = NULL;
    738 	dlt = -1;
    739 	if ((cp = strrchr(argv[0], '/')) != NULL)
    740 		program_name = cp + 1;
    741 	else
    742 		program_name = argv[0];
    743 
    744 	if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
    745 		error("%s", ebuf);
    746 
    747 #ifdef LIBSMI
    748 	smiInit("tcpdump");
    749 #endif
    750 
    751 	while (
    752 	    (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOp" P_FLAG "q" Q_FLAG "r:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:")) != -1)
    753 		switch (op) {
    754 
    755 		case 'a':
    756 			/* compatibility for old -a */
    757 			break;
    758 
    759 		case 'A':
    760 			++Aflag;
    761 			break;
    762 
    763 		case 'b':
    764 			++bflag;
    765 			break;
    766 
    767 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
    768 		case 'B':
    769 			Bflag = atoi(optarg)*1024;
    770 			if (Bflag <= 0)
    771 				error("invalid packet buffer size %s", optarg);
    772 			break;
    773 #endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
    774 
    775 		case 'c':
    776 			cnt = atoi(optarg);
    777 			if (cnt <= 0)
    778 				error("invalid packet count %s", optarg);
    779 			break;
    780 
    781 		case 'C':
    782 			Cflag = atoi(optarg) * 1000000;
    783 			if (Cflag < 0)
    784 				error("invalid file size %s", optarg);
    785 			break;
    786 
    787 		case 'd':
    788 			++dflag;
    789 			break;
    790 
    791 #ifdef HAVE_PCAP_FINDALLDEVS
    792 		case 'D':
    793 			if (pcap_findalldevs(&devpointer, ebuf) < 0)
    794 				error("%s", ebuf);
    795 			else {
    796 				for (i = 0; devpointer != 0; i++) {
    797 					printf("%d.%s", i+1, devpointer->name);
    798 					if (devpointer->description != NULL)
    799 						printf(" (%s)", devpointer->description);
    800 					printf("\n");
    801 					devpointer = devpointer->next;
    802 				}
    803 			}
    804 			return 0;
    805 #endif /* HAVE_PCAP_FINDALLDEVS */
    806 
    807 		case 'L':
    808 			Lflag++;
    809 			break;
    810 
    811 		case 'e':
    812 			++eflag;
    813 			break;
    814 
    815 		case 'E':
    816 #ifndef HAVE_LIBCRYPTO
    817 			warning("crypto code not compiled in");
    818 #endif
    819 			gndo->ndo_espsecret = optarg;
    820 			break;
    821 
    822 		case 'f':
    823 			++fflag;
    824 			break;
    825 
    826 		case 'F':
    827 			infile = optarg;
    828 			break;
    829 
    830 		case 'G':
    831 			Gflag = atoi(optarg);
    832 			if (Gflag < 0)
    833 				error("invalid number of seconds %s", optarg);
    834 
    835                         /* We will create one file initially. */
    836                         Gflag_count = 0;
    837 
    838 			/* Grab the current time for rotation use. */
    839 			if ((Gflag_time = time(NULL)) == (time_t)-1) {
    840 				error("main: can't get current time: %s",
    841 				    pcap_strerror(errno));
    842 			}
    843 			break;
    844 
    845 		case 'h':
    846 			usage();
    847 			break;
    848 
    849 		case 'H':
    850 			++Hflag;
    851 			break;
    852 
    853 		case 'i':
    854 			if (optarg[0] == '0' && optarg[1] == 0)
    855 				error("Invalid adapter index");
    856 
    857 #ifdef HAVE_PCAP_FINDALLDEVS
    858 			/*
    859 			 * If the argument is a number, treat it as
    860 			 * an index into the list of adapters, as
    861 			 * printed by "tcpdump -D".
    862 			 *
    863 			 * This should be OK on UNIX systems, as interfaces
    864 			 * shouldn't have names that begin with digits.
    865 			 * It can be useful on Windows, where more than
    866 			 * one interface can have the same name.
    867 			 */
    868 			devnum = strtol(optarg, &end, 10);
    869 			if (optarg != end && *end == '\0') {
    870 				if (devnum < 0)
    871 					error("Invalid adapter index");
    872 
    873 				if (pcap_findalldevs(&devpointer, ebuf) < 0)
    874 					error("%s", ebuf);
    875 				else {
    876 					/*
    877 					 * Look for the devnum-th entry
    878 					 * in the list of devices
    879 					 * (1-based).
    880 					 */
    881 					for (i = 0;
    882 					    i < devnum-1 && devpointer != NULL;
    883 					    i++, devpointer = devpointer->next)
    884 						;
    885 					if (devpointer == NULL)
    886 						error("Invalid adapter index");
    887 				}
    888 				device = devpointer->name;
    889 				break;
    890 			}
    891 #endif /* HAVE_PCAP_FINDALLDEVS */
    892 			device = optarg;
    893 			break;
    894 
    895 #ifdef HAVE_PCAP_CREATE
    896 		case 'I':
    897 			++Iflag;
    898 			break;
    899 #endif /* HAVE_PCAP_CREATE */
    900 
    901 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
    902 		case 'j':
    903 			jflag = pcap_tstamp_type_name_to_val(optarg);
    904 			if (jflag < 0)
    905 				error("invalid time stamp type %s", optarg);
    906 			break;
    907 
    908 		case 'J':
    909 			Jflag++;
    910 			break;
    911 #endif
    912 
    913 		case 'l':
    914 #ifdef WIN32
    915 			/*
    916 			 * _IOLBF is the same as _IOFBF in Microsoft's C
    917 			 * libraries; the only alternative they offer
    918 			 * is _IONBF.
    919 			 *
    920 			 * XXX - this should really be checking for MSVC++,
    921 			 * not WIN32, if, for example, MinGW has its own
    922 			 * C library that is more UNIX-compatible.
    923 			 */
    924 			setvbuf(stdout, NULL, _IONBF, 0);
    925 #else /* WIN32 */
    926 #ifdef HAVE_SETLINEBUF
    927 			setlinebuf(stdout);
    928 #else
    929 			setvbuf(stdout, NULL, _IOLBF, 0);
    930 #endif
    931 #endif /* WIN32 */
    932 			break;
    933 
    934 		case 'K':
    935 			++Kflag;
    936 			break;
    937 
    938 		case 'm':
    939 #ifdef LIBSMI
    940 			if (smiLoadModule(optarg) == 0) {
    941 				error("could not load MIB module %s", optarg);
    942 			}
    943 			sflag = 1;
    944 #else
    945 			(void)fprintf(stderr, "%s: ignoring option `-m %s' ",
    946 				      program_name, optarg);
    947 			(void)fprintf(stderr, "(no libsmi support)\n");
    948 #endif
    949 			break;
    950 
    951 		case 'M':
    952 			/* TCP-MD5 shared secret */
    953 #ifndef HAVE_LIBCRYPTO
    954 			warning("crypto code not compiled in");
    955 #endif
    956 			sigsecret = optarg;
    957 			break;
    958 
    959 		case 'n':
    960 			++nflag;
    961 			break;
    962 
    963 		case 'N':
    964 			++Nflag;
    965 			break;
    966 
    967 		case 'O':
    968 			Oflag = 0;
    969 			break;
    970 
    971 		case 'p':
    972 			++pflag;
    973 			break;
    974 #ifdef HAVE_PCAP_SETDIRECTION
    975 		case 'P':
    976 			warning("don't use -P, use -Q; -P will be used for pcap-ng output in the future");
    977 			/* FALLTHROUGH */
    978 
    979 		case 'Q':
    980 			if (strcasecmp(optarg, "in") == 0)
    981 				Pflag = PCAP_D_IN;
    982 			else if (strcasecmp(optarg, "out") == 0)
    983 				Pflag = PCAP_D_OUT;
    984 			else if (strcasecmp(optarg, "inout") == 0)
    985 				Pflag = PCAP_D_INOUT;
    986 			else
    987 				error("unknown capture direction `%s'", optarg);
    988 			break;
    989 #endif /* HAVE_PCAP_SETDIRECTION */
    990 		case 'q':
    991 			++qflag;
    992 			++suppress_default_print;
    993 			break;
    994 
    995 		case 'r':
    996 			RFileName = optarg;
    997 			break;
    998 
    999 		case 'R':
   1000 			Rflag = 0;
   1001 			break;
   1002 
   1003 		case 's':
   1004 			snaplen = strtol(optarg, &end, 0);
   1005 			if (optarg == end || *end != '\0'
   1006 			    || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN)
   1007 				error("invalid snaplen %s", optarg);
   1008 			else if (snaplen == 0)
   1009 				snaplen = MAXIMUM_SNAPLEN;
   1010 			break;
   1011 
   1012 		case 'S':
   1013 			++Sflag;
   1014 			break;
   1015 
   1016 		case 't':
   1017 			++tflag;
   1018 			break;
   1019 
   1020 		case 'T':
   1021 			if (strcasecmp(optarg, "vat") == 0)
   1022 				packettype = PT_VAT;
   1023 			else if (strcasecmp(optarg, "wb") == 0)
   1024 				packettype = PT_WB;
   1025 			else if (strcasecmp(optarg, "rpc") == 0)
   1026 				packettype = PT_RPC;
   1027 			else if (strcasecmp(optarg, "rtp") == 0)
   1028 				packettype = PT_RTP;
   1029 			else if (strcasecmp(optarg, "rtcp") == 0)
   1030 				packettype = PT_RTCP;
   1031 			else if (strcasecmp(optarg, "snmp") == 0)
   1032 				packettype = PT_SNMP;
   1033 			else if (strcasecmp(optarg, "cnfp") == 0)
   1034 				packettype = PT_CNFP;
   1035 			else if (strcasecmp(optarg, "tftp") == 0)
   1036 				packettype = PT_TFTP;
   1037 			else if (strcasecmp(optarg, "aodv") == 0)
   1038 				packettype = PT_AODV;
   1039 			else if (strcasecmp(optarg, "carp") == 0)
   1040 				packettype = PT_CARP;
   1041 			else if (strcasecmp(optarg, "radius") == 0)
   1042 				packettype = PT_RADIUS;
   1043 			else if (strcasecmp(optarg, "zmtp1") == 0)
   1044 				packettype = PT_ZMTP1;
   1045 			else if (strcasecmp(optarg, "vxlan") == 0)
   1046 				packettype = PT_VXLAN;
   1047 			else if (strcasecmp(optarg, "pgm") == 0)
   1048 				packettype = PT_PGM;
   1049 			else if (strcasecmp(optarg, "pgm_zmtp1") == 0)
   1050 				packettype = PT_PGM_ZMTP1;
   1051 			else if (strcasecmp(optarg, "lmp") == 0)
   1052 				packettype = PT_LMP;
   1053 			else
   1054 				error("unknown packet type `%s'", optarg);
   1055 			break;
   1056 
   1057 		case 'u':
   1058 			++uflag;
   1059 			break;
   1060 
   1061 #ifdef HAVE_PCAP_DUMP_FLUSH
   1062 		case 'U':
   1063 			++Uflag;
   1064 			break;
   1065 #endif
   1066 
   1067 		case 'v':
   1068 			++vflag;
   1069 			break;
   1070 
   1071 		case 'V':
   1072 			VFileName = optarg;
   1073 			break;
   1074 
   1075 		case 'w':
   1076 			WFileName = optarg;
   1077 			break;
   1078 
   1079 		case 'W':
   1080 			Wflag = atoi(optarg);
   1081 			if (Wflag < 0)
   1082 				error("invalid number of output files %s", optarg);
   1083 			WflagChars = getWflagChars(Wflag);
   1084 			break;
   1085 
   1086 		case 'x':
   1087 			++xflag;
   1088 			++suppress_default_print;
   1089 			break;
   1090 
   1091 		case 'X':
   1092 			++Xflag;
   1093 			++suppress_default_print;
   1094 			break;
   1095 
   1096 		case 'y':
   1097 			gndo->ndo_dltname = optarg;
   1098 			gndo->ndo_dlt =
   1099 			  pcap_datalink_name_to_val(gndo->ndo_dltname);
   1100 			if (gndo->ndo_dlt < 0)
   1101 				error("invalid data link type %s", gndo->ndo_dltname);
   1102 			break;
   1103 
   1104 #if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
   1105 		case 'Y':
   1106 			{
   1107 			/* Undocumented flag */
   1108 #ifdef HAVE_PCAP_DEBUG
   1109 			extern int pcap_debug;
   1110 			pcap_debug = 1;
   1111 #else
   1112 			extern int yydebug;
   1113 			yydebug = 1;
   1114 #endif
   1115 			}
   1116 			break;
   1117 #endif
   1118 		case 'z':
   1119 			if (optarg) {
   1120 				zflag = strdup(optarg);
   1121 			} else {
   1122 				usage();
   1123 				/* NOTREACHED */
   1124 			}
   1125 			break;
   1126 
   1127 		case 'Z':
   1128 			if (optarg) {
   1129 				username = strdup(optarg);
   1130 			}
   1131 			else {
   1132 				usage();
   1133 				/* NOTREACHED */
   1134 			}
   1135 			break;
   1136 
   1137 		default:
   1138 			usage();
   1139 			/* NOTREACHED */
   1140 		}
   1141 
   1142 	switch (tflag) {
   1143 
   1144 	case 0: /* Default */
   1145 	case 4: /* Default + Date*/
   1146 		thiszone = gmt2local(0);
   1147 		break;
   1148 
   1149 	case 1: /* No time stamp */
   1150 	case 2: /* Unix timeval style */
   1151 	case 3: /* Microseconds since previous packet */
   1152         case 5: /* Microseconds since first packet */
   1153 		break;
   1154 
   1155 	default: /* Not supported */
   1156 		error("only -t, -tt, -ttt, -tttt and -ttttt are supported");
   1157 		break;
   1158 	}
   1159 
   1160 	if (fflag != 0 && (VFileName != NULL || RFileName != NULL))
   1161 		error("-f can not be used with -V or -r");
   1162 
   1163 	if (VFileName != NULL && RFileName != NULL)
   1164 		error("-V and -r are mutually exclusive.");
   1165 
   1166 #ifdef WITH_CHROOT
   1167 	/* if run as root, prepare for chrooting */
   1168 	if (getuid() == 0 || geteuid() == 0) {
   1169 		/* future extensibility for cmd-line arguments */
   1170 		if (!chroot_dir)
   1171 			chroot_dir = WITH_CHROOT;
   1172 	}
   1173 #endif
   1174 
   1175 #ifdef WITH_USER
   1176 	/* if run as root, prepare for dropping root privileges */
   1177 	if (getuid() == 0 || geteuid() == 0) {
   1178 		/* Run with '-Z root' to restore old behaviour */
   1179 		if (!username)
   1180 			username = WITH_USER;
   1181 	}
   1182 #endif
   1183 
   1184 	if (RFileName != NULL || VFileName != NULL) {
   1185 		/*
   1186 		 * If RFileName is non-null, it's the pathname of a
   1187 		 * savefile to read.  If VFileName is non-null, it's
   1188 		 * the pathname of a file containing a list of pathnames
   1189 		 * (one per line) of savefiles to read.
   1190 		 *
   1191 		 * In either case, we're reading a savefile, not doing
   1192 		 * a live capture.
   1193 		 */
   1194 #ifndef WIN32
   1195 		/*
   1196 		 * We don't need network access, so relinquish any set-UID
   1197 		 * or set-GID privileges we have (if any).
   1198 		 *
   1199 		 * We do *not* want set-UID privileges when opening a
   1200 		 * trace file, as that might let the user read other
   1201 		 * people's trace files (especially if we're set-UID
   1202 		 * root).
   1203 		 */
   1204 		if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
   1205 			fprintf(stderr, "Warning: setgid/setuid failed !\n");
   1206 #endif /* WIN32 */
   1207 		if (VFileName != NULL) {
   1208 			if (VFileName[0] == '-' && VFileName[1] == '\0')
   1209 				VFile = stdin;
   1210 			else
   1211 				VFile = fopen(VFileName, "r");
   1212 
   1213 			if (VFile == NULL)
   1214 				error("Unable to open file: %s\n", strerror(errno));
   1215 
   1216 			ret = get_next_file(VFile, VFileLine);
   1217 			if (!ret)
   1218 				error("Nothing in %s\n", VFileName);
   1219 			RFileName = VFileLine;
   1220 		}
   1221 
   1222 		pd = pcap_open_offline(RFileName, ebuf);
   1223 		if (pd == NULL)
   1224 			error("%s", ebuf);
   1225 		dlt = pcap_datalink(pd);
   1226 		dlt_name = pcap_datalink_val_to_name(dlt);
   1227 		if (dlt_name == NULL) {
   1228 			fprintf(stderr, "reading from file %s, link-type %u\n",
   1229 			    RFileName, dlt);
   1230 		} else {
   1231 			fprintf(stderr,
   1232 			    "reading from file %s, link-type %s (%s)\n",
   1233 			    RFileName, dlt_name,
   1234 			    pcap_datalink_val_to_description(dlt));
   1235 		}
   1236 		localnet = 0;
   1237 		netmask = 0;
   1238 	} else {
   1239 		/*
   1240 		 * We're doing a live capture.
   1241 		 */
   1242 		if (device == NULL) {
   1243 			device = pcap_lookupdev(ebuf);
   1244 			if (device == NULL)
   1245 				error("%s", ebuf);
   1246 		}
   1247 #ifdef WIN32
   1248 		/*
   1249 		 * Print a message to the standard error on Windows.
   1250 		 * XXX - why do it here, with a different message?
   1251 		 */
   1252 		if(strlen(device) == 1)	/* we assume that an ASCII string is always longer than 1 char */
   1253 		{						/* a Unicode string has a \0 as second byte (so strlen() is 1) */
   1254 			fprintf(stderr, "%s: listening on %ws\n", program_name, device);
   1255 		}
   1256 		else
   1257 		{
   1258 			fprintf(stderr, "%s: listening on %s\n", program_name, device);
   1259 		}
   1260 
   1261 		fflush(stderr);
   1262 #endif /* WIN32 */
   1263 #ifdef HAVE_PCAP_CREATE
   1264 		pd = pcap_create(device, ebuf);
   1265 		if (pd == NULL)
   1266 			error("%s", ebuf);
   1267 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
   1268 		if (Jflag)
   1269 			show_tstamp_types_and_exit(device, pd);
   1270 #endif
   1271 		/*
   1272 		 * Is this an interface that supports monitor mode?
   1273 		 */
   1274 		if (pcap_can_set_rfmon(pd) == 1)
   1275 			supports_monitor_mode = 1;
   1276 		else
   1277 			supports_monitor_mode = 0;
   1278 		status = pcap_set_snaplen(pd, snaplen);
   1279 		if (status != 0)
   1280 			error("%s: Can't set snapshot length: %s",
   1281 			    device, pcap_statustostr(status));
   1282 		status = pcap_set_promisc(pd, !pflag);
   1283 		if (status != 0)
   1284 			error("%s: Can't set promiscuous mode: %s",
   1285 			    device, pcap_statustostr(status));
   1286 		if (Iflag) {
   1287 			status = pcap_set_rfmon(pd, 1);
   1288 			if (status != 0)
   1289 				error("%s: Can't set monitor mode: %s",
   1290 				    device, pcap_statustostr(status));
   1291 		}
   1292 		status = pcap_set_timeout(pd, 1000);
   1293 		if (status != 0)
   1294 			error("%s: pcap_set_timeout failed: %s",
   1295 			    device, pcap_statustostr(status));
   1296 		if (Bflag != 0) {
   1297 			status = pcap_set_buffer_size(pd, Bflag);
   1298 			if (status != 0)
   1299 				error("%s: Can't set buffer size: %s",
   1300 				    device, pcap_statustostr(status));
   1301 		}
   1302 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
   1303                 if (jflag != -1) {
   1304 			status = pcap_set_tstamp_type(pd, jflag);
   1305 			if (status < 0)
   1306 				error("%s: Can't set time stamp type: %s",
   1307 			    	    device, pcap_statustostr(status));
   1308 		}
   1309 #endif
   1310 		status = pcap_activate(pd);
   1311 		if (status < 0) {
   1312 			/*
   1313 			 * pcap_activate() failed.
   1314 			 */
   1315 			cp = pcap_geterr(pd);
   1316 			if (status == PCAP_ERROR)
   1317 				error("%s", cp);
   1318 			else if ((status == PCAP_ERROR_NO_SUCH_DEVICE ||
   1319 			          status == PCAP_ERROR_PERM_DENIED) &&
   1320 			         *cp != '\0')
   1321 				error("%s: %s\n(%s)", device,
   1322 				    pcap_statustostr(status), cp);
   1323 			else
   1324 				error("%s: %s", device,
   1325 				    pcap_statustostr(status));
   1326 		} else if (status > 0) {
   1327 			/*
   1328 			 * pcap_activate() succeeded, but it's warning us
   1329 			 * of a problem it had.
   1330 			 */
   1331 			cp = pcap_geterr(pd);
   1332 			if (status == PCAP_WARNING)
   1333 				warning("%s", cp);
   1334 			else if (status == PCAP_WARNING_PROMISC_NOTSUP &&
   1335 			         *cp != '\0')
   1336 				warning("%s: %s\n(%s)", device,
   1337 				    pcap_statustostr(status), cp);
   1338 			else
   1339 				warning("%s: %s", device,
   1340 				    pcap_statustostr(status));
   1341 		}
   1342 #ifdef HAVE_PCAP_SETDIRECTION
   1343 		if (Pflag != -1) {
   1344 			status = pcap_setdirection(pd, Pflag);
   1345 			if (status != 0)
   1346 				error("%s: pcap_setdirection() failed: %s",
   1347 				      device,  pcap_geterr(pd));
   1348 		}
   1349 #endif
   1350 #else
   1351 		*ebuf = '\0';
   1352 		pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
   1353 		if (pd == NULL)
   1354 			error("%s", ebuf);
   1355 		else if (*ebuf)
   1356 			warning("%s", ebuf);
   1357 #endif /* HAVE_PCAP_CREATE */
   1358 		/*
   1359 		 * Let user own process after socket has been opened.
   1360 		 */
   1361 #ifndef WIN32
   1362 		if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
   1363 			fprintf(stderr, "Warning: setgid/setuid failed !\n");
   1364 #endif /* WIN32 */
   1365 #if !defined(HAVE_PCAP_CREATE) && defined(WIN32)
   1366 		if(Bflag != 0)
   1367 			if(pcap_setbuff(pd, Bflag)==-1){
   1368 				error("%s", pcap_geterr(pd));
   1369 			}
   1370 #endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */
   1371 		if (Lflag)
   1372 			show_dlts_and_exit(device, pd);
   1373 		if (gndo->ndo_dlt >= 0) {
   1374 #ifdef HAVE_PCAP_SET_DATALINK
   1375 			if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)
   1376 				error("%s", pcap_geterr(pd));
   1377 #else
   1378 			/*
   1379 			 * We don't actually support changing the
   1380 			 * data link type, so we only let them
   1381 			 * set it to what it already is.
   1382 			 */
   1383 			if (gndo->ndo_dlt != pcap_datalink(pd)) {
   1384 				error("%s is not one of the DLTs supported by this device\n",
   1385 				      gndo->ndo_dltname);
   1386 			}
   1387 #endif
   1388 			(void)fprintf(stderr, "%s: data link type %s\n",
   1389 				      program_name, gndo->ndo_dltname);
   1390 			(void)fflush(stderr);
   1391 		}
   1392 		i = pcap_snapshot(pd);
   1393 		if (snaplen < i) {
   1394 			warning("snaplen raised from %d to %d", snaplen, i);
   1395 			snaplen = i;
   1396 		}
   1397 		if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
   1398 			localnet = 0;
   1399 			netmask = 0;
   1400 			warning("%s", ebuf);
   1401 		}
   1402 	}
   1403 	if (infile)
   1404 		cmdbuf = read_infile(infile);
   1405 	else
   1406 		cmdbuf = copy_argv(&argv[optind]);
   1407 
   1408 	if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
   1409 		error("%s", pcap_geterr(pd));
   1410 	if (dflag) {
   1411 		bpf_dump(&fcode, dflag);
   1412 		pcap_close(pd);
   1413 		free(cmdbuf);
   1414 		exit(0);
   1415 	}
   1416 	init_addrtoname(localnet, netmask);
   1417         init_checksum();
   1418 
   1419 #ifndef WIN32
   1420 	(void)setsignal(SIGPIPE, cleanup);
   1421 	(void)setsignal(SIGTERM, cleanup);
   1422 	(void)setsignal(SIGINT, cleanup);
   1423 #endif /* WIN32 */
   1424 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
   1425 	(void)setsignal(SIGCHLD, child_cleanup);
   1426 #endif
   1427 	/* Cooperate with nohup(1) */
   1428 #ifndef WIN32
   1429 	if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
   1430 		(void)setsignal(SIGHUP, oldhandler);
   1431 #endif /* WIN32 */
   1432 
   1433 #ifndef WIN32
   1434 	/*
   1435 	 * If a user name was specified with "-Z", attempt to switch to
   1436 	 * that user's UID.  This would probably be used with sudo,
   1437 	 * to allow tcpdump to be run in a special restricted
   1438 	 * account (if you just want to allow users to open capture
   1439 	 * devices, and can't just give users that permission,
   1440 	 * you'd make tcpdump set-UID or set-GID).
   1441 	 *
   1442 	 * Tcpdump doesn't necessarily write only to one savefile;
   1443 	 * the general only way to allow a -Z instance to write to
   1444 	 * savefiles as the user under whose UID it's run, rather
   1445 	 * than as the user specified with -Z, would thus be to switch
   1446 	 * to the original user ID before opening a capture file and
   1447 	 * then switch back to the -Z user ID after opening the savefile.
   1448 	 * Switching to the -Z user ID only after opening the first
   1449 	 * savefile doesn't handle the general case.
   1450 	 */
   1451 
   1452 #ifdef HAVE_CAP_NG_H
   1453 	/* We are running as root and we will be writing to savefile */
   1454 	if ((getuid() == 0 || geteuid() == 0) && WFileName) {
   1455 		if (username) {
   1456 			/* Drop all capabilities from effective set */
   1457 			capng_clear(CAPNG_EFFECTIVE);
   1458 			/* Add capabilities we will need*/
   1459 			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_SETUID);
   1460 			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_SETGID);
   1461 			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_DAC_OVERRIDE);
   1462 
   1463 			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_SETUID);
   1464 			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_SETGID);
   1465 			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
   1466 
   1467 			capng_apply(CAPNG_SELECT_BOTH);
   1468 		}
   1469 	}
   1470 #endif /* HAVE_CAP_NG_H */
   1471 
   1472 	if (getuid() == 0 || geteuid() == 0) {
   1473 		if (username || chroot_dir)
   1474 			droproot(username, chroot_dir);
   1475 
   1476 	}
   1477 #endif /* WIN32 */
   1478 
   1479 	if (pcap_setfilter(pd, &fcode) < 0)
   1480 		error("%s", pcap_geterr(pd));
   1481 	if (WFileName) {
   1482 		pcap_dumper_t *p;
   1483 		/* Do not exceed the default PATH_MAX for files. */
   1484 		dumpinfo.CurrentFileName = (char *)malloc(PATH_MAX + 1);
   1485 
   1486 		if (dumpinfo.CurrentFileName == NULL)
   1487 			error("malloc of dumpinfo.CurrentFileName");
   1488 
   1489 		/* We do not need numbering for dumpfiles if Cflag isn't set. */
   1490 		if (Cflag != 0)
   1491 		  MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
   1492 		else
   1493 		  MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
   1494 
   1495 		p = pcap_dump_open(pd, dumpinfo.CurrentFileName);
   1496 #ifdef HAVE_CAP_NG_H
   1497         /* Give up capabilities, clear Effective set */
   1498         capng_clear(CAPNG_EFFECTIVE);
   1499 #endif
   1500 		if (p == NULL)
   1501 			error("%s", pcap_geterr(pd));
   1502 		if (Cflag != 0 || Gflag != 0) {
   1503 			callback = dump_packet_and_trunc;
   1504 			dumpinfo.WFileName = WFileName;
   1505 			dumpinfo.pd = pd;
   1506 			dumpinfo.p = p;
   1507 			pcap_userdata = (u_char *)&dumpinfo;
   1508 		} else {
   1509 			callback = dump_packet;
   1510 			pcap_userdata = (u_char *)p;
   1511 		}
   1512 #ifdef HAVE_PCAP_DUMP_FLUSH
   1513 		if (Uflag)
   1514 			pcap_dump_flush(p);
   1515 #endif
   1516 	} else {
   1517 		type = pcap_datalink(pd);
   1518 		printinfo = get_print_info(type);
   1519 		callback = print_packet;
   1520 		pcap_userdata = (u_char *)&printinfo;
   1521 	}
   1522 
   1523 #ifdef SIGNAL_REQ_INFO
   1524 	/*
   1525 	 * We can't get statistics when reading from a file rather
   1526 	 * than capturing from a device.
   1527 	 */
   1528 	if (RFileName == NULL)
   1529 		(void)setsignal(SIGNAL_REQ_INFO, requestinfo);
   1530 #endif
   1531 
   1532 	if (vflag > 0 && WFileName) {
   1533 		/*
   1534 		 * When capturing to a file, "-v" means tcpdump should,
   1535 		 * every 10 secodns, "v"erbosely report the number of
   1536 		 * packets captured.
   1537 		 */
   1538 #ifdef USE_WIN32_MM_TIMER
   1539 		/* call verbose_stats_dump() each 1000 +/-100msec */
   1540 		timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
   1541 		setvbuf(stderr, NULL, _IONBF, 0);
   1542 #elif defined(HAVE_ALARM)
   1543 		(void)setsignal(SIGALRM, verbose_stats_dump);
   1544 		alarm(1);
   1545 #endif
   1546 	}
   1547 
   1548 #ifndef WIN32
   1549 	if (RFileName == NULL) {
   1550 		/*
   1551 		 * Live capture (if -V was specified, we set RFileName
   1552 		 * to a file from the -V file).  Print a message to
   1553 		 * the standard error on UN*X.
   1554 		 */
   1555 		if (!vflag && !WFileName) {
   1556 			(void)fprintf(stderr,
   1557 			    "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
   1558 			    program_name);
   1559 		} else
   1560 			(void)fprintf(stderr, "%s: ", program_name);
   1561 		dlt = pcap_datalink(pd);
   1562 		dlt_name = pcap_datalink_val_to_name(dlt);
   1563 		if (dlt_name == NULL) {
   1564 			(void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n",
   1565 			    device, dlt, snaplen);
   1566 		} else {
   1567 			(void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n",
   1568 			    device, dlt_name,
   1569 			    pcap_datalink_val_to_description(dlt), snaplen);
   1570 		}
   1571 		(void)fflush(stderr);
   1572 	}
   1573 #endif /* WIN32 */
   1574 	do {
   1575 		status = pcap_loop(pd, cnt, callback, pcap_userdata);
   1576 		if (WFileName == NULL) {
   1577 			/*
   1578 			 * We're printing packets.  Flush the printed output,
   1579 			 * so it doesn't get intermingled with error output.
   1580 			 */
   1581 			if (status == -2) {
   1582 				/*
   1583 				 * We got interrupted, so perhaps we didn't
   1584 				 * manage to finish a line we were printing.
   1585 				 * Print an extra newline, just in case.
   1586 				 */
   1587 				putchar('\n');
   1588 			}
   1589 			(void)fflush(stdout);
   1590 		}
   1591                 if (status == -2) {
   1592 			/*
   1593 			 * We got interrupted. If we are reading multiple
   1594 			 * files (via -V) set these so that we stop.
   1595 			 */
   1596 			VFileName = NULL;
   1597 			ret = NULL;
   1598 		}
   1599 		if (status == -1) {
   1600 			/*
   1601 			 * Error.  Report it.
   1602 			 */
   1603 			(void)fprintf(stderr, "%s: pcap_loop: %s\n",
   1604 			    program_name, pcap_geterr(pd));
   1605 		}
   1606 		if (RFileName == NULL) {
   1607 			/*
   1608 			 * We're doing a live capture.  Report the capture
   1609 			 * statistics.
   1610 			 */
   1611 			info(1);
   1612 		}
   1613 		pcap_close(pd);
   1614 		if (VFileName != NULL) {
   1615 			ret = get_next_file(VFile, VFileLine);
   1616 			if (ret) {
   1617 				RFileName = VFileLine;
   1618 				pd = pcap_open_offline(RFileName, ebuf);
   1619 				if (pd == NULL)
   1620 					error("%s", ebuf);
   1621 				new_dlt = pcap_datalink(pd);
   1622 				if (WFileName && new_dlt != dlt)
   1623 					error("%s: new dlt does not match original", RFileName);
   1624 				printinfo = get_print_info(new_dlt);
   1625 				dlt_name = pcap_datalink_val_to_name(new_dlt);
   1626 				if (dlt_name == NULL) {
   1627 					fprintf(stderr, "reading from file %s, link-type %u\n",
   1628 					RFileName, new_dlt);
   1629 				} else {
   1630 					fprintf(stderr,
   1631 					"reading from file %s, link-type %s (%s)\n",
   1632 					RFileName, dlt_name,
   1633 					pcap_datalink_val_to_description(new_dlt));
   1634 				}
   1635 				if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
   1636 					error("%s", pcap_geterr(pd));
   1637 				if (pcap_setfilter(pd, &fcode) < 0)
   1638 					error("%s", pcap_geterr(pd));
   1639 			}
   1640 		}
   1641 	}
   1642 	while (ret != NULL);
   1643 
   1644 	free(cmdbuf);
   1645 	exit(status == -1 ? 1 : 0);
   1646 }
   1647 
   1648 /* make a clean exit on interrupts */
   1649 static RETSIGTYPE
   1650 cleanup(int signo _U_)
   1651 {
   1652 #ifdef USE_WIN32_MM_TIMER
   1653 	if (timer_id)
   1654 		timeKillEvent(timer_id);
   1655 	timer_id = 0;
   1656 #elif defined(HAVE_ALARM)
   1657 	alarm(0);
   1658 #endif
   1659 
   1660 #ifdef HAVE_PCAP_BREAKLOOP
   1661 	/*
   1662 	 * We have "pcap_breakloop()"; use it, so that we do as little
   1663 	 * as possible in the signal handler (it's probably not safe
   1664 	 * to do anything with standard I/O streams in a signal handler -
   1665 	 * the ANSI C standard doesn't say it is).
   1666 	 */
   1667 	pcap_breakloop(pd);
   1668 #else
   1669 	/*
   1670 	 * We don't have "pcap_breakloop()"; this isn't safe, but
   1671 	 * it's the best we can do.  Print the summary if we're
   1672 	 * not reading from a savefile - i.e., if we're doing a
   1673 	 * live capture - and exit.
   1674 	 */
   1675 	if (pd != NULL && pcap_file(pd) == NULL) {
   1676 		/*
   1677 		 * We got interrupted, so perhaps we didn't
   1678 		 * manage to finish a line we were printing.
   1679 		 * Print an extra newline, just in case.
   1680 		 */
   1681 		putchar('\n');
   1682 		(void)fflush(stdout);
   1683 		info(1);
   1684 	}
   1685 	exit(0);
   1686 #endif
   1687 }
   1688 
   1689 /*
   1690   On windows, we do not use a fork, so we do not care less about
   1691   waiting a child processes to die
   1692  */
   1693 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
   1694 static RETSIGTYPE
   1695 child_cleanup(int signo _U_)
   1696 {
   1697   wait(NULL);
   1698 }
   1699 #endif /* HAVE_FORK && HAVE_VFORK */
   1700 
   1701 static void
   1702 info(register int verbose)
   1703 {
   1704 	struct pcap_stat stat;
   1705 
   1706 	/*
   1707 	 * Older versions of libpcap didn't set ps_ifdrop on some
   1708 	 * platforms; initialize it to 0 to handle that.
   1709 	 */
   1710 	stat.ps_ifdrop = 0;
   1711 	if (pcap_stats(pd, &stat) < 0) {
   1712 		(void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
   1713 		infoprint = 0;
   1714 		return;
   1715 	}
   1716 
   1717 	if (!verbose)
   1718 		fprintf(stderr, "%s: ", program_name);
   1719 
   1720 	(void)fprintf(stderr, "%u packet%s captured", packets_captured,
   1721 	    PLURAL_SUFFIX(packets_captured));
   1722 	if (!verbose)
   1723 		fputs(", ", stderr);
   1724 	else
   1725 		putc('\n', stderr);
   1726 	(void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv,
   1727 	    PLURAL_SUFFIX(stat.ps_recv));
   1728 	if (!verbose)
   1729 		fputs(", ", stderr);
   1730 	else
   1731 		putc('\n', stderr);
   1732 	(void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop,
   1733 	    PLURAL_SUFFIX(stat.ps_drop));
   1734 	if (stat.ps_ifdrop != 0) {
   1735 		if (!verbose)
   1736 			fputs(", ", stderr);
   1737 		else
   1738 			putc('\n', stderr);
   1739 		(void)fprintf(stderr, "%u packet%s dropped by interface\n",
   1740 		    stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
   1741 	} else
   1742 		putc('\n', stderr);
   1743 	infoprint = 0;
   1744 }
   1745 
   1746 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
   1747 static void
   1748 compress_savefile(const char *filename)
   1749 {
   1750 # ifdef HAVE_FORK
   1751 	if (fork())
   1752 # else
   1753 	if (vfork())
   1754 # endif
   1755 		return;
   1756 	/*
   1757 	 * Set to lowest priority so that this doesn't disturb the capture
   1758 	 */
   1759 #ifdef NZERO
   1760 	setpriority(PRIO_PROCESS, 0, NZERO - 1);
   1761 #else
   1762 	setpriority(PRIO_PROCESS, 0, 19);
   1763 #endif
   1764 	if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
   1765 		fprintf(stderr,
   1766 			"compress_savefile:execlp(%s, %s): %s\n",
   1767 			zflag,
   1768 			filename,
   1769 			strerror(errno));
   1770 # ifdef HAVE_FORK
   1771 	exit(1);
   1772 # else
   1773 	_exit(1);
   1774 # endif
   1775 }
   1776 #else  /* HAVE_FORK && HAVE_VFORK */
   1777 static void
   1778 compress_savefile(const char *filename)
   1779 {
   1780 	fprintf(stderr,
   1781 		"compress_savefile failed. Functionality not implemented under your system\n");
   1782 }
   1783 #endif /* HAVE_FORK && HAVE_VFORK */
   1784 
   1785 static void
   1786 dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
   1787 {
   1788 	struct dump_info *dump_info;
   1789 
   1790 	++packets_captured;
   1791 
   1792 	++infodelay;
   1793 
   1794 	dump_info = (struct dump_info *)user;
   1795 
   1796 	/*
   1797 	 * XXX - this won't force the file to rotate on the specified time
   1798 	 * boundary, but it will rotate on the first packet received after the
   1799 	 * specified Gflag number of seconds. Note: if a Gflag time boundary
   1800 	 * and a Cflag size boundary coincide, the time rotation will occur
   1801 	 * first thereby cancelling the Cflag boundary (since the file should
   1802 	 * be 0).
   1803 	 */
   1804 	if (Gflag != 0) {
   1805 		/* Check if it is time to rotate */
   1806 		time_t t;
   1807 
   1808 		/* Get the current time */
   1809 		if ((t = time(NULL)) == (time_t)-1) {
   1810 			error("dump_and_trunc_packet: can't get current_time: %s",
   1811 			    pcap_strerror(errno));
   1812 		}
   1813 
   1814 
   1815 		/* If the time is greater than the specified window, rotate */
   1816 		if (t - Gflag_time >= Gflag) {
   1817 			/* Update the Gflag_time */
   1818 			Gflag_time = t;
   1819 			/* Update Gflag_count */
   1820 			Gflag_count++;
   1821 			/*
   1822 			 * Close the current file and open a new one.
   1823 			 */
   1824 			pcap_dump_close(dump_info->p);
   1825 
   1826 			/*
   1827 			 * Compress the file we just closed, if the user asked for it
   1828 			 */
   1829 			if (zflag != NULL)
   1830 				compress_savefile(dump_info->CurrentFileName);
   1831 
   1832 			/*
   1833 			 * Check to see if we've exceeded the Wflag (when
   1834 			 * not using Cflag).
   1835 			 */
   1836 			if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) {
   1837 				(void)fprintf(stderr, "Maximum file limit reached: %d\n",
   1838 				    Wflag);
   1839 				exit(0);
   1840 				/* NOTREACHED */
   1841 			}
   1842 			if (dump_info->CurrentFileName != NULL)
   1843 				free(dump_info->CurrentFileName);
   1844 			/* Allocate space for max filename + \0. */
   1845 			dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
   1846 			if (dump_info->CurrentFileName == NULL)
   1847 				error("dump_packet_and_trunc: malloc");
   1848 			/*
   1849 			 * This is always the first file in the Cflag
   1850 			 * rotation: e.g. 0
   1851 			 * We also don't need numbering if Cflag is not set.
   1852 			 */
   1853 			if (Cflag != 0)
   1854 				MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
   1855 				    WflagChars);
   1856 			else
   1857 				MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
   1858 
   1859 #ifdef HAVE_CAP_NG_H
   1860 			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
   1861 			capng_apply(CAPNG_EFFECTIVE);
   1862 #endif /* HAVE_CAP_NG_H */
   1863 			dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
   1864 #ifdef HAVE_CAP_NG_H
   1865 			capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
   1866 			capng_apply(CAPNG_EFFECTIVE);
   1867 #endif /* HAVE_CAP_NG_H */
   1868 			if (dump_info->p == NULL)
   1869 				error("%s", pcap_geterr(pd));
   1870 		}
   1871 	}
   1872 
   1873 	/*
   1874 	 * XXX - this won't prevent capture files from getting
   1875 	 * larger than Cflag - the last packet written to the
   1876 	 * file could put it over Cflag.
   1877 	 */
   1878 	if (Cflag != 0 && pcap_dump_ftell(dump_info->p) > Cflag) {
   1879 		/*
   1880 		 * Close the current file and open a new one.
   1881 		 */
   1882 		pcap_dump_close(dump_info->p);
   1883 
   1884 		/*
   1885 		 * Compress the file we just closed, if the user asked for it
   1886 		 */
   1887 		if (zflag != NULL)
   1888 			compress_savefile(dump_info->CurrentFileName);
   1889 
   1890 		Cflag_count++;
   1891 		if (Wflag > 0) {
   1892 			if (Cflag_count >= Wflag)
   1893 				Cflag_count = 0;
   1894 		}
   1895 		if (dump_info->CurrentFileName != NULL)
   1896 			free(dump_info->CurrentFileName);
   1897 		dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
   1898 		if (dump_info->CurrentFileName == NULL)
   1899 			error("dump_packet_and_trunc: malloc");
   1900 		MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
   1901 		dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
   1902 		if (dump_info->p == NULL)
   1903 			error("%s", pcap_geterr(pd));
   1904 	}
   1905 
   1906 	pcap_dump((u_char *)dump_info->p, h, sp);
   1907 #ifdef HAVE_PCAP_DUMP_FLUSH
   1908 	if (Uflag)
   1909 		pcap_dump_flush(dump_info->p);
   1910 #endif
   1911 
   1912 	--infodelay;
   1913 	if (infoprint)
   1914 		info(0);
   1915 }
   1916 
   1917 static void
   1918 dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
   1919 {
   1920 	++packets_captured;
   1921 
   1922 	++infodelay;
   1923 
   1924 	pcap_dump(user, h, sp);
   1925 #ifdef HAVE_PCAP_DUMP_FLUSH
   1926 	if (Uflag)
   1927 		pcap_dump_flush((pcap_dumper_t *)user);
   1928 #endif
   1929 
   1930 	--infodelay;
   1931 	if (infoprint)
   1932 		info(0);
   1933 }
   1934 
   1935 static void
   1936 print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
   1937 {
   1938 	struct print_info *print_info;
   1939 	u_int hdrlen;
   1940 
   1941 	++packets_captured;
   1942 
   1943 	++infodelay;
   1944 	ts_print(&h->ts);
   1945 
   1946 	print_info = (struct print_info *)user;
   1947 
   1948 	/*
   1949 	 * Some printers want to check that they're not walking off the
   1950 	 * end of the packet.
   1951 	 * Rather than pass it all the way down, we set this global.
   1952 	 */
   1953 	snapend = sp + h->caplen;
   1954 
   1955         if(print_info->ndo_type) {
   1956                 hdrlen = (*print_info->p.ndo_printer)(print_info->ndo, h, sp);
   1957         } else {
   1958                 hdrlen = (*print_info->p.printer)(h, sp);
   1959         }
   1960 
   1961 	if (Xflag) {
   1962 		/*
   1963 		 * Print the raw packet data in hex and ASCII.
   1964 		 */
   1965 		if (Xflag > 1) {
   1966 			/*
   1967 			 * Include the link-layer header.
   1968 			 */
   1969 			hex_and_ascii_print("\n\t", sp, h->caplen);
   1970 		} else {
   1971 			/*
   1972 			 * Don't include the link-layer header - and if
   1973 			 * we have nothing past the link-layer header,
   1974 			 * print nothing.
   1975 			 */
   1976 			if (h->caplen > hdrlen)
   1977 				hex_and_ascii_print("\n\t", sp + hdrlen,
   1978 				    h->caplen - hdrlen);
   1979 		}
   1980 	} else if (xflag) {
   1981 		/*
   1982 		 * Print the raw packet data in hex.
   1983 		 */
   1984 		if (xflag > 1) {
   1985 			/*
   1986 			 * Include the link-layer header.
   1987 			 */
   1988 			hex_print("\n\t", sp, h->caplen);
   1989 		} else {
   1990 			/*
   1991 			 * Don't include the link-layer header - and if
   1992 			 * we have nothing past the link-layer header,
   1993 			 * print nothing.
   1994 			 */
   1995 			if (h->caplen > hdrlen)
   1996 				hex_print("\n\t", sp + hdrlen,
   1997 				    h->caplen - hdrlen);
   1998 		}
   1999 	} else if (Aflag) {
   2000 		/*
   2001 		 * Print the raw packet data in ASCII.
   2002 		 */
   2003 		if (Aflag > 1) {
   2004 			/*
   2005 			 * Include the link-layer header.
   2006 			 */
   2007 			ascii_print(sp, h->caplen);
   2008 		} else {
   2009 			/*
   2010 			 * Don't include the link-layer header - and if
   2011 			 * we have nothing past the link-layer header,
   2012 			 * print nothing.
   2013 			 */
   2014 			if (h->caplen > hdrlen)
   2015 				ascii_print(sp + hdrlen, h->caplen - hdrlen);
   2016 		}
   2017 	}
   2018 
   2019 	putchar('\n');
   2020 
   2021 	--infodelay;
   2022 	if (infoprint)
   2023 		info(0);
   2024 }
   2025 
   2026 #ifdef WIN32
   2027 	/*
   2028 	 * XXX - there should really be libpcap calls to get the version
   2029 	 * number as a string (the string would be generated from #defines
   2030 	 * at run time, so that it's not generated from string constants
   2031 	 * in the library, as, on many UNIX systems, those constants would
   2032 	 * be statically linked into the application executable image, and
   2033 	 * would thus reflect the version of libpcap on the system on
   2034 	 * which the application was *linked*, not the system on which it's
   2035 	 * *running*.
   2036 	 *
   2037 	 * That routine should be documented, unlike the "version[]"
   2038 	 * string, so that UNIX vendors providing their own libpcaps
   2039 	 * don't omit it (as a couple of vendors have...).
   2040 	 *
   2041 	 * Packet.dll should perhaps also export a routine to return the
   2042 	 * version number of the Packet.dll code, to supply the
   2043 	 * "Wpcap_version" information on Windows.
   2044 	 */
   2045 	char WDversion[]="current-cvs.tcpdump.org";
   2046 #if !defined(HAVE_GENERATED_VERSION)
   2047 	char version[]="current-cvs.tcpdump.org";
   2048 #endif
   2049 	char pcap_version[]="current-cvs.tcpdump.org";
   2050 	char Wpcap_version[]="3.1";
   2051 #endif
   2052 
   2053 /*
   2054  * By default, print the specified data out in hex and ASCII.
   2055  */
   2056 static void
   2057 ndo_default_print(netdissect_options *ndo _U_, const u_char *bp, u_int length)
   2058 {
   2059 	hex_and_ascii_print("\n\t", bp, length); /* pass on lf and identation string */
   2060 }
   2061 
   2062 void
   2063 default_print(const u_char *bp, u_int length)
   2064 {
   2065 	ndo_default_print(gndo, bp, length);
   2066 }
   2067 
   2068 #ifdef SIGNAL_REQ_INFO
   2069 RETSIGTYPE requestinfo(int signo _U_)
   2070 {
   2071 	if (infodelay)
   2072 		++infoprint;
   2073 	else
   2074 		info(0);
   2075 }
   2076 #endif
   2077 
   2078 /*
   2079  * Called once each second in verbose mode while dumping to file
   2080  */
   2081 #ifdef USE_WIN32_MM_TIMER
   2082 void CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
   2083 				  DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
   2084 {
   2085 	struct pcap_stat stat;
   2086 
   2087 	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
   2088 		fprintf(stderr, "Got %u\r", packets_captured);
   2089 }
   2090 #elif defined(HAVE_ALARM)
   2091 static void verbose_stats_dump(int sig _U_)
   2092 {
   2093 	struct pcap_stat stat;
   2094 
   2095 	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
   2096 		fprintf(stderr, "Got %u\r", packets_captured);
   2097 	alarm(1);
   2098 }
   2099 #endif
   2100 
   2101 static void
   2102 usage(void)
   2103 {
   2104 	extern char version[];
   2105 #ifndef HAVE_PCAP_LIB_VERSION
   2106 #if defined(WIN32) || defined(HAVE_PCAP_VERSION)
   2107 	extern char pcap_version[];
   2108 #else /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
   2109 	static char pcap_version[] = "unknown";
   2110 #endif /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
   2111 #endif /* HAVE_PCAP_LIB_VERSION */
   2112 
   2113 #ifdef HAVE_PCAP_LIB_VERSION
   2114 #ifdef WIN32
   2115 	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
   2116 #else /* WIN32 */
   2117 	(void)fprintf(stderr, "%s version %s\n", program_name, version);
   2118 #endif /* WIN32 */
   2119 	(void)fprintf(stderr, "%s\n",pcap_lib_version());
   2120 #else /* HAVE_PCAP_LIB_VERSION */
   2121 #ifdef WIN32
   2122 	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
   2123 	(void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
   2124 #else /* WIN32 */
   2125 	(void)fprintf(stderr, "%s version %s\n", program_name, version);
   2126 	(void)fprintf(stderr, "libpcap version %s\n", pcap_version);
   2127 #endif /* WIN32 */
   2128 #endif /* HAVE_PCAP_LIB_VERSION */
   2129 	(void)fprintf(stderr,
   2130 "Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
   2131 	(void)fprintf(stderr,
   2132 "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
   2133 	(void)fprintf(stderr,
   2134 "\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ]\n");
   2135 #ifdef HAVE_PCAP_SETDIRECTION
   2136 	(void)fprintf(stderr,
   2137 "\t\t[ -Q in|out|inout ]\n");
   2138 #endif
   2139 	(void)fprintf(stderr,
   2140 "\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]\n");
   2141 	(void)fprintf(stderr,
   2142 "\t\t[ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
   2143 	(void)fprintf(stderr,
   2144 "\t\t[ -Z user ] [ expression ]\n");
   2145 	exit(1);
   2146 }
   2147 
   2148 
   2149 
   2150 /* VARARGS */
   2151 static void
   2152 ndo_error(netdissect_options *ndo _U_, const char *fmt, ...)
   2153 {
   2154 	va_list ap;
   2155 
   2156 	(void)fprintf(stderr, "%s: ", program_name);
   2157 	va_start(ap, fmt);
   2158 	(void)vfprintf(stderr, fmt, ap);
   2159 	va_end(ap);
   2160 	if (*fmt) {
   2161 		fmt += strlen(fmt);
   2162 		if (fmt[-1] != '\n')
   2163 			(void)fputc('\n', stderr);
   2164 	}
   2165 	exit(1);
   2166 	/* NOTREACHED */
   2167 }
   2168 
   2169 /* VARARGS */
   2170 static void
   2171 ndo_warning(netdissect_options *ndo _U_, const char *fmt, ...)
   2172 {
   2173 	va_list ap;
   2174 
   2175 	(void)fprintf(stderr, "%s: WARNING: ", program_name);
   2176 	va_start(ap, fmt);
   2177 	(void)vfprintf(stderr, fmt, ap);
   2178 	va_end(ap);
   2179 	if (*fmt) {
   2180 		fmt += strlen(fmt);
   2181 		if (fmt[-1] != '\n')
   2182 			(void)fputc('\n', stderr);
   2183 	}
   2184 }
   2185