]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/tcpdump.c
MFV r285191: tcpdump 4.7.4.
[FreeBSD/FreeBSD.git] / contrib / tcpdump / tcpdump.c
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@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 #endif
33
34 /* $FreeBSD$ */
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 /*
49  * Mac OS X may ship pcap.h from libpcap 0.6 with a libpcap based on
50  * 0.8.  That means it has pcap_findalldevs() but the header doesn't
51  * define pcap_if_t, meaning that we can't actually *use* pcap_findalldevs().
52  */
53 #ifdef HAVE_PCAP_FINDALLDEVS
54 #ifndef HAVE_PCAP_IF_T
55 #undef HAVE_PCAP_FINDALLDEVS
56 #endif
57 #endif
58
59 #include <tcpdump-stdinc.h>
60
61 #ifdef WIN32
62 #include "w32_fzs.h"
63 extern int strcasecmp (const char *__s1, const char *__s2);
64 extern int SIZE_BUF;
65 #define off_t long
66 #define uint UINT
67 #endif /* WIN32 */
68
69 #ifdef USE_LIBSMI
70 #include <smi.h>
71 #endif
72
73 #ifdef HAVE_LIBCRYPTO
74 #include <openssl/crypto.h>
75 #endif
76
77 #ifdef HAVE_GETOPT_LONG
78 #include <getopt.h>
79 #else
80 #include "getopt_long.h"
81 #endif
82 /* Capsicum-specific code requires macros from <net/bpf.h>, which will fail
83  * to compile if <pcap.h> has already been included; including the headers
84  * in the opposite order works fine.
85  */
86 #ifdef __FreeBSD__
87 #include <sys/capsicum.h>
88 #include <sys/sysctl.h>
89 #endif /* __FreeBSD__ */
90 #ifdef HAVE_CAPSICUM
91 #include <libcapsicum.h>
92 #include <libcapsicum_dns.h>
93 #include <libcapsicum_service.h>
94 #include <sys/nv.h>
95 #include <sys/capability.h>
96 #include <sys/ioccom.h>
97 #include <net/bpf.h>
98 #include <fcntl.h>
99 #include <libgen.h>
100 #endif  /* HAVE_CAPSICUM */
101 #include <pcap.h>
102 #include <signal.h>
103 #include <stdio.h>
104 #include <stdlib.h>
105 #include <string.h>
106 #include <limits.h>
107 #ifndef WIN32
108 #include <sys/wait.h>
109 #include <sys/resource.h>
110 #include <pwd.h>
111 #include <grp.h>
112 #endif /* WIN32 */
113
114 /* capabilities convenience library */
115 /* If a code depends on HAVE_LIBCAP_NG, it depends also on HAVE_CAP_NG_H.
116  * If HAVE_CAP_NG_H is not defined, undefine HAVE_LIBCAP_NG.
117  * Thus, the later tests are done only on HAVE_LIBCAP_NG.
118  */
119 #ifdef HAVE_LIBCAP_NG
120 #ifdef HAVE_CAP_NG_H
121 #include <cap-ng.h>
122 #else
123 #undef HAVE_LIBCAP_NG
124 #endif /* HAVE_CAP_NG_H */
125 #endif /* HAVE_LIBCAP_NG */
126
127 #include "netdissect.h"
128 #include "interface.h"
129 #include "addrtoname.h"
130 #include "machdep.h"
131 #include "setsignal.h"
132 #include "gmt2local.h"
133 #include "pcap-missing.h"
134
135 #ifndef PATH_MAX
136 #define PATH_MAX 1024
137 #endif
138
139 #ifdef SIGINFO
140 #define SIGNAL_REQ_INFO SIGINFO
141 #elif SIGUSR1
142 #define SIGNAL_REQ_INFO SIGUSR1
143 #endif
144
145 netdissect_options Gndo;
146 netdissect_options *gndo = &Gndo;
147
148 static int Dflag;                       /* list available devices and exit */
149 static int dflag;                       /* print filter code */
150 static int Lflag;                       /* list available data link types and exit */
151 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
152 static int Jflag;                       /* list available time stamp types */
153 #endif
154 #ifdef HAVE_PCAP_SETDIRECTION
155 int Qflag = -1;                         /* restrict captured packet by send/receive direction */
156 #endif
157 static char *zflag = NULL;              /* compress each savefile using a specified command (like gzip or bzip2) */
158
159 static int infodelay;
160 static int infoprint;
161
162 char *program_name;
163
164 #ifdef HAVE_CAPSICUM
165 cap_channel_t *capdns;
166 #endif
167
168 int32_t thiszone;               /* seconds offset from gmt to local time */
169
170 /* Forwards */
171 static RETSIGTYPE cleanup(int);
172 static RETSIGTYPE child_cleanup(int);
173 static void print_version(void);
174 static void print_usage(void);
175 static void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn));
176
177 static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
178 static void ndo_default_print(netdissect_options *, const u_char *, u_int);
179 static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
180 static void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
181 static void droproot(const char *, const char *);
182 static void ndo_error(netdissect_options *ndo, const char *fmt, ...)
183      __attribute__((noreturn))
184 #ifdef __ATTRIBUTE___FORMAT_OK
185      __attribute__((format (printf, 2, 3)))
186 #endif /* __ATTRIBUTE___FORMAT_OK */
187     ;
188 static void ndo_warning(netdissect_options *ndo, const char *fmt, ...)
189 #ifdef __ATTRIBUTE___FORMAT_OK
190      __attribute__((format (printf, 2, 3)))
191 #endif /* __ATTRIBUTE___FORMAT_OK */
192     ;
193
194 #ifdef SIGNAL_REQ_INFO
195 RETSIGTYPE requestinfo(int);
196 #endif
197
198 #if defined(USE_WIN32_MM_TIMER)
199   #include <MMsystem.h>
200   static UINT timer_id;
201   static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
202 #elif defined(HAVE_ALARM)
203   static void verbose_stats_dump(int sig);
204 #endif
205
206 static void info(int);
207 static u_int packets_captured;
208
209 struct printer {
210         if_printer f;
211         int type;
212 };
213
214
215 struct ndo_printer {
216         if_ndo_printer f;
217         int type;
218 };
219
220
221 static const struct printer printers[] = {
222         { NULL,                 0 },
223 };
224
225 static const struct ndo_printer ndo_printers[] = {
226         { ether_if_print,       DLT_EN10MB },
227 #ifdef DLT_IPNET
228         { ipnet_if_print,       DLT_IPNET },
229 #endif
230 #ifdef DLT_IEEE802_15_4
231         { ieee802_15_4_if_print, DLT_IEEE802_15_4 },
232 #endif
233 #ifdef DLT_IEEE802_15_4_NOFCS
234         { ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
235 #endif
236 #ifdef DLT_PPI
237         { ppi_if_print,         DLT_PPI },
238 #endif
239 #ifdef DLT_NETANALYZER
240         { netanalyzer_if_print, DLT_NETANALYZER },
241 #endif
242 #ifdef DLT_NETANALYZER_TRANSPARENT
243         { netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
244 #endif
245 #if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
246         { nflog_if_print,       DLT_NFLOG},
247 #endif
248 #ifdef DLT_CIP
249         { cip_if_print,         DLT_CIP },
250 #endif
251 #ifdef DLT_ATM_CLIP
252         { cip_if_print,         DLT_ATM_CLIP },
253 #endif
254 #ifdef DLT_IP_OVER_FC
255         { ipfc_if_print,        DLT_IP_OVER_FC },
256 #endif
257         { null_if_print,        DLT_NULL },
258 #ifdef DLT_LOOP
259         { null_if_print,        DLT_LOOP },
260 #endif
261 #ifdef DLT_APPLE_IP_OVER_IEEE1394
262         { ap1394_if_print,      DLT_APPLE_IP_OVER_IEEE1394 },
263 #endif
264 #if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
265         { bt_if_print,          DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
266 #endif
267 #ifdef DLT_LANE8023
268         { lane_if_print,        DLT_LANE8023 },
269 #endif
270         { arcnet_if_print,      DLT_ARCNET },
271 #ifdef DLT_ARCNET_LINUX
272         { arcnet_linux_if_print, DLT_ARCNET_LINUX },
273 #endif
274         { raw_if_print,         DLT_RAW },
275 #ifdef DLT_IPV4
276         { raw_if_print,         DLT_IPV4 },
277 #endif
278 #ifdef DLT_IPV6
279         { raw_if_print,         DLT_IPV6 },
280 #endif
281 #ifdef HAVE_PCAP_USB_H
282 #ifdef DLT_USB_LINUX
283         { usb_linux_48_byte_print, DLT_USB_LINUX},
284 #endif /* DLT_USB_LINUX */
285 #ifdef DLT_USB_LINUX_MMAPPED
286         { usb_linux_64_byte_print, DLT_USB_LINUX_MMAPPED},
287 #endif /* DLT_USB_LINUX_MMAPPED */
288 #endif /* HAVE_PCAP_USB_H */
289 #ifdef DLT_SYMANTEC_FIREWALL
290         { symantec_if_print,    DLT_SYMANTEC_FIREWALL },
291 #endif
292 #ifdef DLT_C_HDLC
293         { chdlc_if_print,       DLT_C_HDLC },
294 #endif
295 #ifdef DLT_HDLC
296         { chdlc_if_print,       DLT_HDLC },
297 #endif
298 #ifdef DLT_PPP_ETHER
299         { pppoe_if_print,       DLT_PPP_ETHER },
300 #endif
301 #if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
302         { pflog_if_print,       DLT_PFLOG },
303 #endif
304         { token_if_print,       DLT_IEEE802 },
305         { fddi_if_print,        DLT_FDDI },
306 #ifdef DLT_LINUX_SLL
307         { sll_if_print,         DLT_LINUX_SLL },
308 #endif
309 #ifdef DLT_FR
310         { fr_if_print,          DLT_FR },
311 #endif
312 #ifdef DLT_FRELAY
313         { fr_if_print,          DLT_FRELAY },
314 #endif
315 #ifdef DLT_MFR
316         { mfr_if_print,         DLT_MFR },
317 #endif
318         { atm_if_print,         DLT_ATM_RFC1483 },
319 #ifdef DLT_SUNATM
320         { sunatm_if_print,      DLT_SUNATM },
321 #endif
322 #ifdef DLT_ENC
323         { enc_if_print,         DLT_ENC },
324 #endif
325         { sl_if_print,          DLT_SLIP },
326 #ifdef DLT_SLIP_BSDOS
327         { sl_bsdos_if_print,    DLT_SLIP_BSDOS },
328 #endif
329 #ifdef DLT_LTALK
330         { ltalk_if_print,       DLT_LTALK },
331 #endif
332 #ifdef DLT_JUNIPER_ATM1
333         { juniper_atm1_print,   DLT_JUNIPER_ATM1 },
334 #endif
335 #ifdef DLT_JUNIPER_ATM2
336         { juniper_atm2_print,   DLT_JUNIPER_ATM2 },
337 #endif
338 #ifdef DLT_JUNIPER_MFR
339         { juniper_mfr_print,    DLT_JUNIPER_MFR },
340 #endif
341 #ifdef DLT_JUNIPER_MLFR
342         { juniper_mlfr_print,   DLT_JUNIPER_MLFR },
343 #endif
344 #ifdef DLT_JUNIPER_MLPPP
345         { juniper_mlppp_print,  DLT_JUNIPER_MLPPP },
346 #endif
347 #ifdef DLT_JUNIPER_PPPOE
348         { juniper_pppoe_print,  DLT_JUNIPER_PPPOE },
349 #endif
350 #ifdef DLT_JUNIPER_PPPOE_ATM
351         { juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
352 #endif
353 #ifdef DLT_JUNIPER_GGSN
354         { juniper_ggsn_print,   DLT_JUNIPER_GGSN },
355 #endif
356 #ifdef DLT_JUNIPER_ES
357         { juniper_es_print,     DLT_JUNIPER_ES },
358 #endif
359 #ifdef DLT_JUNIPER_MONITOR
360         { juniper_monitor_print, DLT_JUNIPER_MONITOR },
361 #endif
362 #ifdef DLT_JUNIPER_SERVICES
363         { juniper_services_print, DLT_JUNIPER_SERVICES },
364 #endif
365 #ifdef DLT_JUNIPER_ETHER
366         { juniper_ether_print,  DLT_JUNIPER_ETHER },
367 #endif
368 #ifdef DLT_JUNIPER_PPP
369         { juniper_ppp_print,    DLT_JUNIPER_PPP },
370 #endif
371 #ifdef DLT_JUNIPER_FRELAY
372         { juniper_frelay_print, DLT_JUNIPER_FRELAY },
373 #endif
374 #ifdef DLT_JUNIPER_CHDLC
375         { juniper_chdlc_print,  DLT_JUNIPER_CHDLC },
376 #endif
377 #ifdef DLT_PKTAP
378         { pktap_if_print,       DLT_PKTAP },
379 #endif
380 #ifdef DLT_IEEE802_11_RADIO
381         { ieee802_11_radio_if_print,    DLT_IEEE802_11_RADIO },
382 #endif
383 #ifdef DLT_IEEE802_11
384         { ieee802_11_if_print,  DLT_IEEE802_11},
385 #endif
386 #ifdef DLT_IEEE802_11_RADIO_AVS
387         { ieee802_11_radio_avs_if_print,        DLT_IEEE802_11_RADIO_AVS },
388 #endif
389 #ifdef DLT_PRISM_HEADER
390         { prism_if_print,       DLT_PRISM_HEADER },
391 #endif
392         { ppp_if_print,         DLT_PPP },
393 #ifdef DLT_PPP_WITHDIRECTION
394         { ppp_if_print,         DLT_PPP_WITHDIRECTION },
395 #endif
396 #ifdef DLT_PPP_BSDOS
397         { ppp_bsdos_if_print,   DLT_PPP_BSDOS },
398 #endif
399 #ifdef DLT_PPP_SERIAL
400         { ppp_hdlc_if_print,    DLT_PPP_SERIAL },
401 #endif
402         { NULL,                 0 },
403 };
404
405 static const struct tok status_flags[] = {
406 #ifdef PCAP_IF_UP
407         { PCAP_IF_UP,       "Up"       },
408 #endif
409 #ifdef PCAP_IF_RUNNING
410         { PCAP_IF_RUNNING,  "Running"  },
411 #endif
412         { PCAP_IF_LOOPBACK, "Loopback" },
413         { 0, NULL }
414 };
415
416 if_printer
417 lookup_printer(int type)
418 {
419         const struct printer *p;
420
421         for (p = printers; p->f; ++p)
422                 if (type == p->type)
423                         return p->f;
424
425         return NULL;
426         /* NOTREACHED */
427 }
428
429 if_ndo_printer
430 lookup_ndo_printer(int type)
431 {
432         const struct ndo_printer *p;
433
434         for (p = ndo_printers; p->f; ++p)
435                 if (type == p->type)
436                         return p->f;
437
438 #if defined(DLT_USER2) && defined(DLT_PKTAP)
439         /*
440          * Apple incorrectly chose to use DLT_USER2 for their PKTAP
441          * header.
442          *
443          * We map DLT_PKTAP, whether it's DLT_USER2 as it is on Darwin-
444          * based OSes or the same value as LINKTYPE_PKTAP as it is on
445          * other OSes, to LINKTYPE_PKTAP, so files written with
446          * this version of libpcap for a DLT_PKTAP capture have a link-
447          * layer header type of LINKTYPE_PKTAP.
448          *
449          * However, files written on OS X Mavericks for a DLT_PKTAP
450          * capture have a link-layer header type of LINKTYPE_USER2.
451          * If we don't have a printer for DLT_USER2, and type is
452          * DLT_USER2, we look up the printer for DLT_PKTAP and use
453          * that.
454          */
455         if (type == DLT_USER2) {
456                 for (p = ndo_printers; p->f; ++p)
457                         if (DLT_PKTAP == p->type)
458                                 return p->f;
459         }
460 #endif
461
462         return NULL;
463         /* NOTREACHED */
464 }
465
466 static pcap_t *pd;
467
468 static int supports_monitor_mode;
469
470 extern int optind;
471 extern int opterr;
472 extern char *optarg;
473
474 struct print_info {
475         netdissect_options *ndo;
476         union {
477                 if_printer     printer;
478                 if_ndo_printer ndo_printer;
479         } p;
480         int ndo_type;
481 };
482
483 struct dump_info {
484         char    *WFileName;
485         char    *CurrentFileName;
486         pcap_t  *pd;
487         pcap_dumper_t *p;
488 #ifdef HAVE_CAPSICUM
489         int     dirfd;
490 #endif
491 };
492
493 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
494 static void
495 show_tstamp_types_and_exit(const char *device, pcap_t *pd)
496 {
497         int n_tstamp_types;
498         int *tstamp_types = 0;
499         const char *tstamp_type_name;
500         int i;
501
502         n_tstamp_types = pcap_list_tstamp_types(pd, &tstamp_types);
503         if (n_tstamp_types < 0)
504                 error("%s", pcap_geterr(pd));
505
506         if (n_tstamp_types == 0) {
507                 fprintf(stderr, "Time stamp type cannot be set for %s\n",
508                     device);
509                 exit(0);
510         }
511         fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
512             device);
513         for (i = 0; i < n_tstamp_types; i++) {
514                 tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
515                 if (tstamp_type_name != NULL) {
516                         (void) fprintf(stderr, "  %s (%s)\n", tstamp_type_name,
517                             pcap_tstamp_type_val_to_description(tstamp_types[i]));
518                 } else {
519                         (void) fprintf(stderr, "  %d\n", tstamp_types[i]);
520                 }
521         }
522         pcap_free_tstamp_types(tstamp_types);
523         exit(0);
524 }
525 #endif
526
527 static void
528 show_dlts_and_exit(const char *device, pcap_t *pd)
529 {
530         int n_dlts;
531         int *dlts = 0;
532         const char *dlt_name;
533
534         n_dlts = pcap_list_datalinks(pd, &dlts);
535         if (n_dlts < 0)
536                 error("%s", pcap_geterr(pd));
537         else if (n_dlts == 0 || !dlts)
538                 error("No data link types.");
539
540         /*
541          * If the interface is known to support monitor mode, indicate
542          * whether these are the data link types available when not in
543          * monitor mode, if -I wasn't specified, or when in monitor mode,
544          * when -I was specified (the link-layer types available in
545          * monitor mode might be different from the ones available when
546          * not in monitor mode).
547          */
548         if (supports_monitor_mode)
549                 (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
550                     device,
551                     Iflag ? "when in monitor mode" : "when not in monitor mode");
552         else
553                 (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
554                     device);
555
556         while (--n_dlts >= 0) {
557                 dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
558                 if (dlt_name != NULL) {
559                         (void) fprintf(stderr, "  %s (%s)", dlt_name,
560                             pcap_datalink_val_to_description(dlts[n_dlts]));
561
562                         /*
563                          * OK, does tcpdump handle that type?
564                          */
565                         if (lookup_printer(dlts[n_dlts]) == NULL
566                             && lookup_ndo_printer(dlts[n_dlts]) == NULL)
567                                 (void) fprintf(stderr, " (printing not supported)");
568                         fprintf(stderr, "\n");
569                 } else {
570                         (void) fprintf(stderr, "  DLT %d (printing not supported)\n",
571                             dlts[n_dlts]);
572                 }
573         }
574 #ifdef HAVE_PCAP_FREE_DATALINKS
575         pcap_free_datalinks(dlts);
576 #endif
577         exit(0);
578 }
579
580 #ifdef HAVE_PCAP_FINDALLDEVS
581 static void
582 show_devices_and_exit (void)
583 {
584         pcap_if_t *devpointer;
585         char ebuf[PCAP_ERRBUF_SIZE];
586         int i;
587
588         if (pcap_findalldevs(&devpointer, ebuf) < 0)
589                 error("%s", ebuf);
590         else {
591                 for (i = 0; devpointer != NULL; i++) {
592                         printf("%d.%s", i+1, devpointer->name);
593                         if (devpointer->description != NULL)
594                                 printf(" (%s)", devpointer->description);
595                         if (devpointer->flags != 0)
596                                 printf(" [%s]", bittok2str(status_flags, "none", devpointer->flags));
597                         printf("\n");
598                         devpointer = devpointer->next;
599                 }
600         }
601         exit(0);
602 }
603 #endif /* HAVE_PCAP_FINDALLDEVS */
604
605 /*
606  * Short options.
607  *
608  * Note that there we use all letters for short options except for g, k,
609  * o, and P, and those are used by other versions of tcpdump, and we should
610  * only use them for the same purposes that the other versions of tcpdump
611  * use them:
612  *
613  * OS X tcpdump uses -g to force non--v output for IP to be on one
614  * line, making it more "g"repable;
615  *
616  * OS X tcpdump uses -k tospecify that packet comments in pcap-ng files
617  * should be printed;
618  *
619  * OpenBSD tcpdump uses -o to indicate that OS fingerprinting should be done
620  * for hosts sending TCP SYN packets;
621  *
622  * OS X tcpdump uses -P to indicate that -w should write pcap-ng rather
623  * than pcap files.
624  *
625  * OS X tcpdump also uses -Q to specify expressions that match packet
626  * metadata, including but not limited to the packet direction.
627  * The expression syntax is different from a simple "in|out|inout",
628  * and those expressions aren't accepted by OS X tcpdump, but the
629  * equivalents would be "in" = "dir=in", "out" = "dir=out", and
630  * "inout" = "dir=in or dir=out", and the parser could conceivably
631  * special-case "in", "out", and "inout" as expressions for backwards
632  * compatibility, so all is not (yet) lost.
633  */
634
635 /*
636  * Set up flags that might or might not be supported depending on the
637  * version of libpcap we're using.
638  */
639 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
640 #define B_FLAG          "B:"
641 #define B_FLAG_USAGE    " [ -B size ]"
642 #else /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
643 #define B_FLAG
644 #define B_FLAG_USAGE
645 #endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
646
647 #ifdef HAVE_PCAP_CREATE
648 #define I_FLAG          "I"
649 #else /* HAVE_PCAP_CREATE */
650 #define I_FLAG
651 #endif /* HAVE_PCAP_CREATE */
652
653 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
654 #define j_FLAG          "j:"
655 #define j_FLAG_USAGE    " [ -j tstamptype ]"
656 #define J_FLAG          "J"
657 #else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
658 #define j_FLAG
659 #define j_FLAG_USAGE
660 #define J_FLAG
661 #endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
662
663 #ifdef HAVE_PCAP_FINDALLDEVS
664 #define D_FLAG  "D"
665 #else
666 #define D_FLAG
667 #endif
668
669 #ifdef HAVE_PCAP_DUMP_FLUSH
670 #define U_FLAG  "U"
671 #else
672 #define U_FLAG
673 #endif
674
675 #ifdef HAVE_PCAP_SETDIRECTION
676 #define Q_FLAG "Q:"
677 #else
678 #define Q_FLAG
679 #endif
680
681 #define SHORTOPTS "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:#"
682
683 /*
684  * Long options.
685  *
686  * We do not currently have long options corresponding to all short
687  * options; we should probably pick appropriate option names for them.
688  *
689  * However, the short options where the number of times the option is
690  * specified matters, such as -v and -d and -t, should probably not
691  * just map to a long option, as saying
692  *
693  *  tcpdump --verbose --verbose
694  *
695  * doesn't make sense; it should be --verbosity={N} or something such
696  * as that.
697  *
698  * For long options with no corresponding short options, we define values
699  * outside the range of ASCII graphic characters, make that the last
700  * component of the entry for the long option, and have a case for that
701  * option in the switch statement.
702  */
703 #define OPTION_VERSION          128
704 #define OPTION_TSTAMP_PRECISION 129
705 #define OPTION_IMMEDIATE_MODE   130
706
707 static const struct option longopts[] = {
708 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
709         { "buffer-size", required_argument, NULL, 'B' },
710 #endif
711         { "list-interfaces", no_argument, NULL, 'D' },
712         { "help", no_argument, NULL, 'h' },
713         { "interface", required_argument, NULL, 'i' },
714 #ifdef HAVE_PCAP_CREATE
715         { "monitor-mode", no_argument, NULL, 'I' },
716 #endif
717 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
718         { "time-stamp-type", required_argument, NULL, 'j' },
719         { "list-time-stamp-types", no_argument, NULL, 'J' },
720 #endif
721 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
722         { "time-stamp-precision", required_argument, NULL, OPTION_TSTAMP_PRECISION},
723 #endif
724         { "dont-verify-checksums", no_argument, NULL, 'K' },
725         { "list-data-link-types", no_argument, NULL, 'L' },
726         { "no-optimize", no_argument, NULL, 'O' },
727         { "no-promiscuous-mode", no_argument, NULL, 'p' },
728 #ifdef HAVE_PCAP_SETDIRECTION
729         { "direction", required_argument, NULL, 'Q' },
730 #endif
731         { "snapshot-length", required_argument, NULL, 's' },
732         { "absolute-tcp-sequence-numbers", no_argument, NULL, 'S' },
733 #ifdef HAVE_PCAP_DUMP_FLUSH
734         { "packet-buffered", no_argument, NULL, 'U' },
735 #endif
736         { "linktype", required_argument, NULL, 'y' },
737 #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
738         { "immediate-mode", no_argument, NULL, OPTION_IMMEDIATE_MODE },
739 #endif
740 #if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
741         { "debug-filter-parser", no_argument, NULL, 'Y' },
742 #endif
743         { "relinquish-privileges", required_argument, NULL, 'Z' },
744         { "number", no_argument, NULL, '#' },
745         { "version", no_argument, NULL, OPTION_VERSION },
746         { NULL, 0, NULL, 0 }
747 };
748
749 #ifndef WIN32
750 /* Drop root privileges and chroot if necessary */
751 static void
752 droproot(const char *username, const char *chroot_dir)
753 {
754         struct passwd *pw = NULL;
755
756         if (chroot_dir && !username) {
757                 fprintf(stderr, "tcpdump: Chroot without dropping root is insecure\n");
758                 exit(1);
759         }
760
761         pw = getpwnam(username);
762         if (pw) {
763                 if (chroot_dir) {
764                         if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
765                                 fprintf(stderr, "tcpdump: Couldn't chroot/chdir to '%.64s': %s\n",
766                                     chroot_dir, pcap_strerror(errno));
767                                 exit(1);
768                         }
769                 }
770 #ifdef HAVE_LIBCAP_NG
771                 int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG);
772                 if (ret < 0) {
773                         fprintf(stderr, "error : ret %d\n", ret);
774                 }
775                 else {
776                         fprintf(stderr, "dropped privs to %s\n", username);
777                 }
778 #else
779                 if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
780                     setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
781                         fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
782                             username,
783                             (unsigned long)pw->pw_uid,
784                             (unsigned long)pw->pw_gid,
785                             pcap_strerror(errno));
786                         exit(1);
787                 }
788                 else {
789                         fprintf(stderr, "dropped privs to %s\n", username);
790                 }
791 #endif /* HAVE_LIBCAP_NG */
792         }
793         else {
794                 fprintf(stderr, "tcpdump: Couldn't find user '%.32s'\n",
795                     username);
796                 exit(1);
797         }
798 #ifdef HAVE_LIBCAP_NG
799         /* We don't need CAP_SETUID and CAP_SETGID any more. */
800         capng_updatev(
801                 CAPNG_DROP,
802                 CAPNG_EFFECTIVE | CAPNG_PERMITTED,
803                 CAP_SETUID,
804                 CAP_SETGID,
805                 -1);
806         capng_apply(CAPNG_SELECT_BOTH);
807 #endif /* HAVE_LIBCAP_NG */
808
809 }
810 #endif /* WIN32 */
811
812 static int
813 getWflagChars(int x)
814 {
815         int c = 0;
816
817         x -= 1;
818         while (x > 0) {
819                 c += 1;
820                 x /= 10;
821         }
822
823         return c;
824 }
825
826
827 static void
828 MakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
829 {
830         char *filename = malloc(PATH_MAX + 1);
831         if (filename == NULL)
832             error("Makefilename: malloc");
833
834         /* Process with strftime if Gflag is set. */
835         if (Gflag != 0) {
836           struct tm *local_tm;
837
838           /* Convert Gflag_time to a usable format */
839           if ((local_tm = localtime(&Gflag_time)) == NULL) {
840                   error("MakeTimedFilename: localtime");
841           }
842
843           /* There's no good way to detect an error in strftime since a return
844            * value of 0 isn't necessarily failure.
845            */
846           strftime(filename, PATH_MAX, orig_name, local_tm);
847         } else {
848           strncpy(filename, orig_name, PATH_MAX);
849         }
850
851         if (cnt == 0 && max_chars == 0)
852                 strncpy(buffer, filename, PATH_MAX + 1);
853         else
854                 if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
855                   /* Report an error if the filename is too large */
856                   error("too many output files or filename is too long (> %d)", PATH_MAX);
857         free(filename);
858 }
859
860 static int tcpdump_printf(netdissect_options *ndo _U_,
861                           const char *fmt, ...)
862 {
863
864   va_list args;
865   int ret;
866
867   va_start(args, fmt);
868   ret=vfprintf(stdout, fmt, args);
869   va_end(args);
870
871   return ret;
872 }
873
874 static struct print_info
875 get_print_info(int type)
876 {
877         struct print_info printinfo;
878
879         printinfo.ndo_type = 1;
880         printinfo.ndo = gndo;
881         printinfo.p.ndo_printer = lookup_ndo_printer(type);
882         if (printinfo.p.ndo_printer == NULL) {
883                 printinfo.p.printer = lookup_printer(type);
884                 printinfo.ndo_type = 0;
885                 if (printinfo.p.printer == NULL) {
886                         gndo->ndo_dltname = pcap_datalink_val_to_name(type);
887                         if (gndo->ndo_dltname != NULL)
888                                 error("packet printing is not supported for link type %s: use -w",
889                                       gndo->ndo_dltname);
890                         else
891                                 error("packet printing is not supported for link type %d: use -w", type);
892                 }
893         }
894         return (printinfo);
895 }
896
897 static char *
898 get_next_file(FILE *VFile, char *ptr)
899 {
900         char *ret;
901
902         ret = fgets(ptr, PATH_MAX, VFile);
903         if (!ret)
904                 return NULL;
905
906         if (ptr[strlen(ptr) - 1] == '\n')
907                 ptr[strlen(ptr) - 1] = '\0';
908
909         return ret;
910 }
911
912 #ifdef HAVE_CAPSICUM
913 static cap_channel_t *
914 capdns_setup(void)
915 {
916         cap_channel_t *capcas, *capdnsloc;
917         const char *types[1];
918         int families[2];
919
920         capcas = cap_init();
921         if (capcas == NULL) {
922                 warning("unable to contact casperd");
923                 return (NULL);
924         }
925         capdnsloc = cap_service_open(capcas, "system.dns");
926         /* Casper capability no longer needed. */
927         cap_close(capcas);
928         if (capdnsloc == NULL)
929                 error("unable to open system.dns service");
930         /* Limit system.dns to reverse DNS lookups. */
931         types[0] = "ADDR";
932         if (cap_dns_type_limit(capdnsloc, types, 1) < 0)
933                 error("unable to limit access to system.dns service");
934         families[0] = AF_INET;
935         families[1] = AF_INET6;
936         if (cap_dns_family_limit(capdnsloc, families, 2) < 0)
937                 error("unable to limit access to system.dns service");
938
939         return (capdnsloc);
940 }
941 #endif  /* HAVE_CAPSICUM */
942
943 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
944 static int
945 tstamp_precision_from_string(const char *precision)
946 {
947         if (strncmp(precision, "nano", strlen("nano")) == 0)
948                 return PCAP_TSTAMP_PRECISION_NANO;
949
950         if (strncmp(precision, "micro", strlen("micro")) == 0)
951                 return PCAP_TSTAMP_PRECISION_MICRO;
952
953         return -EINVAL;
954 }
955
956 static const char *
957 tstamp_precision_to_string(int precision)
958 {
959         switch (precision) {
960
961         case PCAP_TSTAMP_PRECISION_MICRO:
962                 return "micro";
963
964         case PCAP_TSTAMP_PRECISION_NANO:
965                 return "nano";
966
967         default:
968                 return "unknown";
969         }
970 }
971 #endif
972
973 #ifdef HAVE_CAPSICUM
974 /*
975  * Ensure that, on a dump file's descriptor, we have all the rights
976  * necessary to make the standard I/O library work with an fdopen()ed
977  * FILE * from that descriptor.
978  *
979  * A long time ago, in a galaxy far far away, AT&T decided that, instead
980  * of providing separate APIs for getting and setting the FD_ flags on a
981  * descriptor, getting and setting the O_ flags on a descriptor, and
982  * locking files, they'd throw them all into a kitchen-sink fcntl() call
983  * along the lines of ioctl(), the fact that ioctl() operations are
984  * largely specific to particular character devices but fcntl() operations
985  * are either generic to all descriptors or generic to all descriptors for
986  * regular files nonwithstanding.
987  *
988  * The Capsicum people decided that fine-grained control of descriptor
989  * operations was required, so that you need to grant permission for
990  * reading, writing, seeking, and fcntl-ing.  The latter, courtesy of
991  * AT&T's decision, means that "fcntl-ing" isn't a thing, but a motley
992  * collection of things, so there are *individual* fcntls for which
993  * permission needs to be granted.
994  *
995  * The FreeBSD standard I/O people implemented some optimizations that
996  * requires that the standard I/O routines be able to determine whether
997  * the descriptor for the FILE * is open append-only or not; as that
998  * descriptor could have come from an open() rather than an fopen(),
999  * that requires that it be able to do an F_GETFL fcntl() to read
1000  * the O_ flags.
1001  *
1002  * Tcpdump uses ftell() to determine how much data has been written
1003  * to a file in order to, when used with -C, determine when it's time
1004  * to rotate capture files.  ftell() therefore needs to do an lseek()
1005  * to find out the file offset and must, thanks to the aforementioned
1006  * optimization, also know whether the descriptor is open append-only
1007  * or not.
1008  *
1009  * The net result of all the above is that we need to grant CAP_SEEK,
1010  * CAP_WRITE, and CAP_FCNTL with the CAP_FCNTL_GETFL subcapability.
1011  *
1012  * Perhaps this is the universe's way of saying that either
1013  *
1014  *      1) there needs to be an fopenat() call and a pcap_dump_openat() call
1015  *         using it, so that Capsicum-capable tcpdump wouldn't need to do
1016  *         an fdopen()
1017  *
1018  * or
1019  *
1020  *      2) there needs to be a cap_fdopen() call in the FreeBSD standard
1021  *         I/O library that knows what rights are needed by the standard
1022  *         I/O library, based on the open mode, and assigns them, perhaps
1023  *         with an additional argument indicating, for example, whether
1024  *         seeking should be allowed, so that tcpdump doesn't need to know
1025  *         what the standard I/O library happens to require this week.
1026  */
1027 static void
1028 set_dumper_capsicum_rights(pcap_dumper_t *p)
1029 {
1030         int fd = fileno(pcap_dump_file(p));
1031         cap_rights_t rights;
1032
1033         cap_rights_init(&rights, CAP_SEEK, CAP_WRITE, CAP_FCNTL);
1034         if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS) {
1035                 error("unable to limit dump descriptor");
1036         }
1037         if (cap_fcntls_limit(fd, CAP_FCNTL_GETFL) < 0 && errno != ENOSYS) {
1038                 error("unable to limit dump descriptor fcntls");
1039         }
1040 }
1041 #endif
1042
1043 int
1044 main(int argc, char **argv)
1045 {
1046         register int cnt, op, i;
1047         bpf_u_int32 localnet =0 , netmask = 0;
1048         register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
1049         pcap_handler callback;
1050         int type;
1051         int dlt;
1052         int new_dlt;
1053         const char *dlt_name;
1054         struct bpf_program fcode;
1055 #ifndef WIN32
1056         RETSIGTYPE (*oldhandler)(int);
1057 #endif
1058         struct print_info printinfo;
1059         struct dump_info dumpinfo;
1060         u_char *pcap_userdata;
1061         char ebuf[PCAP_ERRBUF_SIZE];
1062         char VFileLine[PATH_MAX + 1];
1063         char *username = NULL;
1064         char *chroot_dir = NULL;
1065         char *ret = NULL;
1066         char *end;
1067 #ifdef HAVE_PCAP_FINDALLDEVS
1068         pcap_if_t *devpointer;
1069         int devnum;
1070 #endif
1071         int status;
1072         FILE *VFile;
1073 #ifdef HAVE_CAPSICUM
1074         cap_rights_t rights;
1075 #endif  /* HAVE_CAPSICUM */
1076         int cansandbox;
1077
1078 #ifdef WIN32
1079         if(wsockinit() != 0) return 1;
1080 #endif /* WIN32 */
1081
1082         jflag=-1;       /* not set */
1083         gndo->ndo_Oflag=1;
1084         gndo->ndo_Rflag=1;
1085         gndo->ndo_dlt=-1;
1086         gndo->ndo_default_print=ndo_default_print;
1087         gndo->ndo_printf=tcpdump_printf;
1088         gndo->ndo_error=ndo_error;
1089         gndo->ndo_warning=ndo_warning;
1090         gndo->ndo_snaplen = DEFAULT_SNAPLEN;
1091         gndo->ndo_immediate = 0;
1092
1093         cnt = -1;
1094         device = NULL;
1095         infile = NULL;
1096         RFileName = NULL;
1097         VFileName = NULL;
1098         VFile = NULL;
1099         WFileName = NULL;
1100         dlt = -1;
1101         if ((cp = strrchr(argv[0], '/')) != NULL)
1102                 program_name = cp + 1;
1103         else
1104                 program_name = argv[0];
1105
1106         /*
1107          * On platforms where the CPU doesn't support unaligned loads,
1108          * force unaligned accesses to abort with SIGBUS, rather than
1109          * being fixed up (slowly) by the OS kernel; on those platforms,
1110          * misaligned accesses are bugs, and we want tcpdump to crash so
1111          * that the bugs are reported.
1112          */
1113         if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
1114                 error("%s", ebuf);
1115
1116 #ifdef USE_LIBSMI
1117         smiInit("tcpdump");
1118 #endif
1119
1120         while (
1121             (op = getopt_long(argc, argv, SHORTOPTS, longopts, NULL)) != -1)
1122                 switch (op) {
1123
1124                 case 'a':
1125                         /* compatibility for old -a */
1126                         break;
1127
1128                 case 'A':
1129                         ++Aflag;
1130                         break;
1131
1132                 case 'b':
1133                         ++bflag;
1134                         break;
1135
1136 #if defined(HAVE_PCAP_CREATE) || defined(WIN32)
1137                 case 'B':
1138                         Bflag = atoi(optarg)*1024;
1139                         if (Bflag <= 0)
1140                                 error("invalid packet buffer size %s", optarg);
1141                         break;
1142 #endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
1143
1144                 case 'c':
1145                         cnt = atoi(optarg);
1146                         if (cnt <= 0)
1147                                 error("invalid packet count %s", optarg);
1148                         break;
1149
1150                 case 'C':
1151                         Cflag = atoi(optarg) * 1000000;
1152                         if (Cflag < 0)
1153                                 error("invalid file size %s", optarg);
1154                         break;
1155
1156                 case 'd':
1157                         ++dflag;
1158                         break;
1159
1160                 case 'D':
1161                         Dflag++;
1162                         break;
1163
1164                 case 'L':
1165                         Lflag++;
1166                         break;
1167
1168                 case 'e':
1169                         ++eflag;
1170                         break;
1171
1172                 case 'E':
1173 #ifndef HAVE_LIBCRYPTO
1174                         warning("crypto code not compiled in");
1175 #endif
1176                         gndo->ndo_espsecret = optarg;
1177                         break;
1178
1179                 case 'f':
1180                         ++fflag;
1181                         break;
1182
1183                 case 'F':
1184                         infile = optarg;
1185                         break;
1186
1187                 case 'G':
1188                         Gflag = atoi(optarg);
1189                         if (Gflag < 0)
1190                                 error("invalid number of seconds %s", optarg);
1191
1192                         /* We will create one file initially. */
1193                         Gflag_count = 0;
1194
1195                         /* Grab the current time for rotation use. */
1196                         if ((Gflag_time = time(NULL)) == (time_t)-1) {
1197                                 error("main: can't get current time: %s",
1198                                     pcap_strerror(errno));
1199                         }
1200                         break;
1201
1202                 case 'h':
1203                         print_usage();
1204                         exit(0);
1205                         break;
1206
1207                 case 'H':
1208                         ++Hflag;
1209                         break;
1210
1211                 case 'i':
1212                         if (optarg[0] == '0' && optarg[1] == 0)
1213                                 error("Invalid adapter index");
1214
1215 #ifdef HAVE_PCAP_FINDALLDEVS
1216                         /*
1217                          * If the argument is a number, treat it as
1218                          * an index into the list of adapters, as
1219                          * printed by "tcpdump -D".
1220                          *
1221                          * This should be OK on UNIX systems, as interfaces
1222                          * shouldn't have names that begin with digits.
1223                          * It can be useful on Windows, where more than
1224                          * one interface can have the same name.
1225                          */
1226                         devnum = strtol(optarg, &end, 10);
1227                         if (optarg != end && *end == '\0') {
1228                                 if (devnum < 0)
1229                                         error("Invalid adapter index");
1230
1231                                 if (pcap_findalldevs(&devpointer, ebuf) < 0)
1232                                         error("%s", ebuf);
1233                                 else {
1234                                         /*
1235                                          * Look for the devnum-th entry
1236                                          * in the list of devices
1237                                          * (1-based).
1238                                          */
1239                                         for (i = 0;
1240                                             i < devnum-1 && devpointer != NULL;
1241                                             i++, devpointer = devpointer->next)
1242                                                 ;
1243                                         if (devpointer == NULL)
1244                                                 error("Invalid adapter index");
1245                                 }
1246                                 device = devpointer->name;
1247                                 break;
1248                         }
1249 #endif /* HAVE_PCAP_FINDALLDEVS */
1250                         device = optarg;
1251                         break;
1252
1253 #ifdef HAVE_PCAP_CREATE
1254                 case 'I':
1255                         ++Iflag;
1256                         break;
1257 #endif /* HAVE_PCAP_CREATE */
1258
1259 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
1260                 case 'j':
1261                         jflag = pcap_tstamp_type_name_to_val(optarg);
1262                         if (jflag < 0)
1263                                 error("invalid time stamp type %s", optarg);
1264                         break;
1265
1266                 case 'J':
1267                         Jflag++;
1268                         break;
1269 #endif
1270
1271                 case 'l':
1272 #ifdef WIN32
1273                         /*
1274                          * _IOLBF is the same as _IOFBF in Microsoft's C
1275                          * libraries; the only alternative they offer
1276                          * is _IONBF.
1277                          *
1278                          * XXX - this should really be checking for MSVC++,
1279                          * not WIN32, if, for example, MinGW has its own
1280                          * C library that is more UNIX-compatible.
1281                          */
1282                         setvbuf(stdout, NULL, _IONBF, 0);
1283 #else /* WIN32 */
1284 #ifdef HAVE_SETLINEBUF
1285                         setlinebuf(stdout);
1286 #else
1287                         setvbuf(stdout, NULL, _IOLBF, 0);
1288 #endif
1289 #endif /* WIN32 */
1290                         break;
1291
1292                 case 'K':
1293                         ++Kflag;
1294                         break;
1295
1296                 case 'm':
1297 #ifdef USE_LIBSMI
1298                         if (smiLoadModule(optarg) == 0) {
1299                                 error("could not load MIB module %s", optarg);
1300                         }
1301                         sflag = 1;
1302 #else
1303                         (void)fprintf(stderr, "%s: ignoring option `-m %s' ",
1304                                       program_name, optarg);
1305                         (void)fprintf(stderr, "(no libsmi support)\n");
1306 #endif
1307                         break;
1308
1309                 case 'M':
1310                         /* TCP-MD5 shared secret */
1311 #ifndef HAVE_LIBCRYPTO
1312                         warning("crypto code not compiled in");
1313 #endif
1314                         sigsecret = optarg;
1315                         break;
1316
1317                 case 'n':
1318                         ++nflag;
1319                         break;
1320
1321                 case 'N':
1322                         ++Nflag;
1323                         break;
1324
1325                 case 'O':
1326                         Oflag = 0;
1327                         break;
1328
1329                 case 'p':
1330                         ++pflag;
1331                         break;
1332
1333                 case 'q':
1334                         ++qflag;
1335                         ++suppress_default_print;
1336                         break;
1337
1338 #ifdef HAVE_PCAP_SETDIRECTION
1339                 case 'Q':
1340                         if (strcasecmp(optarg, "in") == 0)
1341                                 Qflag = PCAP_D_IN;
1342                         else if (strcasecmp(optarg, "out") == 0)
1343                                 Qflag = PCAP_D_OUT;
1344                         else if (strcasecmp(optarg, "inout") == 0)
1345                                 Qflag = PCAP_D_INOUT;
1346                         else
1347                                 error("unknown capture direction `%s'", optarg);
1348                         break;
1349 #endif /* HAVE_PCAP_SETDIRECTION */
1350
1351                 case 'r':
1352                         RFileName = optarg;
1353                         break;
1354
1355                 case 'R':
1356                         Rflag = 0;
1357                         break;
1358
1359                 case 's':
1360                         snaplen = strtol(optarg, &end, 0);
1361                         if (optarg == end || *end != '\0'
1362                             || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN)
1363                                 error("invalid snaplen %s", optarg);
1364                         else if (snaplen == 0)
1365                                 snaplen = MAXIMUM_SNAPLEN;
1366                         break;
1367
1368                 case 'S':
1369                         ++Sflag;
1370                         break;
1371
1372                 case 't':
1373                         ++tflag;
1374                         break;
1375
1376                 case 'T':
1377                         if (strcasecmp(optarg, "vat") == 0)
1378                                 packettype = PT_VAT;
1379                         else if (strcasecmp(optarg, "wb") == 0)
1380                                 packettype = PT_WB;
1381                         else if (strcasecmp(optarg, "rpc") == 0)
1382                                 packettype = PT_RPC;
1383                         else if (strcasecmp(optarg, "rtp") == 0)
1384                                 packettype = PT_RTP;
1385                         else if (strcasecmp(optarg, "rtcp") == 0)
1386                                 packettype = PT_RTCP;
1387                         else if (strcasecmp(optarg, "snmp") == 0)
1388                                 packettype = PT_SNMP;
1389                         else if (strcasecmp(optarg, "cnfp") == 0)
1390                                 packettype = PT_CNFP;
1391                         else if (strcasecmp(optarg, "tftp") == 0)
1392                                 packettype = PT_TFTP;
1393                         else if (strcasecmp(optarg, "aodv") == 0)
1394                                 packettype = PT_AODV;
1395                         else if (strcasecmp(optarg, "carp") == 0)
1396                                 packettype = PT_CARP;
1397                         else if (strcasecmp(optarg, "radius") == 0)
1398                                 packettype = PT_RADIUS;
1399                         else if (strcasecmp(optarg, "zmtp1") == 0)
1400                                 packettype = PT_ZMTP1;
1401                         else if (strcasecmp(optarg, "vxlan") == 0)
1402                                 packettype = PT_VXLAN;
1403                         else if (strcasecmp(optarg, "pgm") == 0)
1404                                 packettype = PT_PGM;
1405                         else if (strcasecmp(optarg, "pgm_zmtp1") == 0)
1406                                 packettype = PT_PGM_ZMTP1;
1407                         else if (strcasecmp(optarg, "lmp") == 0)
1408                                 packettype = PT_LMP;
1409                         else
1410                                 error("unknown packet type `%s'", optarg);
1411                         break;
1412
1413                 case 'u':
1414                         ++uflag;
1415                         break;
1416
1417 #ifdef HAVE_PCAP_DUMP_FLUSH
1418                 case 'U':
1419                         ++Uflag;
1420                         break;
1421 #endif
1422
1423                 case 'v':
1424                         ++vflag;
1425                         break;
1426
1427                 case 'V':
1428                         VFileName = optarg;
1429                         break;
1430
1431                 case 'w':
1432                         WFileName = optarg;
1433                         break;
1434
1435                 case 'W':
1436                         Wflag = atoi(optarg);
1437                         if (Wflag < 0)
1438                                 error("invalid number of output files %s", optarg);
1439                         WflagChars = getWflagChars(Wflag);
1440                         break;
1441
1442                 case 'x':
1443                         ++xflag;
1444                         ++suppress_default_print;
1445                         break;
1446
1447                 case 'X':
1448                         ++Xflag;
1449                         ++suppress_default_print;
1450                         break;
1451
1452                 case 'y':
1453                         gndo->ndo_dltname = optarg;
1454                         gndo->ndo_dlt =
1455                           pcap_datalink_name_to_val(gndo->ndo_dltname);
1456                         if (gndo->ndo_dlt < 0)
1457                                 error("invalid data link type %s", gndo->ndo_dltname);
1458                         break;
1459
1460 #if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
1461                 case 'Y':
1462                         {
1463                         /* Undocumented flag */
1464 #ifdef HAVE_PCAP_DEBUG
1465                         extern int pcap_debug;
1466                         pcap_debug = 1;
1467 #else
1468                         extern int yydebug;
1469                         yydebug = 1;
1470 #endif
1471                         }
1472                         break;
1473 #endif
1474                 case 'z':
1475                         zflag = strdup(optarg);
1476                         break;
1477
1478                 case 'Z':
1479                         username = strdup(optarg);
1480                         break;
1481
1482                 case '#':
1483                         gndo->ndo_packet_number = 1;
1484                         break;
1485
1486                 case OPTION_VERSION:
1487                         print_version();
1488                         exit(0);
1489                         break;
1490
1491 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
1492                 case OPTION_TSTAMP_PRECISION:
1493                         gndo->ndo_tstamp_precision = tstamp_precision_from_string(optarg);
1494                         if (gndo->ndo_tstamp_precision < 0)
1495                                 error("unsupported time stamp precision");
1496                         break;
1497 #endif
1498
1499 #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
1500                 case OPTION_IMMEDIATE_MODE:
1501                         gndo->ndo_immediate = 1;
1502                         break;
1503 #endif
1504
1505                 default:
1506                         print_usage();
1507                         exit(1);
1508                         /* NOTREACHED */
1509                 }
1510
1511 #ifdef HAVE_PCAP_FINDALLDEVS
1512         if (Dflag)
1513                 show_devices_and_exit();
1514 #endif
1515
1516         switch (tflag) {
1517
1518         case 0: /* Default */
1519         case 4: /* Default + Date*/
1520                 thiszone = gmt2local(0);
1521                 break;
1522
1523         case 1: /* No time stamp */
1524         case 2: /* Unix timeval style */
1525         case 3: /* Microseconds since previous packet */
1526         case 5: /* Microseconds since first packet */
1527                 break;
1528
1529         default: /* Not supported */
1530                 error("only -t, -tt, -ttt, -tttt and -ttttt are supported");
1531                 break;
1532         }
1533
1534         if (fflag != 0 && (VFileName != NULL || RFileName != NULL))
1535                 error("-f can not be used with -V or -r");
1536
1537         if (VFileName != NULL && RFileName != NULL)
1538                 error("-V and -r are mutually exclusive.");
1539
1540 #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
1541         /*
1542          * If we're printing dissected packets to the standard output
1543          * rather than saving raw packets to a file, and the standard
1544          * output is a terminal, use immediate mode, as the user's
1545          * probably expecting to see packets pop up immediately.
1546          */
1547         if (WFileName == NULL && isatty(1))
1548                 gndo->ndo_immediate = 1;
1549 #endif
1550
1551 #ifdef WITH_CHROOT
1552         /* if run as root, prepare for chrooting */
1553         if (getuid() == 0 || geteuid() == 0) {
1554                 /* future extensibility for cmd-line arguments */
1555                 if (!chroot_dir)
1556                         chroot_dir = WITH_CHROOT;
1557         }
1558 #endif
1559
1560 #ifdef WITH_USER
1561         /* if run as root, prepare for dropping root privileges */
1562         if (getuid() == 0 || geteuid() == 0) {
1563                 /* Run with '-Z root' to restore old behaviour */
1564                 if (!username)
1565                         username = WITH_USER;
1566         }
1567 #endif
1568
1569         if (RFileName != NULL || VFileName != NULL) {
1570                 /*
1571                  * If RFileName is non-null, it's the pathname of a
1572                  * savefile to read.  If VFileName is non-null, it's
1573                  * the pathname of a file containing a list of pathnames
1574                  * (one per line) of savefiles to read.
1575                  *
1576                  * In either case, we're reading a savefile, not doing
1577                  * a live capture.
1578                  */
1579 #ifndef WIN32
1580                 /*
1581                  * We don't need network access, so relinquish any set-UID
1582                  * or set-GID privileges we have (if any).
1583                  *
1584                  * We do *not* want set-UID privileges when opening a
1585                  * trace file, as that might let the user read other
1586                  * people's trace files (especially if we're set-UID
1587                  * root).
1588                  */
1589                 if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
1590                         fprintf(stderr, "Warning: setgid/setuid failed !\n");
1591 #endif /* WIN32 */
1592                 if (VFileName != NULL) {
1593                         if (VFileName[0] == '-' && VFileName[1] == '\0')
1594                                 VFile = stdin;
1595                         else
1596                                 VFile = fopen(VFileName, "r");
1597
1598                         if (VFile == NULL)
1599                                 error("Unable to open file: %s\n", strerror(errno));
1600
1601                         ret = get_next_file(VFile, VFileLine);
1602                         if (!ret)
1603                                 error("Nothing in %s\n", VFileName);
1604                         RFileName = VFileLine;
1605                 }
1606
1607 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
1608                 pd = pcap_open_offline_with_tstamp_precision(RFileName,
1609                     gndo->ndo_tstamp_precision, ebuf);
1610 #else
1611                 pd = pcap_open_offline(RFileName, ebuf);
1612 #endif
1613
1614                 if (pd == NULL)
1615                         error("%s", ebuf);
1616 #ifdef HAVE_CAPSICUM
1617                 cap_rights_init(&rights, CAP_READ);
1618                 if (cap_rights_limit(fileno(pcap_file(pd)), &rights) < 0 &&
1619                     errno != ENOSYS) {
1620                         error("unable to limit pcap descriptor");
1621                 }
1622 #endif
1623                 dlt = pcap_datalink(pd);
1624                 dlt_name = pcap_datalink_val_to_name(dlt);
1625                 if (dlt_name == NULL) {
1626                         fprintf(stderr, "reading from file %s, link-type %u\n",
1627                             RFileName, dlt);
1628                 } else {
1629                         fprintf(stderr,
1630                             "reading from file %s, link-type %s (%s)\n",
1631                             RFileName, dlt_name,
1632                             pcap_datalink_val_to_description(dlt));
1633                 }
1634         } else {
1635                 /*
1636                  * We're doing a live capture.
1637                  */
1638                 if (device == NULL) {
1639                         device = pcap_lookupdev(ebuf);
1640                         if (device == NULL)
1641                                 error("%s", ebuf);
1642                 }
1643 #ifdef WIN32
1644                 /*
1645                  * Print a message to the standard error on Windows.
1646                  * XXX - why do it here, with a different message?
1647                  */
1648                 if(strlen(device) == 1) /* we assume that an ASCII string is always longer than 1 char */
1649                 {                                               /* a Unicode string has a \0 as second byte (so strlen() is 1) */
1650                         fprintf(stderr, "%s: listening on %ws\n", program_name, device);
1651                 }
1652                 else
1653                 {
1654                         fprintf(stderr, "%s: listening on %s\n", program_name, device);
1655                 }
1656
1657                 fflush(stderr);
1658 #endif /* WIN32 */
1659 #ifdef HAVE_PCAP_CREATE
1660                 pd = pcap_create(device, ebuf);
1661                 if (pd == NULL)
1662                         error("%s", ebuf);
1663 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
1664                 if (Jflag)
1665                         show_tstamp_types_and_exit(device, pd);
1666 #endif
1667 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
1668                 status = pcap_set_tstamp_precision(pd, gndo->ndo_tstamp_precision);
1669                 if (status != 0)
1670                         error("%s: Can't set %ssecond time stamp precision: %s",
1671                                 device,
1672                                 tstamp_precision_to_string(gndo->ndo_tstamp_precision),
1673                                 pcap_statustostr(status));
1674 #endif
1675
1676 #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
1677                 if (gndo->ndo_immediate) {
1678                         status = pcap_set_immediate_mode(pd, 1);
1679                         if (status != 0)
1680                                 error("%s: Can't set immediate mode: %s",
1681                                 device,
1682                                 pcap_statustostr(status));
1683                 }
1684 #endif
1685                 /*
1686                  * Is this an interface that supports monitor mode?
1687                  */
1688                 if (pcap_can_set_rfmon(pd) == 1)
1689                         supports_monitor_mode = 1;
1690                 else
1691                         supports_monitor_mode = 0;
1692                 status = pcap_set_snaplen(pd, snaplen);
1693                 if (status != 0)
1694                         error("%s: Can't set snapshot length: %s",
1695                             device, pcap_statustostr(status));
1696                 status = pcap_set_promisc(pd, !pflag);
1697                 if (status != 0)
1698                         error("%s: Can't set promiscuous mode: %s",
1699                             device, pcap_statustostr(status));
1700                 if (Iflag) {
1701                         status = pcap_set_rfmon(pd, 1);
1702                         if (status != 0)
1703                                 error("%s: Can't set monitor mode: %s",
1704                                     device, pcap_statustostr(status));
1705                 }
1706                 status = pcap_set_timeout(pd, 1000);
1707                 if (status != 0)
1708                         error("%s: pcap_set_timeout failed: %s",
1709                             device, pcap_statustostr(status));
1710                 if (Bflag != 0) {
1711                         status = pcap_set_buffer_size(pd, Bflag);
1712                         if (status != 0)
1713                                 error("%s: Can't set buffer size: %s",
1714                                     device, pcap_statustostr(status));
1715                 }
1716 #ifdef HAVE_PCAP_SET_TSTAMP_TYPE
1717                 if (jflag != -1) {
1718                         status = pcap_set_tstamp_type(pd, jflag);
1719                         if (status < 0)
1720                                 error("%s: Can't set time stamp type: %s",
1721                                       device, pcap_statustostr(status));
1722                 }
1723 #endif
1724                 status = pcap_activate(pd);
1725                 if (status < 0) {
1726                         /*
1727                          * pcap_activate() failed.
1728                          */
1729                         cp = pcap_geterr(pd);
1730                         if (status == PCAP_ERROR)
1731                                 error("%s", cp);
1732                         else if ((status == PCAP_ERROR_NO_SUCH_DEVICE ||
1733                                   status == PCAP_ERROR_PERM_DENIED) &&
1734                                  *cp != '\0')
1735                                 error("%s: %s\n(%s)", device,
1736                                     pcap_statustostr(status), cp);
1737 #ifdef __FreeBSD__
1738                         else if (status == PCAP_ERROR_RFMON_NOTSUP &&
1739                             strncmp(device, "wlan", 4) == 0) {
1740                                 char parent[8], newdev[8];
1741                                 char sysctl[32];
1742                                 size_t s = sizeof(parent);
1743
1744                                 snprintf(sysctl, sizeof(sysctl),
1745                                     "net.wlan.%d.%%parent", atoi(device + 4));
1746                                 sysctlbyname(sysctl, parent, &s, NULL, 0);
1747                                 strlcpy(newdev, device, sizeof(newdev));
1748                                 /* Suggest a new wlan device. */
1749                                 newdev[strlen(newdev)-1]++;
1750                                 error("%s is not a monitor mode VAP\n"
1751                                     "To create a new monitor mode VAP use:\n"
1752                                     "  ifconfig %s create wlandev %s wlanmode "
1753                                     "monitor\nand use %s as the tcpdump "
1754                                     "interface", device, newdev, parent,
1755                                     newdev);
1756                         }
1757 #endif
1758                         else
1759                                 error("%s: %s", device,
1760                                     pcap_statustostr(status));
1761                 } else if (status > 0) {
1762                         /*
1763                          * pcap_activate() succeeded, but it's warning us
1764                          * of a problem it had.
1765                          */
1766                         cp = pcap_geterr(pd);
1767                         if (status == PCAP_WARNING)
1768                                 warning("%s", cp);
1769                         else if (status == PCAP_WARNING_PROMISC_NOTSUP &&
1770                                  *cp != '\0')
1771                                 warning("%s: %s\n(%s)", device,
1772                                     pcap_statustostr(status), cp);
1773                         else
1774                                 warning("%s: %s", device,
1775                                     pcap_statustostr(status));
1776                 }
1777 #ifdef HAVE_PCAP_SETDIRECTION
1778                 if (Qflag != -1) {
1779                         status = pcap_setdirection(pd, Qflag);
1780                         if (status != 0)
1781                                 error("%s: pcap_setdirection() failed: %s",
1782                                       device,  pcap_geterr(pd));
1783                 }
1784 #endif /* HAVE_PCAP_SETDIRECTION */
1785 #else
1786                 *ebuf = '\0';
1787                 pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
1788                 if (pd == NULL)
1789                         error("%s", ebuf);
1790                 else if (*ebuf)
1791                         warning("%s", ebuf);
1792 #endif /* HAVE_PCAP_CREATE */
1793                 /*
1794                  * Let user own process after socket has been opened.
1795                  */
1796 #ifndef WIN32
1797                 if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
1798                         fprintf(stderr, "Warning: setgid/setuid failed !\n");
1799 #endif /* WIN32 */
1800 #if !defined(HAVE_PCAP_CREATE) && defined(WIN32)
1801                 if(Bflag != 0)
1802                         if(pcap_setbuff(pd, Bflag)==-1){
1803                                 error("%s", pcap_geterr(pd));
1804                         }
1805 #endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */
1806                 if (Lflag)
1807                         show_dlts_and_exit(device, pd);
1808                 if (gndo->ndo_dlt >= 0) {
1809 #ifdef HAVE_PCAP_SET_DATALINK
1810                         if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)
1811                                 error("%s", pcap_geterr(pd));
1812 #else
1813                         /*
1814                          * We don't actually support changing the
1815                          * data link type, so we only let them
1816                          * set it to what it already is.
1817                          */
1818                         if (gndo->ndo_dlt != pcap_datalink(pd)) {
1819                                 error("%s is not one of the DLTs supported by this device\n",
1820                                       gndo->ndo_dltname);
1821                         }
1822 #endif
1823                         (void)fprintf(stderr, "%s: data link type %s\n",
1824                                       program_name, gndo->ndo_dltname);
1825                         (void)fflush(stderr);
1826                 }
1827                 i = pcap_snapshot(pd);
1828                 if (snaplen < i) {
1829                         warning("snaplen raised from %d to %d", snaplen, i);
1830                         snaplen = i;
1831                 }
1832                 if(fflag != 0) {
1833                         if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
1834                                 warning("foreign (-f) flag used but: %s", ebuf);
1835                         }
1836                 }
1837
1838         }
1839         if (infile)
1840                 cmdbuf = read_infile(infile);
1841         else
1842                 cmdbuf = copy_argv(&argv[optind]);
1843
1844         if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
1845                 error("%s", pcap_geterr(pd));
1846         if (dflag) {
1847                 bpf_dump(&fcode, dflag);
1848                 pcap_close(pd);
1849                 free(cmdbuf);
1850                 exit(0);
1851         }
1852
1853 #ifdef HAVE_CAPSICUM
1854         if (!nflag)
1855                 capdns = capdns_setup();
1856 #endif  /* HAVE_CAPSICUM */
1857
1858         init_addrtoname(gndo, localnet, netmask);
1859         init_checksum();
1860
1861 #ifndef WIN32
1862         (void)setsignal(SIGPIPE, cleanup);
1863         (void)setsignal(SIGTERM, cleanup);
1864         (void)setsignal(SIGINT, cleanup);
1865 #endif /* WIN32 */
1866 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
1867         (void)setsignal(SIGCHLD, child_cleanup);
1868 #endif
1869         /* Cooperate with nohup(1) */
1870 #ifndef WIN32
1871         if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
1872                 (void)setsignal(SIGHUP, oldhandler);
1873 #endif /* WIN32 */
1874
1875 #ifndef WIN32
1876         /*
1877          * If a user name was specified with "-Z", attempt to switch to
1878          * that user's UID.  This would probably be used with sudo,
1879          * to allow tcpdump to be run in a special restricted
1880          * account (if you just want to allow users to open capture
1881          * devices, and can't just give users that permission,
1882          * you'd make tcpdump set-UID or set-GID).
1883          *
1884          * Tcpdump doesn't necessarily write only to one savefile;
1885          * the general only way to allow a -Z instance to write to
1886          * savefiles as the user under whose UID it's run, rather
1887          * than as the user specified with -Z, would thus be to switch
1888          * to the original user ID before opening a capture file and
1889          * then switch back to the -Z user ID after opening the savefile.
1890          * Switching to the -Z user ID only after opening the first
1891          * savefile doesn't handle the general case.
1892          */
1893
1894         if (getuid() == 0 || geteuid() == 0) {
1895 #ifdef HAVE_LIBCAP_NG
1896                 /* Initialize capng */
1897                 capng_clear(CAPNG_SELECT_BOTH);
1898                 if (username) {
1899                         capng_updatev(
1900                                 CAPNG_ADD,
1901                                 CAPNG_PERMITTED | CAPNG_EFFECTIVE,
1902                                 CAP_SETUID,
1903                                 CAP_SETGID,
1904                                 -1);
1905                 }
1906
1907                 if (WFileName) {
1908                         capng_update(
1909                                 CAPNG_ADD,
1910                                 CAPNG_PERMITTED | CAPNG_EFFECTIVE,
1911                                 CAP_DAC_OVERRIDE
1912                                 );
1913                 }
1914                 capng_apply(CAPNG_SELECT_BOTH);
1915 #endif /* HAVE_LIBCAP_NG */
1916                 if (username || chroot_dir)
1917                         droproot(username, chroot_dir);
1918
1919         }
1920 #endif /* WIN32 */
1921
1922         if (pcap_setfilter(pd, &fcode) < 0)
1923                 error("%s", pcap_geterr(pd));
1924 #ifdef HAVE_CAPSICUM
1925         if (RFileName == NULL && VFileName == NULL) {
1926                 static const unsigned long cmds[] = { BIOCGSTATS };
1927
1928                 /*
1929                  * The various libpcap devices use a combination of
1930                  * read (bpf), ioctl (bpf, netmap), poll (netmap).
1931                  * Grant the relevant access rights, sorted by name.
1932                  */
1933                 cap_rights_init(&rights, CAP_EVENT, CAP_IOCTL, CAP_READ);
1934                 if (cap_rights_limit(pcap_fileno(pd), &rights) < 0 &&
1935                     errno != ENOSYS) {
1936                         error("unable to limit pcap descriptor");
1937                 }
1938                 if (cap_ioctls_limit(pcap_fileno(pd), cmds,
1939                     sizeof(cmds) / sizeof(cmds[0])) < 0 && errno != ENOSYS) {
1940                         error("unable to limit ioctls on pcap descriptor");
1941                 }
1942         }
1943 #endif
1944         if (WFileName) {
1945                 pcap_dumper_t *p;
1946                 /* Do not exceed the default PATH_MAX for files. */
1947                 dumpinfo.CurrentFileName = (char *)malloc(PATH_MAX + 1);
1948
1949                 if (dumpinfo.CurrentFileName == NULL)
1950                         error("malloc of dumpinfo.CurrentFileName");
1951
1952                 /* We do not need numbering for dumpfiles if Cflag isn't set. */
1953                 if (Cflag != 0)
1954                   MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
1955                 else
1956                   MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
1957
1958                 p = pcap_dump_open(pd, dumpinfo.CurrentFileName);
1959 #ifdef HAVE_LIBCAP_NG
1960                 /* Give up CAP_DAC_OVERRIDE capability.
1961                  * Only allow it to be restored if the -C or -G flag have been
1962                  * set since we may need to create more files later on.
1963                  */
1964                 capng_update(
1965                         CAPNG_DROP,
1966                         (Cflag || Gflag ? 0 : CAPNG_PERMITTED)
1967                                 | CAPNG_EFFECTIVE,
1968                         CAP_DAC_OVERRIDE
1969                         );
1970                 capng_apply(CAPNG_SELECT_BOTH);
1971 #endif /* HAVE_LIBCAP_NG */
1972                 if (p == NULL)
1973                         error("%s", pcap_geterr(pd));
1974 #ifdef HAVE_CAPSICUM
1975                 set_dumper_capsicum_rights(p);
1976 #endif
1977                 if (Cflag != 0 || Gflag != 0) {
1978 #ifdef HAVE_CAPSICUM
1979                         dumpinfo.WFileName = strdup(basename(WFileName));
1980                         dumpinfo.dirfd = open(dirname(WFileName),
1981                             O_DIRECTORY | O_RDONLY);
1982                         if (dumpinfo.dirfd < 0) {
1983                                 error("unable to open directory %s",
1984                                     dirname(WFileName));
1985                         }
1986                         cap_rights_init(&rights, CAP_CREATE, CAP_FCNTL,
1987                             CAP_FTRUNCATE, CAP_LOOKUP, CAP_SEEK, CAP_WRITE);
1988                         if (cap_rights_limit(dumpinfo.dirfd, &rights) < 0 &&
1989                             errno != ENOSYS) {
1990                                 error("unable to limit directory rights");
1991                         }
1992                         if (cap_fcntls_limit(dumpinfo.dirfd, CAP_FCNTL_GETFL) < 0 &&
1993                             errno != ENOSYS) {
1994                                 error("unable to limit dump descriptor fcntls");
1995                         }
1996 #else   /* !HAVE_CAPSICUM */
1997                         dumpinfo.WFileName = WFileName;
1998 #endif
1999                         callback = dump_packet_and_trunc;
2000                         dumpinfo.pd = pd;
2001                         dumpinfo.p = p;
2002                         pcap_userdata = (u_char *)&dumpinfo;
2003                 } else {
2004                         callback = dump_packet;
2005                         pcap_userdata = (u_char *)p;
2006                 }
2007 #ifdef HAVE_PCAP_DUMP_FLUSH
2008                 if (Uflag)
2009                         pcap_dump_flush(p);
2010 #endif
2011         } else {
2012                 type = pcap_datalink(pd);
2013                 printinfo = get_print_info(type);
2014                 callback = print_packet;
2015                 pcap_userdata = (u_char *)&printinfo;
2016         }
2017
2018 #ifdef SIGNAL_REQ_INFO
2019         /*
2020          * We can't get statistics when reading from a file rather
2021          * than capturing from a device.
2022          */
2023         if (RFileName == NULL)
2024                 (void)setsignal(SIGNAL_REQ_INFO, requestinfo);
2025 #endif
2026
2027         if (vflag > 0 && WFileName) {
2028                 /*
2029                  * When capturing to a file, "-v" means tcpdump should,
2030                  * every 10 secodns, "v"erbosely report the number of
2031                  * packets captured.
2032                  */
2033 #ifdef USE_WIN32_MM_TIMER
2034                 /* call verbose_stats_dump() each 1000 +/-100msec */
2035                 timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
2036                 setvbuf(stderr, NULL, _IONBF, 0);
2037 #elif defined(HAVE_ALARM)
2038                 (void)setsignal(SIGALRM, verbose_stats_dump);
2039                 alarm(1);
2040 #endif
2041         }
2042
2043 #ifndef WIN32
2044         if (RFileName == NULL) {
2045                 /*
2046                  * Live capture (if -V was specified, we set RFileName
2047                  * to a file from the -V file).  Print a message to
2048                  * the standard error on UN*X.
2049                  */
2050                 if (!vflag && !WFileName) {
2051                         (void)fprintf(stderr,
2052                             "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
2053                             program_name);
2054                 } else
2055                         (void)fprintf(stderr, "%s: ", program_name);
2056                 dlt = pcap_datalink(pd);
2057                 dlt_name = pcap_datalink_val_to_name(dlt);
2058                 if (dlt_name == NULL) {
2059                         (void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n",
2060                             device, dlt, snaplen);
2061                 } else {
2062                         (void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n",
2063                             device, dlt_name,
2064                             pcap_datalink_val_to_description(dlt), snaplen);
2065                 }
2066                 (void)fflush(stderr);
2067         }
2068 #endif /* WIN32 */
2069
2070 #ifdef __FreeBSD__
2071         cansandbox = (VFileName == NULL && zflag == NULL);
2072 #ifdef HAVE_CAPSICUM
2073         cansandbox = (cansandbox && (nflag || capdns != NULL));
2074 #else
2075         cansandbox = (cansandbox && nflag);
2076 #endif
2077         if (cansandbox && cap_enter() < 0 && errno != ENOSYS)
2078                 error("unable to enter the capability mode");
2079 #endif  /* __FreeBSD__ */
2080
2081         do {
2082                 status = pcap_loop(pd, cnt, callback, pcap_userdata);
2083                 if (WFileName == NULL) {
2084                         /*
2085                          * We're printing packets.  Flush the printed output,
2086                          * so it doesn't get intermingled with error output.
2087                          */
2088                         if (status == -2) {
2089                                 /*
2090                                  * We got interrupted, so perhaps we didn't
2091                                  * manage to finish a line we were printing.
2092                                  * Print an extra newline, just in case.
2093                                  */
2094                                 putchar('\n');
2095                         }
2096                         (void)fflush(stdout);
2097                 }
2098                 if (status == -2) {
2099                         /*
2100                          * We got interrupted. If we are reading multiple
2101                          * files (via -V) set these so that we stop.
2102                          */
2103                         VFileName = NULL;
2104                         ret = NULL;
2105                 }
2106                 if (status == -1) {
2107                         /*
2108                          * Error.  Report it.
2109                          */
2110                         (void)fprintf(stderr, "%s: pcap_loop: %s\n",
2111                             program_name, pcap_geterr(pd));
2112                 }
2113                 if (RFileName == NULL) {
2114                         /*
2115                          * We're doing a live capture.  Report the capture
2116                          * statistics.
2117                          */
2118                         info(1);
2119                 }
2120                 pcap_close(pd);
2121                 if (VFileName != NULL) {
2122                         ret = get_next_file(VFile, VFileLine);
2123                         if (ret) {
2124                                 RFileName = VFileLine;
2125                                 pd = pcap_open_offline(RFileName, ebuf);
2126                                 if (pd == NULL)
2127                                         error("%s", ebuf);
2128 #ifdef HAVE_CAPSICUM
2129                                 cap_rights_init(&rights, CAP_READ);
2130                                 if (cap_rights_limit(fileno(pcap_file(pd)),
2131                                     &rights) < 0 && errno != ENOSYS) {
2132                                         error("unable to limit pcap descriptor");
2133                                 }
2134 #endif
2135                                 new_dlt = pcap_datalink(pd);
2136                                 if (WFileName && new_dlt != dlt)
2137                                         error("%s: new dlt does not match original", RFileName);
2138                                 printinfo = get_print_info(new_dlt);
2139                                 dlt_name = pcap_datalink_val_to_name(new_dlt);
2140                                 if (dlt_name == NULL) {
2141                                         fprintf(stderr, "reading from file %s, link-type %u\n",
2142                                         RFileName, new_dlt);
2143                                 } else {
2144                                         fprintf(stderr,
2145                                         "reading from file %s, link-type %s (%s)\n",
2146                                         RFileName, dlt_name,
2147                                         pcap_datalink_val_to_description(new_dlt));
2148                                 }
2149                                 if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
2150                                         error("%s", pcap_geterr(pd));
2151                                 if (pcap_setfilter(pd, &fcode) < 0)
2152                                         error("%s", pcap_geterr(pd));
2153                         }
2154                 }
2155         }
2156         while (ret != NULL);
2157
2158         free(cmdbuf);
2159         exit(status == -1 ? 1 : 0);
2160 }
2161
2162 /* make a clean exit on interrupts */
2163 static RETSIGTYPE
2164 cleanup(int signo _U_)
2165 {
2166 #ifdef USE_WIN32_MM_TIMER
2167         if (timer_id)
2168                 timeKillEvent(timer_id);
2169         timer_id = 0;
2170 #elif defined(HAVE_ALARM)
2171         alarm(0);
2172 #endif
2173
2174 #ifdef HAVE_PCAP_BREAKLOOP
2175         /*
2176          * We have "pcap_breakloop()"; use it, so that we do as little
2177          * as possible in the signal handler (it's probably not safe
2178          * to do anything with standard I/O streams in a signal handler -
2179          * the ANSI C standard doesn't say it is).
2180          */
2181         pcap_breakloop(pd);
2182 #else
2183         /*
2184          * We don't have "pcap_breakloop()"; this isn't safe, but
2185          * it's the best we can do.  Print the summary if we're
2186          * not reading from a savefile - i.e., if we're doing a
2187          * live capture - and exit.
2188          */
2189         if (pd != NULL && pcap_file(pd) == NULL) {
2190                 /*
2191                  * We got interrupted, so perhaps we didn't
2192                  * manage to finish a line we were printing.
2193                  * Print an extra newline, just in case.
2194                  */
2195                 putchar('\n');
2196                 (void)fflush(stdout);
2197                 info(1);
2198         }
2199         exit(0);
2200 #endif
2201 }
2202
2203 /*
2204   On windows, we do not use a fork, so we do not care less about
2205   waiting a child processes to die
2206  */
2207 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
2208 static RETSIGTYPE
2209 child_cleanup(int signo _U_)
2210 {
2211   wait(NULL);
2212 }
2213 #endif /* HAVE_FORK && HAVE_VFORK */
2214
2215 static void
2216 info(register int verbose)
2217 {
2218         struct pcap_stat stat;
2219
2220         /*
2221          * Older versions of libpcap didn't set ps_ifdrop on some
2222          * platforms; initialize it to 0 to handle that.
2223          */
2224         stat.ps_ifdrop = 0;
2225         if (pcap_stats(pd, &stat) < 0) {
2226                 (void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
2227                 infoprint = 0;
2228                 return;
2229         }
2230
2231         if (!verbose)
2232                 fprintf(stderr, "%s: ", program_name);
2233
2234         (void)fprintf(stderr, "%u packet%s captured", packets_captured,
2235             PLURAL_SUFFIX(packets_captured));
2236         if (!verbose)
2237                 fputs(", ", stderr);
2238         else
2239                 putc('\n', stderr);
2240         (void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv,
2241             PLURAL_SUFFIX(stat.ps_recv));
2242         if (!verbose)
2243                 fputs(", ", stderr);
2244         else
2245                 putc('\n', stderr);
2246         (void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop,
2247             PLURAL_SUFFIX(stat.ps_drop));
2248         if (stat.ps_ifdrop != 0) {
2249                 if (!verbose)
2250                         fputs(", ", stderr);
2251                 else
2252                         putc('\n', stderr);
2253                 (void)fprintf(stderr, "%u packet%s dropped by interface\n",
2254                     stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
2255         } else
2256                 putc('\n', stderr);
2257         infoprint = 0;
2258 }
2259
2260 #if defined(HAVE_FORK) || defined(HAVE_VFORK)
2261 static void
2262 compress_savefile(const char *filename)
2263 {
2264 # ifdef HAVE_FORK
2265         if (fork())
2266 # else
2267         if (vfork())
2268 # endif
2269                 return;
2270         /*
2271          * Set to lowest priority so that this doesn't disturb the capture
2272          */
2273 #ifdef NZERO
2274         setpriority(PRIO_PROCESS, 0, NZERO - 1);
2275 #else
2276         setpriority(PRIO_PROCESS, 0, 19);
2277 #endif
2278         if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
2279                 fprintf(stderr,
2280                         "compress_savefile:execlp(%s, %s): %s\n",
2281                         zflag,
2282                         filename,
2283                         strerror(errno));
2284 # ifdef HAVE_FORK
2285         exit(1);
2286 # else
2287         _exit(1);
2288 # endif
2289 }
2290 #else  /* HAVE_FORK && HAVE_VFORK */
2291 static void
2292 compress_savefile(const char *filename)
2293 {
2294         fprintf(stderr,
2295                 "compress_savefile failed. Functionality not implemented under your system\n");
2296 }
2297 #endif /* HAVE_FORK && HAVE_VFORK */
2298
2299 static void
2300 dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
2301 {
2302         struct dump_info *dump_info;
2303
2304         ++packets_captured;
2305
2306         ++infodelay;
2307
2308         dump_info = (struct dump_info *)user;
2309
2310         /*
2311          * XXX - this won't force the file to rotate on the specified time
2312          * boundary, but it will rotate on the first packet received after the
2313          * specified Gflag number of seconds. Note: if a Gflag time boundary
2314          * and a Cflag size boundary coincide, the time rotation will occur
2315          * first thereby cancelling the Cflag boundary (since the file should
2316          * be 0).
2317          */
2318         if (Gflag != 0) {
2319                 /* Check if it is time to rotate */
2320                 time_t t;
2321
2322                 /* Get the current time */
2323                 if ((t = time(NULL)) == (time_t)-1) {
2324                         error("dump_and_trunc_packet: can't get current_time: %s",
2325                             pcap_strerror(errno));
2326                 }
2327
2328
2329                 /* If the time is greater than the specified window, rotate */
2330                 if (t - Gflag_time >= Gflag) {
2331 #ifdef HAVE_CAPSICUM
2332                         FILE *fp;
2333                         int fd;
2334 #endif
2335
2336                         /* Update the Gflag_time */
2337                         Gflag_time = t;
2338                         /* Update Gflag_count */
2339                         Gflag_count++;
2340                         /*
2341                          * Close the current file and open a new one.
2342                          */
2343                         pcap_dump_close(dump_info->p);
2344
2345                         /*
2346                          * Compress the file we just closed, if the user asked for it
2347                          */
2348                         if (zflag != NULL)
2349                                 compress_savefile(dump_info->CurrentFileName);
2350
2351                         /*
2352                          * Check to see if we've exceeded the Wflag (when
2353                          * not using Cflag).
2354                          */
2355                         if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) {
2356                                 (void)fprintf(stderr, "Maximum file limit reached: %d\n",
2357                                     Wflag);
2358                                 exit(0);
2359                                 /* NOTREACHED */
2360                         }
2361                         if (dump_info->CurrentFileName != NULL)
2362                                 free(dump_info->CurrentFileName);
2363                         /* Allocate space for max filename + \0. */
2364                         dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
2365                         if (dump_info->CurrentFileName == NULL)
2366                                 error("dump_packet_and_trunc: malloc");
2367                         /*
2368                          * Gflag was set otherwise we wouldn't be here. Reset the count
2369                          * so multiple files would end with 1,2,3 in the filename.
2370                          * The counting is handled with the -C flow after this.
2371                          */
2372                         Cflag_count = 0;
2373
2374                         /*
2375                          * This is always the first file in the Cflag
2376                          * rotation: e.g. 0
2377                          * We also don't need numbering if Cflag is not set.
2378                          */
2379                         if (Cflag != 0)
2380                                 MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
2381                                     WflagChars);
2382                         else
2383                                 MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
2384
2385 #ifdef HAVE_LIBCAP_NG
2386                         capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
2387                         capng_apply(CAPNG_SELECT_BOTH);
2388 #endif /* HAVE_LIBCAP_NG */
2389 #ifdef HAVE_CAPSICUM
2390                         fd = openat(dump_info->dirfd,
2391                             dump_info->CurrentFileName,
2392                             O_CREAT | O_WRONLY | O_TRUNC, 0644);
2393                         if (fd < 0) {
2394                                 error("unable to open file %s",
2395                                     dump_info->CurrentFileName);
2396                         }
2397                         fp = fdopen(fd, "w");
2398                         if (fp == NULL) {
2399                                 error("unable to fdopen file %s",
2400                                     dump_info->CurrentFileName);
2401                         }
2402                         dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
2403 #else   /* !HAVE_CAPSICUM */
2404                         dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
2405 #endif
2406 #ifdef HAVE_LIBCAP_NG
2407                         capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
2408                         capng_apply(CAPNG_SELECT_BOTH);
2409 #endif /* HAVE_LIBCAP_NG */
2410                         if (dump_info->p == NULL)
2411                                 error("%s", pcap_geterr(pd));
2412 #ifdef HAVE_CAPSICUM
2413                         set_dumper_capsicum_rights(dump_info->p);
2414 #endif
2415                 }
2416         }
2417
2418         /*
2419          * XXX - this won't prevent capture files from getting
2420          * larger than Cflag - the last packet written to the
2421          * file could put it over Cflag.
2422          */
2423         if (Cflag != 0) {
2424                 long size = pcap_dump_ftell(dump_info->p);
2425
2426                 if (size == -1)
2427                         error("ftell fails on output file");
2428                 if (size > Cflag) {
2429 #ifdef HAVE_CAPSICUM
2430                         FILE *fp;
2431                         int fd;
2432 #endif
2433
2434                         /*
2435                          * Close the current file and open a new one.
2436                          */
2437                         pcap_dump_close(dump_info->p);
2438
2439                         /*
2440                          * Compress the file we just closed, if the user
2441                          * asked for it.
2442                          */
2443                         if (zflag != NULL)
2444                                 compress_savefile(dump_info->CurrentFileName);
2445
2446                         Cflag_count++;
2447                         if (Wflag > 0) {
2448                                 if (Cflag_count >= Wflag)
2449                                         Cflag_count = 0;
2450                         }
2451                         if (dump_info->CurrentFileName != NULL)
2452                                 free(dump_info->CurrentFileName);
2453                         dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
2454                         if (dump_info->CurrentFileName == NULL)
2455                                 error("dump_packet_and_trunc: malloc");
2456                         MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
2457 #ifdef HAVE_LIBCAP_NG
2458                         capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
2459                         capng_apply(CAPNG_SELECT_BOTH);
2460 #endif /* HAVE_LIBCAP_NG */
2461 #ifdef HAVE_CAPSICUM
2462                         fd = openat(dump_info->dirfd, dump_info->CurrentFileName,
2463                             O_CREAT | O_WRONLY | O_TRUNC, 0644);
2464                         if (fd < 0) {
2465                                 error("unable to open file %s",
2466                                     dump_info->CurrentFileName);
2467                         }
2468                         fp = fdopen(fd, "w");
2469                         if (fp == NULL) {
2470                                 error("unable to fdopen file %s",
2471                                     dump_info->CurrentFileName);
2472                         }
2473                         dump_info->p = pcap_dump_fopen(dump_info->pd, fp);
2474 #else   /* !HAVE_CAPSICUM */
2475                         dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
2476 #endif
2477 #ifdef HAVE_LIBCAP_NG
2478                         capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
2479                         capng_apply(CAPNG_SELECT_BOTH);
2480 #endif /* HAVE_LIBCAP_NG */
2481                         if (dump_info->p == NULL)
2482                                 error("%s", pcap_geterr(pd));
2483 #ifdef HAVE_CAPSICUM
2484                         set_dumper_capsicum_rights(dump_info->p);
2485 #endif
2486                 }
2487         }
2488
2489         pcap_dump((u_char *)dump_info->p, h, sp);
2490 #ifdef HAVE_PCAP_DUMP_FLUSH
2491         if (Uflag)
2492                 pcap_dump_flush(dump_info->p);
2493 #endif
2494
2495         --infodelay;
2496         if (infoprint)
2497                 info(0);
2498 }
2499
2500 static void
2501 dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
2502 {
2503         ++packets_captured;
2504
2505         ++infodelay;
2506
2507         pcap_dump(user, h, sp);
2508 #ifdef HAVE_PCAP_DUMP_FLUSH
2509         if (Uflag)
2510                 pcap_dump_flush((pcap_dumper_t *)user);
2511 #endif
2512
2513         --infodelay;
2514         if (infoprint)
2515                 info(0);
2516 }
2517
2518 static void
2519 print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
2520 {
2521         struct print_info *print_info;
2522         u_int hdrlen;
2523         netdissect_options *ndo;
2524
2525         ++packets_captured;
2526
2527         ++infodelay;
2528
2529         print_info = (struct print_info *)user;
2530         ndo = print_info->ndo;
2531
2532         if(ndo->ndo_packet_number)
2533                 ND_PRINT((ndo, "%5u  ", packets_captured));
2534
2535         ts_print(ndo, &h->ts);
2536
2537         /*
2538          * Some printers want to check that they're not walking off the
2539          * end of the packet.
2540          * Rather than pass it all the way down, we set this member
2541          * of the netdissect_options structure.
2542          */
2543         ndo->ndo_snapend = sp + h->caplen;
2544
2545         if(print_info->ndo_type) {
2546                 hdrlen = (*print_info->p.ndo_printer)(print_info->ndo, h, sp);
2547         } else {
2548                 hdrlen = (*print_info->p.printer)(h, sp);
2549         }
2550
2551         /*
2552          * Restore the original snapend, as a printer might have
2553          * changed it.
2554          */
2555         ndo->ndo_snapend = sp + h->caplen;
2556         if (ndo->ndo_Xflag) {
2557                 /*
2558                  * Print the raw packet data in hex and ASCII.
2559                  */
2560                 if (ndo->ndo_Xflag > 1) {
2561                         /*
2562                          * Include the link-layer header.
2563                          */
2564                         hex_and_ascii_print(ndo, "\n\t", sp, h->caplen);
2565                 } else {
2566                         /*
2567                          * Don't include the link-layer header - and if
2568                          * we have nothing past the link-layer header,
2569                          * print nothing.
2570                          */
2571                         if (h->caplen > hdrlen)
2572                                 hex_and_ascii_print(ndo, "\n\t", sp + hdrlen,
2573                                     h->caplen - hdrlen);
2574                 }
2575         } else if (ndo->ndo_xflag) {
2576                 /*
2577                  * Print the raw packet data in hex.
2578                  */
2579                 if (ndo->ndo_xflag > 1) {
2580                         /*
2581                          * Include the link-layer header.
2582                          */
2583                         hex_print(ndo, "\n\t", sp, h->caplen);
2584                 } else {
2585                         /*
2586                          * Don't include the link-layer header - and if
2587                          * we have nothing past the link-layer header,
2588                          * print nothing.
2589                          */
2590                         if (h->caplen > hdrlen)
2591                                 hex_print(ndo, "\n\t", sp + hdrlen,
2592                                           h->caplen - hdrlen);
2593                 }
2594         } else if (ndo->ndo_Aflag) {
2595                 /*
2596                  * Print the raw packet data in ASCII.
2597                  */
2598                 if (ndo->ndo_Aflag > 1) {
2599                         /*
2600                          * Include the link-layer header.
2601                          */
2602                         ascii_print(ndo, sp, h->caplen);
2603                 } else {
2604                         /*
2605                          * Don't include the link-layer header - and if
2606                          * we have nothing past the link-layer header,
2607                          * print nothing.
2608                          */
2609                         if (h->caplen > hdrlen)
2610                                 ascii_print(ndo, sp + hdrlen, h->caplen - hdrlen);
2611                 }
2612         }
2613
2614         putchar('\n');
2615
2616         --infodelay;
2617         if (infoprint)
2618                 info(0);
2619 }
2620
2621 #ifdef WIN32
2622         /*
2623          * XXX - there should really be libpcap calls to get the version
2624          * number as a string (the string would be generated from #defines
2625          * at run time, so that it's not generated from string constants
2626          * in the library, as, on many UNIX systems, those constants would
2627          * be statically linked into the application executable image, and
2628          * would thus reflect the version of libpcap on the system on
2629          * which the application was *linked*, not the system on which it's
2630          * *running*.
2631          *
2632          * That routine should be documented, unlike the "version[]"
2633          * string, so that UNIX vendors providing their own libpcaps
2634          * don't omit it (as a couple of vendors have...).
2635          *
2636          * Packet.dll should perhaps also export a routine to return the
2637          * version number of the Packet.dll code, to supply the
2638          * "Wpcap_version" information on Windows.
2639          */
2640         char WDversion[]="current-git.tcpdump.org";
2641 #if !defined(HAVE_GENERATED_VERSION)
2642         char version[]="current-git.tcpdump.org";
2643 #endif
2644         char pcap_version[]="current-git.tcpdump.org";
2645         char Wpcap_version[]="3.1";
2646 #endif
2647
2648 /*
2649  * By default, print the specified data out in hex and ASCII.
2650  */
2651 static void
2652 ndo_default_print(netdissect_options *ndo, const u_char *bp, u_int length)
2653 {
2654         hex_and_ascii_print(ndo, "\n\t", bp, length); /* pass on lf and indentation string */
2655 }
2656
2657 void
2658 default_print(const u_char *bp, u_int length)
2659 {
2660         ndo_default_print(gndo, bp, length);
2661 }
2662
2663 #ifdef SIGNAL_REQ_INFO
2664 RETSIGTYPE requestinfo(int signo _U_)
2665 {
2666         if (infodelay)
2667                 ++infoprint;
2668         else
2669                 info(0);
2670 }
2671 #endif
2672
2673 /*
2674  * Called once each second in verbose mode while dumping to file
2675  */
2676 #ifdef USE_WIN32_MM_TIMER
2677 void CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
2678                                   DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
2679 {
2680         struct pcap_stat stat;
2681
2682         if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
2683                 fprintf(stderr, "Got %u\r", packets_captured);
2684 }
2685 #elif defined(HAVE_ALARM)
2686 static void verbose_stats_dump(int sig _U_)
2687 {
2688         struct pcap_stat stat;
2689
2690         if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
2691                 fprintf(stderr, "Got %u\r", packets_captured);
2692         alarm(1);
2693 }
2694 #endif
2695
2696 USES_APPLE_DEPRECATED_API
2697 static void
2698 print_version(void)
2699 {
2700         extern char version[];
2701 #ifndef HAVE_PCAP_LIB_VERSION
2702 #if defined(WIN32) || defined(HAVE_PCAP_VERSION)
2703         extern char pcap_version[];
2704 #else /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
2705         static char pcap_version[] = "unknown";
2706 #endif /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
2707 #endif /* HAVE_PCAP_LIB_VERSION */
2708
2709 #ifdef HAVE_PCAP_LIB_VERSION
2710 #ifdef WIN32
2711         (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
2712 #else /* WIN32 */
2713         (void)fprintf(stderr, "%s version %s\n", program_name, version);
2714 #endif /* WIN32 */
2715         (void)fprintf(stderr, "%s\n",pcap_lib_version());
2716 #else /* HAVE_PCAP_LIB_VERSION */
2717 #ifdef WIN32
2718         (void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
2719         (void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
2720 #else /* WIN32 */
2721         (void)fprintf(stderr, "%s version %s\n", program_name, version);
2722         (void)fprintf(stderr, "libpcap version %s\n", pcap_version);
2723 #endif /* WIN32 */
2724 #endif /* HAVE_PCAP_LIB_VERSION */
2725
2726 #if defined(HAVE_LIBCRYPTO) && defined(SSLEAY_VERSION)
2727         (void)fprintf (stderr, "%s\n", SSLeay_version(SSLEAY_VERSION));
2728 #endif
2729
2730 #ifdef USE_LIBSMI
2731         (void)fprintf (stderr, "SMI-library: %s\n", smi_version_string);
2732 #endif
2733 }
2734 USES_APPLE_RST
2735
2736 static void
2737 print_usage(void)
2738 {
2739         print_version();
2740         (void)fprintf(stderr,
2741 "Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ]\n", program_name);
2742         (void)fprintf(stderr,
2743 "\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
2744         (void)fprintf(stderr,
2745 "\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ] [ --number ]\n");
2746 #ifdef HAVE_PCAP_SETDIRECTION
2747         (void)fprintf(stderr,
2748 "\t\t[ -Q in|out|inout ]\n");
2749 #endif
2750         (void)fprintf(stderr,
2751 "\t\t[ -r file ] [ -s snaplen ] ");
2752 #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
2753         (void)fprintf(stderr, "[ --time-stamp-precision precision ]\n");
2754         (void)fprintf(stderr,
2755 "\t\t");
2756 #endif
2757 #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
2758         (void)fprintf(stderr, "[ --immediate-mode ] ");
2759 #endif
2760         (void)fprintf(stderr, "[ -T type ] [ --version ] [ -V file ]\n");
2761         (void)fprintf(stderr,
2762 "\t\t[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
2763         (void)fprintf(stderr,
2764 "\t\t[ -Z user ] [ expression ]\n");
2765 }
2766
2767
2768
2769 /* VARARGS */
2770 static void
2771 ndo_error(netdissect_options *ndo _U_, const char *fmt, ...)
2772 {
2773         va_list ap;
2774
2775         (void)fprintf(stderr, "%s: ", program_name);
2776         va_start(ap, fmt);
2777         (void)vfprintf(stderr, fmt, ap);
2778         va_end(ap);
2779         if (*fmt) {
2780                 fmt += strlen(fmt);
2781                 if (fmt[-1] != '\n')
2782                         (void)fputc('\n', stderr);
2783         }
2784         exit(1);
2785         /* NOTREACHED */
2786 }
2787
2788 /* VARARGS */
2789 static void
2790 ndo_warning(netdissect_options *ndo _U_, const char *fmt, ...)
2791 {
2792         va_list ap;
2793
2794         (void)fprintf(stderr, "%s: WARNING: ", program_name);
2795         va_start(ap, fmt);
2796         (void)vfprintf(stderr, fmt, ap);
2797         va_end(ap);
2798         if (*fmt) {
2799                 fmt += strlen(fmt);
2800                 if (fmt[-1] != '\n')
2801                         (void)fputc('\n', stderr);
2802         }
2803 }
2804 /*
2805  * Local Variables:
2806  * c-style: whitesmith
2807  * c-basic-offset: 8
2808  * End:
2809  */