12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Support for splitting captures into multiple files with a maximum
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * file size:
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 2001
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	Seth Webster <swebster@sst.ll.mit.edu>
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char copyright[] _U_ =
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000\n\
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectThe Regents of the University of California.  All rights reserved.\n";
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.283 2008-09-25 21:45:50 guy Exp $ (LBL)";
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * tcpdump - monitor tcp/ip traffic on an ethernet.
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * First written in 1987 by Van Jacobson, Lawrence Berkeley Laboratory.
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Mercilessly hacked and occasionally improved since then via the
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * combined efforts of Van, Steve McCanne and Craig Leres of LBL.
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "getopt.h"
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "w32_fzs.h"
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int strcasecmp (const char *__s1, const char *__s2);
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int SIZE_BUF;
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define off_t long
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define uint UINT
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SMI_H
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <smi.h>
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <signal.h>
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdlib.h>
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <limits.h>
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <sys/wait.h>
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <sys/resource.h>
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pwd.h>
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <grp.h>
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <errno.h>
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall/* capabilities convinience library */
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <cap-ng.h>
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_CAP_NG_H */
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "netdissect.h"
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "machdep.h"
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "setsignal.h"
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "gmt2local.h"
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "pcap-missing.h"
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef PATH_MAX
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define PATH_MAX 1024
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef SIGINFO
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SIGNAL_REQ_INFO SIGINFO
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#elif SIGUSR1
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define SIGNAL_REQ_INFO SIGUSR1
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnetdissect_options Gndo;
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnetdissect_options *gndo = &Gndo;
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int dflag;			/* print filter code */
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int Lflag;			/* list available data link types and exit */
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int Jflag;			/* list available time stamp types */
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SETDIRECTION
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrallint Pflag = -1;	/* Restrict captured packet by sent/receive direction */
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
11153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char *zflag = NULL;		/* compress each savefile using a specified command (like gzip or bzip2) */
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int infodelay;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int infoprint;
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar *program_name;
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint32_t thiszone;		/* seconds offset from gmt to local time */
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Forwards */
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic RETSIGTYPE cleanup(int);
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic RETSIGTYPE child_cleanup(int);
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void usage(void) __attribute__((noreturn));
12453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn));
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ndo_default_print(netdissect_options *, const u_char *, u_int);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void droproot(const char *, const char *);
13153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void ndo_error(netdissect_options *ndo, const char *fmt, ...)
13253f17a9db278d33517d9888dd77848f554522a38JP Abgrall     __attribute__ ((noreturn, format (printf, 2, 3)));
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef SIGNAL_REQ_INFO
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectRETSIGTYPE requestinfo(int);
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(USE_WIN32_MM_TIMER)
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  #include <MMsystem.h>
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static UINT timer_id;
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static void verbose_stats_dump(int sig);
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void info(int);
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int packets_captured;
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct printer {
15153f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if_printer f;
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct ndo_printer {
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if_ndo_printer f;
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int type;
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
16153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct printer printers[] = {
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ arcnet_if_print,	DLT_ARCNET },
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ARCNET_LINUX
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ token_if_print,	DLT_IEEE802 },
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LANE8023
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ lane_if_print,        DLT_LANE8023 },
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_CIP
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ cip_if_print,         DLT_CIP },
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ATM_CLIP
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ cip_if_print,		DLT_ATM_CLIP },
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sl_if_print,		DLT_SLIP },
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SLIP_BSDOS
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sl_bsdos_if_print,	DLT_SLIP_BSDOS },
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_if_print,		DLT_PPP },
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_WITHDIRECTION
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_if_print,		DLT_PPP_WITHDIRECTION },
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_BSDOS
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_bsdos_if_print,	DLT_PPP_BSDOS },
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fddi_if_print,	DLT_FDDI },
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ null_if_print,	DLT_NULL },
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LOOP
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ null_if_print,	DLT_LOOP },
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ raw_if_print,		DLT_RAW },
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ atm_if_print,		DLT_ATM_RFC1483 },
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_C_HDLC
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ chdlc_if_print,	DLT_C_HDLC },
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_HDLC
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ chdlc_if_print,	DLT_HDLC },
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_SERIAL
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ppp_hdlc_if_print,	DLT_PPP_SERIAL },
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_ETHER
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ pppoe_if_print,	DLT_PPP_ETHER },
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LINUX_SLL
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sll_if_print,		DLT_LINUX_SLL },
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IEEE802_11
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ieee802_11_if_print,	DLT_IEEE802_11},
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LTALK
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ltalk_if_print,	DLT_LTALK },
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ pflog_if_print,	DLT_PFLOG },
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_FR
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fr_if_print,		DLT_FR },
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_FRELAY
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fr_if_print,		DLT_FRELAY },
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SUNATM
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sunatm_if_print,	DLT_SUNATM },
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IP_OVER_FC
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ipfc_if_print,	DLT_IP_OVER_FC },
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PRISM_HEADER
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ prism_if_print,	DLT_PRISM_HEADER },
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IEEE802_11_RADIO
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ENC
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ enc_if_print,		DLT_ENC },
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SYMANTEC_FIREWALL
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ symantec_if_print,	DLT_SYMANTEC_FIREWALL },
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_APPLE_IP_OVER_IEEE1394
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IEEE802_11_RADIO_AVS
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ieee802_11_radio_avs_if_print,	DLT_IEEE802_11_RADIO_AVS },
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ATM1
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_atm1_print,	DLT_JUNIPER_ATM1 },
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ATM2
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_atm2_print,	DLT_JUNIPER_ATM2 },
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MFR
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mfr_print,	DLT_JUNIPER_MFR },
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MLFR
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mlfr_print,	DLT_JUNIPER_MLFR },
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MLPPP
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mlppp_print,	DLT_JUNIPER_MLPPP },
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPPOE
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_pppoe_print,	DLT_JUNIPER_PPPOE },
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPPOE_ATM
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_GGSN
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_ggsn_print,	DLT_JUNIPER_GGSN },
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ES
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_es_print,	DLT_JUNIPER_ES },
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MONITOR
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_monitor_print, DLT_JUNIPER_MONITOR },
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_SERVICES
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_services_print, DLT_JUNIPER_SERVICES },
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ETHER
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ juniper_ether_print,	DLT_JUNIPER_ETHER },
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPP
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ juniper_ppp_print,	DLT_JUNIPER_PPP },
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_FRELAY
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ juniper_frelay_print,	DLT_JUNIPER_FRELAY },
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_CHDLC
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ juniper_chdlc_print,	DLT_JUNIPER_CHDLC },
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_MFR
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ mfr_if_print,		DLT_MFR },
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(DLT_BLUETOOTH_HCI_H4_WITH_PHDR) && defined(HAVE_PCAP_BLUETOOTH_H)
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ bt_if_print,		DLT_BLUETOOTH_HCI_H4_WITH_PHDR},
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_USB_H
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_USB_LINUX
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ usb_linux_48_byte_print, DLT_USB_LINUX},
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* DLT_USB_LINUX */
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_USB_LINUX_MMAPPED
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ usb_linux_64_byte_print, DLT_USB_LINUX_MMAPPED},
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* DLT_USB_LINUX_MMAPPED */
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_PCAP_USB_H */
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IPV4
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ raw_if_print,		DLT_IPV4 },
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IPV6
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ raw_if_print,		DLT_IPV6 },
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,			0 },
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct ndo_printer ndo_printers[] = {
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ether_if_print,	DLT_EN10MB },
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IPNET
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ipnet_if_print,	DLT_IPNET },
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IEEE802_15_4
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_IEEE802_15_4_NOFCS
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ieee802_15_4_if_print, DLT_IEEE802_15_4_NOFCS },
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_PPI
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ ppi_if_print,		DLT_PPI },
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_NETANALYZER
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ netanalyzer_if_print, DLT_NETANALYZER },
33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
33453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef DLT_NETANALYZER_TRANSPARENT
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
33853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ nflog_if_print,	DLT_NFLOG},
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ NULL,			0 },
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
34253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrallif_printer
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_printer(int type)
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct printer *p;
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (p = printers; p->f; ++p)
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (type == p->type)
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return p->f;
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* NOTREACHED */
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrallif_ndo_printer
35753f17a9db278d33517d9888dd77848f554522a38JP Abgralllookup_ndo_printer(int type)
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
35953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct ndo_printer *p;
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	for (p = ndo_printers; p->f; ++p)
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (type == p->type)
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			return p->f;
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return NULL;
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* NOTREACHED */
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic pcap_t *pd;
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
37153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic int supports_monitor_mode;
37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int optind;
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int opterr;
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern char *optarg;
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct print_info {
37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        netdissect_options *ndo;
37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        union {
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if_printer     printer;
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if_ndo_printer ndo_printer;
38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } p;
38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall        int ndo_type;
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dump_info {
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char	*WFileName;
38853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	char	*CurrentFileName;
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_t	*pd;
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dumper_t *p;
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
39353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
39553f17a9db278d33517d9888dd77848f554522a38JP Abgrallshow_tstamp_types_and_exit(const char *device, pcap_t *pd)
39653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
39753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int n_tstamp_types;
39853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int *tstamp_types = 0;
39953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *tstamp_type_name;
40053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int i;
40153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	n_tstamp_types = pcap_list_tstamp_types(pd, &tstamp_types);
40353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (n_tstamp_types < 0)
40453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		error("%s", pcap_geterr(pd));
40553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
40653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (n_tstamp_types == 0) {
40753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		fprintf(stderr, "Time stamp type cannot be set for %s\n",
40853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    device);
40953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		exit(0);
41053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
41153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	fprintf(stderr, "Time stamp types for %s (use option -j to set):\n",
41253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    device);
41353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	for (i = 0; i < n_tstamp_types; i++) {
41453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		tstamp_type_name = pcap_tstamp_type_val_to_name(tstamp_types[i]);
41553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (tstamp_type_name != NULL) {
41653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void) fprintf(stderr, "  %s (%s)\n", tstamp_type_name,
41753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    pcap_tstamp_type_val_to_description(tstamp_types[i]));
41853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else {
41953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void) fprintf(stderr, "  %d\n", tstamp_types[i]);
42053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
42253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	pcap_free_tstamp_types(tstamp_types);
42353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	exit(0);
42453f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
42553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
42653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
42753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
42853f17a9db278d33517d9888dd77848f554522a38JP Abgrallshow_dlts_and_exit(const char *device, pcap_t *pd)
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int n_dlts;
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int *dlts = 0;
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *dlt_name;
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	n_dlts = pcap_list_datalinks(pd, &dlts);
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (n_dlts < 0)
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (n_dlts == 0 || !dlts)
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("No data link types.");
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
44053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
44153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * If the interface is known to support monitor mode, indicate
44253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * whether these are the data link types available when not in
44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * monitor mode, if -I wasn't specified, or when in monitor mode,
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * when -I was specified (the link-layer types available in
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * monitor mode might be different from the ones available when
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * not in monitor mode).
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (supports_monitor_mode)
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n",
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    device,
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    Iflag ? "when in monitor mode" : "when not in monitor mode");
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	else
45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(void) fprintf(stderr, "Data link types for %s (use option -y to set):\n",
45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    device);
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (--n_dlts >= 0) {
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name != NULL) {
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void) fprintf(stderr, "  %s (%s)", dlt_name,
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlts[n_dlts]));
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * OK, does tcpdump handle that type?
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
46553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (lookup_printer(dlts[n_dlts]) == NULL
46653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                            && lookup_ndo_printer(dlts[n_dlts]) == NULL)
46753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				(void) fprintf(stderr, " (printing not supported)");
46853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			fprintf(stderr, "\n");
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
47053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void) fprintf(stderr, "  DLT %d (printing not supported)\n",
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    dlts[n_dlts]);
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
47453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_FREE_DATALINKS
47553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	pcap_free_datalinks(dlts);
47653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(0);
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Set up flags that might or might not be supported depending on the
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * version of libpcap we're using.
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(HAVE_PCAP_CREATE) || defined(WIN32)
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG		"B:"
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG_USAGE	" [ -B size ]"
48753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG_USAGE
49053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
49153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
49253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_CREATE
49353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define I_FLAG		"I"
49453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else /* HAVE_PCAP_CREATE */
49553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define I_FLAG
49653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_PCAP_CREATE */
49753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
49853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
49953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define j_FLAG		"j:"
50053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define j_FLAG_USAGE	" [ -j tstamptype ]"
50153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define J_FLAG		"J"
50253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
50353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define j_FLAG
50453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define j_FLAG_USAGE
50553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define J_FLAG
50653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* PCAP_ERROR_TSTAMP_TYPE_NOTSUP */
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_PCAP_IF_T
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef HAVE_PCAP_FINDALLDEVS
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define D_FLAG	"D"
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define D_FLAG
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define U_FLAG	"U"
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define U_FLAG
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
52653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SETDIRECTION
52753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define P_FLAG "P:"
52853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define Q_FLAG "Q:"
52953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
53053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define P_FLAG
53153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define Q_FLAG
53253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
53353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Drop root privileges and chroot if necessary */
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdroproot(const char *username, const char *chroot_dir)
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct passwd *pw = NULL;
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (chroot_dir && !username) {
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "tcpdump: Chroot without dropping root is insecure\n");
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(1);
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pw = getpwnam(username);
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pw) {
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (chroot_dir) {
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				fprintf(stderr, "tcpdump: Couldn't chroot/chdir to '%.64s': %s\n",
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    chroot_dir, pcap_strerror(errno));
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				exit(1);
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
55553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
55653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG);
55753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ret < 0) {
55853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			printf("error : ret %d\n", ret);
55953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
56053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* We don't need CAP_SETUID and CAP_SETGID */
56153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_SETUID);
56253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_SETUID);
56353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		capng_update(CAPNG_DROP, CAPNG_PERMITTED, CAP_SETUID);
56453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		capng_update(CAPNG_DROP, CAPNG_PERMITTED, CAP_SETUID);
56553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		capng_apply(CAPNG_SELECT_BOTH);
56653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
56753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    username,
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (unsigned long)pw->pw_uid,
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (unsigned long)pw->pw_gid,
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_strerror(errno));
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			exit(1);
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
57753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_CAP_NG_H */
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "tcpdump: Couldn't find user '%.32s'\n",
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    username);
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(1);
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectgetWflagChars(int x)
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int c = 0;
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	x -= 1;
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (x > 0) {
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c += 1;
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		x /= 10;
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return c;
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectMakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
60553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        char *filename = malloc(PATH_MAX + 1);
60653f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (filename == NULL)
60753f17a9db278d33517d9888dd77848f554522a38JP Abgrall            error("Makefilename: malloc");
60853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
60953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* Process with strftime if Gflag is set. */
61053f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if (Gflag != 0) {
61153f17a9db278d33517d9888dd77848f554522a38JP Abgrall          struct tm *local_tm;
61253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
61353f17a9db278d33517d9888dd77848f554522a38JP Abgrall          /* Convert Gflag_time to a usable format */
61453f17a9db278d33517d9888dd77848f554522a38JP Abgrall          if ((local_tm = localtime(&Gflag_time)) == NULL) {
61553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                  error("MakeTimedFilename: localtime");
61653f17a9db278d33517d9888dd77848f554522a38JP Abgrall          }
61753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
61853f17a9db278d33517d9888dd77848f554522a38JP Abgrall          /* There's no good way to detect an error in strftime since a return
61953f17a9db278d33517d9888dd77848f554522a38JP Abgrall           * value of 0 isn't necessarily failure.
62053f17a9db278d33517d9888dd77848f554522a38JP Abgrall           */
62153f17a9db278d33517d9888dd77848f554522a38JP Abgrall          strftime(filename, PATH_MAX, orig_name, local_tm);
62253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
62353f17a9db278d33517d9888dd77848f554522a38JP Abgrall          strncpy(filename, orig_name, PATH_MAX);
62453f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
62553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cnt == 0 && max_chars == 0)
62753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		strncpy(buffer, filename, PATH_MAX + 1);
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
62953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (snprintf(buffer, PATH_MAX + 1, "%s%0*d", filename, max_chars, cnt) > PATH_MAX)
63053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                  /* Report an error if the filename is too large */
63153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                  error("too many output files or filename is too long (> %d)", PATH_MAX);
63253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        free(filename);
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int tcpdump_printf(netdissect_options *ndo _U_,
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  const char *fmt, ...)
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_list args;
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  int ret;
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_start(args, fmt);
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  ret=vfprintf(stdout, fmt, args);
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_end(args);
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  return ret;
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
64953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic struct print_info
65053f17a9db278d33517d9888dd77848f554522a38JP Abgrallget_print_info(int type)
65153f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
65253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	struct print_info printinfo;
65353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
65453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printinfo.ndo_type = 1;
65553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printinfo.ndo = gndo;
65653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	printinfo.p.ndo_printer = lookup_ndo_printer(type);
65753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (printinfo.p.ndo_printer == NULL) {
65853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printinfo.p.printer = lookup_printer(type);
65953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printinfo.ndo_type = 0;
66053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (printinfo.p.printer == NULL) {
66153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			gndo->ndo_dltname = pcap_datalink_val_to_name(type);
66253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (gndo->ndo_dltname != NULL)
66353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("packet printing is not supported for link type %s: use -w",
66453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				      gndo->ndo_dltname);
66553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
66653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("packet printing is not supported for link type %d: use -w", type);
66753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
66853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
66953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return (printinfo);
67053f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
67153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
67253f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic char *
67353f17a9db278d33517d9888dd77848f554522a38JP Abgrallget_next_file(FILE *VFile, char *ptr)
67453f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
67553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	char *ret;
67653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
67753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ret = fgets(ptr, PATH_MAX, VFile);
67853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (!ret)
67953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return NULL;
68053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
68153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ptr[strlen(ptr) - 1] == '\n')
68253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ptr[strlen(ptr) - 1] = '\0';
68353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
68453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return ret;
68553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
68653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmain(int argc, char **argv)
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int cnt, op, i;
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bpf_u_int32 localnet, netmask;
69253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	register char *cp, *infile, *cmdbuf, *device, *RFileName, *VFileName, *WFileName;
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_handler callback;
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
69553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int dlt;
69653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	int new_dlt;
69753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const char *dlt_name;
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct bpf_program fcode;
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	RETSIGTYPE (*oldhandler)(int);
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct print_info printinfo;
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dump_info dumpinfo;
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char *pcap_userdata;
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char ebuf[PCAP_ERRBUF_SIZE];
70653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	char VFileLine[PATH_MAX + 1];
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *username = NULL;
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *chroot_dir = NULL;
70953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	char *ret = NULL;
71053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	char *end;
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_if_t *devpointer;
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int devnum;
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int status;
71653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	FILE *VFile;
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(wsockinit() != 0) return 1;
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
72153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	jflag=-1;	/* not set */
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        gndo->ndo_Oflag=1;
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_Rflag=1;
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_dlt=-1;
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_default_print=ndo_default_print;
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_printf=tcpdump_printf;
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_error=ndo_error;
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_warning=ndo_warning;
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_snaplen = DEFAULT_SNAPLEN;
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cnt = -1;
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	device = NULL;
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	infile = NULL;
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	RFileName = NULL;
73553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	VFileName = NULL;
73653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	VFile = NULL;
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	WFileName = NULL;
73853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dlt = -1;
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((cp = strrchr(argv[0], '/')) != NULL)
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		program_name = cp + 1;
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		program_name = argv[0];
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", ebuf);
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef LIBSMI
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smiInit("tcpdump");
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (
75253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    (op = getopt(argc, argv, "aAb" B_FLAG "c:C:d" D_FLAG "eE:fF:G:hHi:" I_FLAG j_FLAG J_FLAG "KlLm:M:nNOp" P_FLAG "q" Q_FLAG "r:Rs:StT:u" U_FLAG "vV:w:W:xXy:Yz:Z:")) != -1)
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (op) {
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'a':
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* compatibility for old -a */
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'A':
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Aflag;
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
76353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'b':
76453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++bflag;
76553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
76653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
76753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(HAVE_PCAP_CREATE) || defined(WIN32)
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'B':
76953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			Bflag = atoi(optarg)*1024;
77053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (Bflag <= 0)
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid packet buffer size %s", optarg);
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
77353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'c':
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cnt = atoi(optarg);
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (cnt <= 0)
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid packet count %s", optarg);
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'C':
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Cflag = atoi(optarg) * 1000000;
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Cflag < 0)
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid file size %s", optarg);
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'd':
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++dflag;
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'D':
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pcap_findalldevs(&devpointer, ebuf) < 0)
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", ebuf);
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				for (i = 0; devpointer != 0; i++) {
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf("%d.%s", i+1, devpointer->name);
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					if (devpointer->description != NULL)
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf(" (%s)", devpointer->description);
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf("\n");
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					devpointer = devpointer->next;
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_FINDALLDEVS */
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'L':
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Lflag++;
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'e':
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++eflag;
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'E':
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_LIBCRYPTO
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("crypto code not compiled in");
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_espsecret = optarg;
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'f':
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++fflag;
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'F':
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			infile = optarg;
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
83053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'G':
83153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			Gflag = atoi(optarg);
83253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (Gflag < 0)
83353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("invalid number of seconds %s", optarg);
83453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        /* We will create one file initially. */
83653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        Gflag_count = 0;
83753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
83853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Grab the current time for rotation use. */
83953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if ((Gflag_time = time(NULL)) == (time_t)-1) {
84053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("main: can't get current time: %s",
84153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    pcap_strerror(errno));
84253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
84353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
84453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
84553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'h':
84653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			usage();
84753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
84853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
84953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'H':
85053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++Hflag;
85153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
85253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'i':
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg[0] == '0' && optarg[1] == 0)
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("Invalid adapter index");
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * If the argument is a number, treat it as
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * an index into the list of adapters, as
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * printed by "tcpdump -D".
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * This should be OK on UNIX systems, as interfaces
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * shouldn't have names that begin with digits.
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * It can be useful on Windows, where more than
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * one interface can have the same name.
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
86853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			devnum = strtol(optarg, &end, 10);
86953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (optarg != end && *end == '\0') {
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (devnum < 0)
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					error("Invalid adapter index");
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (pcap_findalldevs(&devpointer, ebuf) < 0)
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					error("%s", ebuf);
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else {
87653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					/*
87753f17a9db278d33517d9888dd77848f554522a38JP Abgrall					 * Look for the devnum-th entry
87853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					 * in the list of devices
87953f17a9db278d33517d9888dd77848f554522a38JP Abgrall					 * (1-based).
88053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					 */
88153f17a9db278d33517d9888dd77848f554522a38JP Abgrall					for (i = 0;
88253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					    i < devnum-1 && devpointer != NULL;
88353f17a9db278d33517d9888dd77848f554522a38JP Abgrall					    i++, devpointer = devpointer->next)
88453f17a9db278d33517d9888dd77848f554522a38JP Abgrall						;
88553f17a9db278d33517d9888dd77848f554522a38JP Abgrall					if (devpointer == NULL)
88653f17a9db278d33517d9888dd77848f554522a38JP Abgrall						error("Invalid adapter index");
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				device = devpointer->name;
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_FINDALLDEVS */
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			device = optarg;
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
89553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_CREATE
89653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'I':
89753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++Iflag;
89853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
89953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_PCAP_CREATE */
90053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
90153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
90253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'j':
90353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			jflag = pcap_tstamp_type_name_to_val(optarg);
90453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (jflag < 0)
90553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("invalid time stamp type %s", optarg);
90653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
90753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
90853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'J':
90953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			Jflag++;
91053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
91153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
91253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'l':
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * _IOLBF is the same as _IOFBF in Microsoft's C
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * libraries; the only alternative they offer
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * is _IONBF.
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * XXX - this should really be checking for MSVC++,
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * not WIN32, if, for example, MinGW has its own
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * C library that is more UNIX-compatible.
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setvbuf(stdout, NULL, _IONBF, 0);
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SETLINEBUF
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setlinebuf(stdout);
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setvbuf(stdout, NULL, _IOLBF, 0);
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
93453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'K':
93553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++Kflag;
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'm':
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef LIBSMI
94053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (smiLoadModule(optarg) == 0) {
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("could not load MIB module %s", optarg);
94253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sflag = 1;
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: ignoring option `-m %s' ",
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				      program_name, optarg);
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "(no libsmi support)\n");
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'M':
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* TCP-MD5 shared secret */
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_LIBCRYPTO
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("crypto code not compiled in");
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
95653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			sigsecret = optarg;
95753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
95853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
95953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'n':
96053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++nflag;
96153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
96253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
96353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'N':
96453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			++Nflag;
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'O':
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Oflag = 0;
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'p':
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++pflag;
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
97453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SETDIRECTION
97553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'P':
97653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			warning("don't use -P, use -Q; -P will be used for pcap-ng output in the future");
97753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* FALLTHROUGH */
97853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
97953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'Q':
98053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (strcasecmp(optarg, "in") == 0)
98153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				Pflag = PCAP_D_IN;
98253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "out") == 0)
98353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				Pflag = PCAP_D_OUT;
98453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "inout") == 0)
98553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				Pflag = PCAP_D_INOUT;
98653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
98753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("unknown capture direction `%s'", optarg);
98853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
98953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_PCAP_SETDIRECTION */
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'q':
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++qflag;
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'r':
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			RFileName = optarg;
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'R':
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Rflag = 0;
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
100353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 's':
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snaplen = strtol(optarg, &end, 0);
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg == end || *end != '\0'
100653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    || snaplen < 0 || snaplen > MAXIMUM_SNAPLEN)
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid snaplen %s", optarg);
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (snaplen == 0)
100953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				snaplen = MAXIMUM_SNAPLEN;
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'S':
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Sflag;
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 't':
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++tflag;
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'T':
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (strcasecmp(optarg, "vat") == 0)
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_VAT;
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "wb") == 0)
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_WB;
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rpc") == 0)
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RPC;
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rtp") == 0)
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RTP;
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rtcp") == 0)
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RTCP;
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "snmp") == 0)
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_SNMP;
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "cnfp") == 0)
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_CNFP;
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "tftp") == 0)
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_TFTP;
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "aodv") == 0)
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_AODV;
103953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "carp") == 0)
104053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_CARP;
104153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "radius") == 0)
104253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_RADIUS;
104353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "zmtp1") == 0)
104453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_ZMTP1;
104553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "vxlan") == 0)
104653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_VXLAN;
104753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "pgm") == 0)
104853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_PGM;
104953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "pgm_zmtp1") == 0)
105053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_PGM_ZMTP1;
105153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (strcasecmp(optarg, "lmp") == 0)
105253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				packettype = PT_LMP;
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("unknown packet type `%s'", optarg);
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'u':
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++uflag;
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'U':
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Uflag;
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'v':
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++vflag;
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
107153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'V':
107253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			VFileName = optarg;
107353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
107453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'w':
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			WFileName = optarg;
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'W':
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Wflag = atoi(optarg);
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Wflag < 0)
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid number of output files %s", optarg);
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			WflagChars = getWflagChars(Wflag);
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'x':
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++xflag;
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'X':
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Xflag;
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'y':
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_dltname = optarg;
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_dlt =
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  pcap_datalink_name_to_val(gndo->ndo_dltname);
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (gndo->ndo_dlt < 0)
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid data link type %s", gndo->ndo_dltname);
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'Y':
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			{
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Undocumented flag */
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DEBUG
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			extern int pcap_debug;
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_debug = 1;
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			extern int yydebug;
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			yydebug = 1;
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
111853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case 'z':
111953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (optarg) {
112053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				zflag = strdup(optarg);
112153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			} else {
112253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				usage();
112353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				/* NOTREACHED */
112453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
112553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
112653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'Z':
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg) {
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				username = strdup(optarg);
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				usage();
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* NOTREACHED */
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			usage();
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* NOTREACHED */
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (tflag) {
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0: /* Default */
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4: /* Default + Date*/
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		thiszone = gmt2local(0);
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1: /* No time stamp */
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2: /* Unix timeval style */
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3: /* Microseconds since previous packet */
115253f17a9db278d33517d9888dd77848f554522a38JP Abgrall        case 5: /* Microseconds since first packet */
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default: /* Not supported */
115653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		error("only -t, -tt, -ttt, -tttt and -ttttt are supported");
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
116053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (fflag != 0 && (VFileName != NULL || RFileName != NULL))
116153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		error("-f can not be used with -V or -r");
116253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
116353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (VFileName != NULL && RFileName != NULL)
116453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		error("-V and -r are mutually exclusive.");
116553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WITH_CHROOT
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* if run as root, prepare for chrooting */
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (getuid() == 0 || geteuid() == 0) {
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* future extensibility for cmd-line arguments */
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!chroot_dir)
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			chroot_dir = WITH_CHROOT;
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WITH_USER
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* if run as root, prepare for dropping root privileges */
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (getuid() == 0 || geteuid() == 0) {
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Run with '-Z root' to restore old behaviour */
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!username)
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			username = WITH_USER;
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
118453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (RFileName != NULL || VFileName != NULL) {
118553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
118653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * If RFileName is non-null, it's the pathname of a
118753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * savefile to read.  If VFileName is non-null, it's
118853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * the pathname of a file containing a list of pathnames
118953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * (one per line) of savefiles to read.
119053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 *
119153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * In either case, we're reading a savefile, not doing
119253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * a live capture.
119353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We don't need network access, so relinquish any set-UID
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * or set-GID privileges we have (if any).
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We do *not* want set-UID privileges when opening a
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * trace file, as that might let the user read other
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * people's trace files (especially if we're set-UID
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * root).
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "Warning: setgid/setuid failed !\n");
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
120753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (VFileName != NULL) {
120853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (VFileName[0] == '-' && VFileName[1] == '\0')
120953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				VFile = stdin;
121053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
121153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				VFile = fopen(VFileName, "r");
121253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
121353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (VFile == NULL)
121453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("Unable to open file: %s\n", strerror(errno));
121553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
121653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ret = get_next_file(VFile, VFileLine);
121753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (!ret)
121853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("Nothing in %s\n", VFileName);
121953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			RFileName = VFileLine;
122053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
122153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pd = pcap_open_offline(RFileName, ebuf);
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pd == NULL)
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", ebuf);
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt = pcap_datalink(pd);
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlt);
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name == NULL) {
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "reading from file %s, link-type %u\n",
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    RFileName, dlt);
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr,
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    "reading from file %s, link-type %s (%s)\n",
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    RFileName, dlt_name,
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlt));
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		localnet = 0;
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		netmask = 0;
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
123953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
124053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * We're doing a live capture.
124153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (device == NULL) {
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			device = pcap_lookupdev(ebuf);
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (device == NULL)
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", ebuf);
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
124853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
124953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * Print a message to the standard error on Windows.
125053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * XXX - why do it here, with a different message?
125153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
125253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(strlen(device) == 1)	/* we assume that an ASCII string is always longer than 1 char */
125353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		{						/* a Unicode string has a \0 as second byte (so strlen() is 1) */
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "%s: listening on %ws\n", program_name, device);
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "%s: listening on %s\n", program_name, device);
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fflush(stderr);
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
126353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_CREATE
126453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		pd = pcap_create(device, ebuf);
126553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (pd == NULL)
126653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("%s", ebuf);
126753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
126853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Jflag)
126953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			show_tstamp_types_and_exit(device, pd);
127053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
127153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
127253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * Is this an interface that supports monitor mode?
127353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
127453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (pcap_can_set_rfmon(pd) == 1)
127553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			supports_monitor_mode = 1;
127653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
127753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			supports_monitor_mode = 0;
127853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		status = pcap_set_snaplen(pd, snaplen);
127953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (status != 0)
128053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("%s: Can't set snapshot length: %s",
128153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    device, pcap_statustostr(status));
128253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		status = pcap_set_promisc(pd, !pflag);
128353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (status != 0)
128453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("%s: Can't set promiscuous mode: %s",
128553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    device, pcap_statustostr(status));
128653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Iflag) {
128753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			status = pcap_set_rfmon(pd, 1);
128853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status != 0)
128953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: Can't set monitor mode: %s",
129053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    device, pcap_statustostr(status));
129153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
129253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		status = pcap_set_timeout(pd, 1000);
129353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (status != 0)
129453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("%s: pcap_set_timeout failed: %s",
129553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    device, pcap_statustostr(status));
129653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Bflag != 0) {
129753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			status = pcap_set_buffer_size(pd, Bflag);
129853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status != 0)
129953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: Can't set buffer size: %s",
130053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    device, pcap_statustostr(status));
130153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
130253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
130353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (jflag != -1) {
130453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			status = pcap_set_tstamp_type(pd, jflag);
130553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status < 0)
130653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: Can't set time stamp type: %s",
130753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    	    device, pcap_statustostr(status));
130853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
130953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
131053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		status = pcap_activate(pd);
131153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (status < 0) {
131253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
131353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * pcap_activate() failed.
131453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
131553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = pcap_geterr(pd);
131653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status == PCAP_ERROR)
131753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s", cp);
131853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if ((status == PCAP_ERROR_NO_SUCH_DEVICE ||
131953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			          status == PCAP_ERROR_PERM_DENIED) &&
132053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			         *cp != '\0')
132153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: %s\n(%s)", device,
132253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    pcap_statustostr(status), cp);
132353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
132453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: %s", device,
132553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    pcap_statustostr(status));
132653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		} else if (status > 0) {
132753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
132853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * pcap_activate() succeeded, but it's warning us
132953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * of a problem it had.
133053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
133153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			cp = pcap_geterr(pd);
133253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status == PCAP_WARNING)
133353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				warning("%s", cp);
133453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else if (status == PCAP_WARNING_PROMISC_NOTSUP &&
133553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			         *cp != '\0')
133653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				warning("%s: %s\n(%s)", device,
133753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    pcap_statustostr(status), cp);
133853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
133953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				warning("%s: %s", device,
134053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    pcap_statustostr(status));
134153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
134253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SETDIRECTION
134353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Pflag != -1) {
134453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			status = pcap_setdirection(pd, Pflag);
134553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status != 0)
134653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s: pcap_setdirection() failed: %s",
134753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				      device,  pcap_geterr(pd));
134853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
134953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
135053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*ebuf = '\0';
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pd == NULL)
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", ebuf);
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (*ebuf)
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("%s", ebuf);
135753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_PCAP_CREATE */
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Let user own process after socket has been opened.
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "Warning: setgid/setuid failed !\n");
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
136553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if !defined(HAVE_PCAP_CREATE) && defined(WIN32)
136653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if(Bflag != 0)
136753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if(pcap_setbuff(pd, Bflag)==-1){
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", pcap_geterr(pd));
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
137053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Lflag)
137253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			show_dlts_and_exit(device, pd);
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (gndo->ndo_dlt >= 0) {
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_SET_DATALINK
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", pcap_geterr(pd));
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * We don't actually support changing the
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * data link type, so we only let them
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * set it to what it already is.
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (gndo->ndo_dlt != pcap_datalink(pd)) {
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s is not one of the DLTs supported by this device\n",
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				      gndo->ndo_dltname);
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: data link type %s\n",
138953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				      program_name, gndo->ndo_dltname);
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fflush(stderr);
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = pcap_snapshot(pd);
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (snaplen < i) {
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("snaplen raised from %d to %d", snaplen, i);
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snaplen = i;
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			localnet = 0;
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			netmask = 0;
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("%s", ebuf);
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infile)
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cmdbuf = read_infile(infile);
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cmdbuf = copy_argv(&argv[optind]);
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dflag) {
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bpf_dump(&fcode, dflag);
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_close(pd);
141353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		free(cmdbuf);
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(0);
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	init_addrtoname(localnet, netmask);
141753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        init_checksum();
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGPIPE, cleanup);
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGTERM, cleanup);
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGINT, cleanup);
142353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* WIN32 */
142453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(HAVE_FORK) || defined(HAVE_VFORK)
142553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)setsignal(SIGCHLD, child_cleanup);
142653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Cooperate with nohup(1) */
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)setsignal(SIGHUP, oldhandler);
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
143353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifndef WIN32
143453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
143553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * If a user name was specified with "-Z", attempt to switch to
143653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * that user's UID.  This would probably be used with sudo,
143753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * to allow tcpdump to be run in a special restricted
143853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * account (if you just want to allow users to open capture
143953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * devices, and can't just give users that permission,
144053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * you'd make tcpdump set-UID or set-GID).
144153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 *
144253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Tcpdump doesn't necessarily write only to one savefile;
144353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * the general only way to allow a -Z instance to write to
144453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * savefiles as the user under whose UID it's run, rather
144553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * than as the user specified with -Z, would thus be to switch
144653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * to the original user ID before opening a capture file and
144753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * then switch back to the -Z user ID after opening the savefile.
144853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Switching to the -Z user ID only after opening the first
144953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * savefile doesn't handle the general case.
145053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
145153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
145253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
145353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/* We are running as root and we will be writing to savefile */
145453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if ((getuid() == 0 || geteuid() == 0) && WFileName) {
145553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (username) {
145653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Drop all capabilities from effective set */
145753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_clear(CAPNG_EFFECTIVE);
145853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Add capabilities we will need*/
145953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_SETUID);
146053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_SETGID);
146153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_PERMITTED, CAP_DAC_OVERRIDE);
146253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
146353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_SETUID);
146453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_SETGID);
146553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
146653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
146753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_apply(CAPNG_SELECT_BOTH);
146853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
146953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
147053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_CAP_NG_H */
147153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (getuid() == 0 || geteuid() == 0) {
147353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (username || chroot_dir)
147453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			droproot(username, chroot_dir);
147553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
147653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
147753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* WIN32 */
147853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_setfilter(pd, &fcode) < 0)
14802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
14812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (WFileName) {
14822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dumper_t *p;
148353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* Do not exceed the default PATH_MAX for files. */
148453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dumpinfo.CurrentFileName = (char *)malloc(PATH_MAX + 1);
148553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
148653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (dumpinfo.CurrentFileName == NULL)
148753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("malloc of dumpinfo.CurrentFileName");
148853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
148953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* We do not need numbering for dumpfiles if Cflag isn't set. */
149053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Cflag != 0)
149153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars);
149253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
149353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		  MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0);
14942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
149553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		p = pcap_dump_open(pd, dumpinfo.CurrentFileName);
149653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
149753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        /* Give up capabilities, clear Effective set */
149853f17a9db278d33517d9888dd77848f554522a38JP Abgrall        capng_clear(CAPNG_EFFECTIVE);
149953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
15002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (p == NULL)
15012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", pcap_geterr(pd));
150253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Cflag != 0 || Gflag != 0) {
15032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			callback = dump_packet_and_trunc;
15042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.WFileName = WFileName;
15052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.pd = pd;
15062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.p = p;
15072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_userdata = (u_char *)&dumpinfo;
15082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
15092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			callback = dump_packet;
15102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_userdata = (u_char *)p;
15112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
151253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_DUMP_FLUSH
151353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (Uflag)
151453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			pcap_dump_flush(p);
151553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
15162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
15172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		type = pcap_datalink(pd);
151853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		printinfo = get_print_info(type);
15192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		callback = print_packet;
15202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_userdata = (u_char *)&printinfo;
15212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
152253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
152353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef SIGNAL_REQ_INFO
15242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
152553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * We can't get statistics when reading from a file rather
152653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * than capturing from a device.
15272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
152853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (RFileName == NULL)
152953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(void)setsignal(SIGNAL_REQ_INFO, requestinfo);
15302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
15312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 0 && WFileName) {
15332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
15342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * When capturing to a file, "-v" means tcpdump should,
15352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * every 10 secodns, "v"erbosely report the number of
15362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * packets captured.
15372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
15382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
15392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* call verbose_stats_dump() each 1000 +/-100msec */
15402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
15412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		setvbuf(stderr, NULL, _IONBF, 0);
15422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
15432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)setsignal(SIGALRM, verbose_stats_dump);
15442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		alarm(1);
15452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
15462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
15482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
15492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (RFileName == NULL) {
155053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
155153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * Live capture (if -V was specified, we set RFileName
155253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * to a file from the -V file).  Print a message to
155353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * the standard error on UN*X.
155453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
15552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!vflag && !WFileName) {
15562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr,
15572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
15582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    program_name);
15592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
15602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: ", program_name);
15612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt = pcap_datalink(pd);
15622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlt);
15632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name == NULL) {
15642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n",
15652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    device, dlt, snaplen);
15662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
15672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n",
15682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    device, dlt_name,
15692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlt), snaplen);
15702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
15712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fflush(stderr);
15722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
15732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
157453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	do {
157553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		status = pcap_loop(pd, cnt, callback, pcap_userdata);
157653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (WFileName == NULL) {
15772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
157853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * We're printing packets.  Flush the printed output,
157953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * so it doesn't get intermingled with error output.
15802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
158153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (status == -2) {
158253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				/*
158353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 * We got interrupted, so perhaps we didn't
158453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 * manage to finish a line we were printing.
158553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 * Print an extra newline, just in case.
158653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				 */
158753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				putchar('\n');
158853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
158953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void)fflush(stdout);
159053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
159153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                if (status == -2) {
159253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
159353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * We got interrupted. If we are reading multiple
159453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * files (via -V) set these so that we stop.
159553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
159653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			VFileName = NULL;
159753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ret = NULL;
159853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
159953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (status == -1) {
160053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
160153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * Error.  Report it.
160253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
160353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			(void)fprintf(stderr, "%s: pcap_loop: %s\n",
160453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    program_name, pcap_geterr(pd));
160553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
160653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (RFileName == NULL) {
160753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
160853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * We're doing a live capture.  Report the capture
160953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * statistics.
161053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
161153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			info(1);
161253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
161353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		pcap_close(pd);
161453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (VFileName != NULL) {
161553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ret = get_next_file(VFile, VFileLine);
161653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (ret) {
161753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				RFileName = VFileLine;
161853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				pd = pcap_open_offline(RFileName, ebuf);
161953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (pd == NULL)
162053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					error("%s", ebuf);
162153f17a9db278d33517d9888dd77848f554522a38JP Abgrall				new_dlt = pcap_datalink(pd);
162253f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (WFileName && new_dlt != dlt)
162353f17a9db278d33517d9888dd77848f554522a38JP Abgrall					error("%s: new dlt does not match original", RFileName);
162453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				printinfo = get_print_info(new_dlt);
162553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				dlt_name = pcap_datalink_val_to_name(new_dlt);
162653f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (dlt_name == NULL) {
162753f17a9db278d33517d9888dd77848f554522a38JP Abgrall					fprintf(stderr, "reading from file %s, link-type %u\n",
162853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					RFileName, new_dlt);
162953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				} else {
163053f17a9db278d33517d9888dd77848f554522a38JP Abgrall					fprintf(stderr,
163153f17a9db278d33517d9888dd77848f554522a38JP Abgrall					"reading from file %s, link-type %s (%s)\n",
163253f17a9db278d33517d9888dd77848f554522a38JP Abgrall					RFileName, dlt_name,
163353f17a9db278d33517d9888dd77848f554522a38JP Abgrall					pcap_datalink_val_to_description(new_dlt));
163453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				}
163553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
163653f17a9db278d33517d9888dd77848f554522a38JP Abgrall					error("%s", pcap_geterr(pd));
163753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				if (pcap_setfilter(pd, &fcode) < 0)
163853f17a9db278d33517d9888dd77848f554522a38JP Abgrall					error("%s", pcap_geterr(pd));
163953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
16402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
16412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
164253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	while (ret != NULL);
164353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
164453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	free(cmdbuf);
16452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(status == -1 ? 1 : 0);
16462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
16472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* make a clean exit on interrupts */
16492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic RETSIGTYPE
16502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcleanup(int signo _U_)
16512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
16522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
16532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (timer_id)
16542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		timeKillEvent(timer_id);
16552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	timer_id = 0;
16562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
16572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	alarm(0);
16582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
16602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_BREAKLOOP
16612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
16622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * We have "pcap_breakloop()"; use it, so that we do as little
16632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * as possible in the signal handler (it's probably not safe
16642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * to do anything with standard I/O streams in a signal handler -
16652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the ANSI C standard doesn't say it is).
16662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
16672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_breakloop(pd);
16682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
16692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
16702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * We don't have "pcap_breakloop()"; this isn't safe, but
16712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * it's the best we can do.  Print the summary if we're
16722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * not reading from a savefile - i.e., if we're doing a
16732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * live capture - and exit.
16742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
16752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pd != NULL && pcap_file(pd) == NULL) {
16762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
16772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We got interrupted, so perhaps we didn't
16782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * manage to finish a line we were printing.
16792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print an extra newline, just in case.
16802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
16812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar('\n');
16822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fflush(stdout);
16832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(1);
16842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
16852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(0);
16862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
16872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
16882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
168953f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
169053f17a9db278d33517d9888dd77848f554522a38JP Abgrall  On windows, we do not use a fork, so we do not care less about
169153f17a9db278d33517d9888dd77848f554522a38JP Abgrall  waiting a child processes to die
169253f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
169353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(HAVE_FORK) || defined(HAVE_VFORK)
169453f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic RETSIGTYPE
169553f17a9db278d33517d9888dd77848f554522a38JP Abgrallchild_cleanup(int signo _U_)
169653f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
169753f17a9db278d33517d9888dd77848f554522a38JP Abgrall  wait(NULL);
169853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
169953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_FORK && HAVE_VFORK */
170053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
17022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinfo(register int verbose)
17032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
17042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
17052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
170653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
170753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Older versions of libpcap didn't set ps_ifdrop on some
170853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * platforms; initialize it to 0 to handle that.
170953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
171053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	stat.ps_ifdrop = 0;
17112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_stats(pd, &stat) < 0) {
17122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
171353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		infoprint = 0;
17142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
17152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
17162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
17182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "%s: ", program_name);
17192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
172053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)fprintf(stderr, "%u packet%s captured", packets_captured,
172153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    PLURAL_SUFFIX(packets_captured));
17222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
17232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(", ", stderr);
17242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
17252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putc('\n', stderr);
172653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)fprintf(stderr, "%u packet%s received by filter", stat.ps_recv,
172753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    PLURAL_SUFFIX(stat.ps_recv));
17282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
17292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(", ", stderr);
17302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
17312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putc('\n', stderr);
173253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)fprintf(stderr, "%u packet%s dropped by kernel", stat.ps_drop,
173353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    PLURAL_SUFFIX(stat.ps_drop));
173453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (stat.ps_ifdrop != 0) {
173553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (!verbose)
173653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			fputs(", ", stderr);
173753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		else
173853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			putc('\n', stderr);
173953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		(void)fprintf(stderr, "%u packet%s dropped by interface\n",
174053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    stat.ps_ifdrop, PLURAL_SUFFIX(stat.ps_ifdrop));
174153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else
174253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		putc('\n', stderr);
17432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	infoprint = 0;
17442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
17452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
174653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#if defined(HAVE_FORK) || defined(HAVE_VFORK)
174753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
174853f17a9db278d33517d9888dd77848f554522a38JP Abgrallcompress_savefile(const char *filename)
174953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
175053f17a9db278d33517d9888dd77848f554522a38JP Abgrall# ifdef HAVE_FORK
175153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (fork())
175253f17a9db278d33517d9888dd77848f554522a38JP Abgrall# else
175353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (vfork())
175453f17a9db278d33517d9888dd77848f554522a38JP Abgrall# endif
175553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		return;
175653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
175753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * Set to lowest priority so that this doesn't disturb the capture
175853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
175953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef NZERO
176053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	setpriority(PRIO_PROCESS, 0, NZERO - 1);
176153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else
176253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	setpriority(PRIO_PROCESS, 0, 19);
176353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
176453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (execlp(zflag, zflag, filename, (char *)NULL) == -1)
176553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		fprintf(stderr,
176653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			"compress_savefile:execlp(%s, %s): %s\n",
176753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			zflag,
176853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			filename,
176953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			strerror(errno));
177053f17a9db278d33517d9888dd77848f554522a38JP Abgrall# ifdef HAVE_FORK
177153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	exit(1);
177253f17a9db278d33517d9888dd77848f554522a38JP Abgrall# else
177353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	_exit(1);
177453f17a9db278d33517d9888dd77848f554522a38JP Abgrall# endif
177553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
177653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#else  /* HAVE_FORK && HAVE_VFORK */
177753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
177853f17a9db278d33517d9888dd77848f554522a38JP Abgrallcompress_savefile(const char *filename)
177953f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
178053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	fprintf(stderr,
178153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		"compress_savefile failed. Functionality not implemented under your system\n");
178253f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
178353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_FORK && HAVE_VFORK */
178453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
17862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
17872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
17882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dump_info *dump_info;
17892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
17912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
17932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dump_info = (struct dump_info *)user;
17952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
17962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
179753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * XXX - this won't force the file to rotate on the specified time
179853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * boundary, but it will rotate on the first packet received after the
179953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * specified Gflag number of seconds. Note: if a Gflag time boundary
180053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * and a Cflag size boundary coincide, the time rotation will occur
180153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * first thereby cancelling the Cflag boundary (since the file should
180253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 * be 0).
180353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	 */
180453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (Gflag != 0) {
180553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* Check if it is time to rotate */
180653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		time_t t;
180753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
180853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* Get the current time */
180953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if ((t = time(NULL)) == (time_t)-1) {
181053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			error("dump_and_trunc_packet: can't get current_time: %s",
181153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    pcap_strerror(errno));
181253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
181353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
181453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
181553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/* If the time is greater than the specified window, rotate */
181653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (t - Gflag_time >= Gflag) {
181753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Update the Gflag_time */
181853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			Gflag_time = t;
181953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Update Gflag_count */
182053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			Gflag_count++;
182153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
182253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * Close the current file and open a new one.
182353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
182453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			pcap_dump_close(dump_info->p);
182553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
182653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
182753f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * Compress the file we just closed, if the user asked for it
182853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
182953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (zflag != NULL)
183053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				compress_savefile(dump_info->CurrentFileName);
183153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
183253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
183353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * Check to see if we've exceeded the Wflag (when
183453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * not using Cflag).
183553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
183653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) {
183753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				(void)fprintf(stderr, "Maximum file limit reached: %d\n",
183853f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    Wflag);
183953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				exit(0);
184053f17a9db278d33517d9888dd77848f554522a38JP Abgrall				/* NOTREACHED */
184153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			}
184253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (dump_info->CurrentFileName != NULL)
184353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				free(dump_info->CurrentFileName);
184453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/* Allocate space for max filename + \0. */
184553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
184653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (dump_info->CurrentFileName == NULL)
184753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("dump_packet_and_trunc: malloc");
184853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			/*
184953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * This is always the first file in the Cflag
185053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * rotation: e.g. 0
185153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 * We also don't need numbering if Cflag is not set.
185253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			 */
185353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (Cflag != 0)
185453f17a9db278d33517d9888dd77848f554522a38JP Abgrall				MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0,
185553f17a9db278d33517d9888dd77848f554522a38JP Abgrall				    WflagChars);
185653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			else
185753f17a9db278d33517d9888dd77848f554522a38JP Abgrall				MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0);
185853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
185953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
186053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
186153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_apply(CAPNG_EFFECTIVE);
186253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_CAP_NG_H */
186353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
186453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CAP_NG_H
186553f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_update(CAPNG_DROP, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE);
186653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			capng_apply(CAPNG_EFFECTIVE);
186753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif /* HAVE_CAP_NG_H */
186853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			if (dump_info->p == NULL)
186953f17a9db278d33517d9888dd77848f554522a38JP Abgrall				error("%s", pcap_geterr(pd));
187053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
187153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
187253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
187353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	/*
18742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * XXX - this won't prevent capture files from getting
18752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * larger than Cflag - the last packet written to the
18762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * file could put it over Cflag.
18772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
187853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (Cflag != 0 && pcap_dump_ftell(dump_info->p) > Cflag) {
18792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
18802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Close the current file and open a new one.
18812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
18822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_close(dump_info->p);
188353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
188453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		/*
188553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 * Compress the file we just closed, if the user asked for it
188653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		 */
188753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (zflag != NULL)
188853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			compress_savefile(dump_info->CurrentFileName);
188953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
18902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		Cflag_count++;
18912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Wflag > 0) {
18922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Cflag_count >= Wflag)
18932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				Cflag_count = 0;
18942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
189553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (dump_info->CurrentFileName != NULL)
189653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			free(dump_info->CurrentFileName);
189753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1);
189853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (dump_info->CurrentFileName == NULL)
18992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("dump_packet_and_trunc: malloc");
190053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars);
190153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dump_info->p = pcap_dump_open(dump_info->pd, dump_info->CurrentFileName);
19022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dump_info->p == NULL)
19032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", pcap_geterr(pd));
19042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
19052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dump((u_char *)dump_info->p, h, sp);
19072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
19082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Uflag)
19092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_flush(dump_info->p);
19102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
19112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
19132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
19142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
19152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
19162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
19182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
19192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
19202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
19212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
19232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dump(user, h, sp);
19252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
19262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Uflag)
19272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_flush((pcap_dumper_t *)user);
19282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
19292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
19312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
19322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
19332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
19342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
19362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
19372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
19382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct print_info *print_info;
19392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int hdrlen;
19402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
19422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
19442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ts_print(&h->ts);
19452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_info = (struct print_info *)user;
19472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
19482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
19492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Some printers want to check that they're not walking off the
19502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * end of the packet.
19512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Rather than pass it all the way down, we set this global.
19522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
19532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	snapend = sp + h->caplen;
19542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
195553f17a9db278d33517d9888dd77848f554522a38JP Abgrall        if(print_info->ndo_type) {
195653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                hdrlen = (*print_info->p.ndo_printer)(print_info->ndo, h, sp);
195753f17a9db278d33517d9888dd77848f554522a38JP Abgrall        } else {
195853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                hdrlen = (*print_info->p.printer)(h, sp);
195953f17a9db278d33517d9888dd77848f554522a38JP Abgrall        }
196053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
19612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Xflag) {
19622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
19632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in hex and ASCII.
19642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
19652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Xflag > 1) {
19662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
19672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
19682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
19692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			hex_and_ascii_print("\n\t", sp, h->caplen);
19702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
19712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
19722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
19732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
19742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
19752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
19762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
19772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				hex_and_ascii_print("\n\t", sp + hdrlen,
19782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    h->caplen - hdrlen);
19792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
19802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (xflag) {
19812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
19822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in hex.
19832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
19842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (xflag > 1) {
19852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
19862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
19872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
19882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			hex_print("\n\t", sp, h->caplen);
19892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
19902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
19912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
19922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
19932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
19942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
19952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
19962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				hex_print("\n\t", sp + hdrlen,
19972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    h->caplen - hdrlen);
19982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
19992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (Aflag) {
20002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
20012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in ASCII.
20022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
20032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Aflag > 1) {
20042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
20052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
20062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
20072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ascii_print(sp, h->caplen);
20082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
20092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
20102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
20112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
20122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
20132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
20142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
20152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ascii_print(sp + hdrlen, h->caplen - hdrlen);
20162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
20172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
20182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar('\n');
20202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
20222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
20232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
20242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
20272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
20282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * XXX - there should really be libpcap calls to get the version
20292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * number as a string (the string would be generated from #defines
20302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * at run time, so that it's not generated from string constants
20312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * in the library, as, on many UNIX systems, those constants would
20322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * be statically linked into the application executable image, and
20332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * would thus reflect the version of libpcap on the system on
20342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * which the application was *linked*, not the system on which it's
20352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * *running*.
20362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *
20372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * That routine should be documented, unlike the "version[]"
20382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * string, so that UNIX vendors providing their own libpcaps
20392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * don't omit it (as a couple of vendors have...).
20402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *
20412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Packet.dll should perhaps also export a routine to return the
20422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * version number of the Packet.dll code, to supply the
20432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * "Wpcap_version" information on Windows.
20442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
20452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char WDversion[]="current-cvs.tcpdump.org";
20462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if !defined(HAVE_GENERATED_VERSION)
20472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char version[]="current-cvs.tcpdump.org";
20482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
20492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char pcap_version[]="current-cvs.tcpdump.org";
20502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char Wpcap_version[]="3.1";
20512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
20522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
20542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * By default, print the specified data out in hex and ASCII.
20552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
20562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
20572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_default_print(netdissect_options *ndo _U_, const u_char *bp, u_int length)
20582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_and_ascii_print("\n\t", bp, length); /* pass on lf and identation string */
20602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
20632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdefault_print(const u_char *bp, u_int length)
20642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ndo_default_print(gndo, bp, length);
20662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
206853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef SIGNAL_REQ_INFO
20692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectRETSIGTYPE requestinfo(int signo _U_)
20702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay)
20722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		++infoprint;
20732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
20742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
20752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
20772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
20792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Called once each second in verbose mode while dumping to file
20802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
20812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
20822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
208353f17a9db278d33517d9888dd77848f554522a38JP Abgrall				  DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
20842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
20862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
20882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "Got %u\r", packets_captured);
20892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
20912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void verbose_stats_dump(int sig _U_)
20922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
20932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
20942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
20952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
20962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "Got %u\r", packets_captured);
20972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	alarm(1);
20982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
20992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
21002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
21022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusage(void)
21032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
21042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	extern char version[];
21052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_PCAP_LIB_VERSION
21062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(WIN32) || defined(HAVE_PCAP_VERSION)
21072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	extern char pcap_version[];
21082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
21092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static char pcap_version[] = "unknown";
21102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
21112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_LIB_VERSION */
21122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_LIB_VERSION
21142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
21152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
21162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
21172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s\n", program_name, version);
21182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
21192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s\n",pcap_lib_version());
21202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* HAVE_PCAP_LIB_VERSION */
21212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
21222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
21232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
21242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
21252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s\n", program_name, version);
21262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "libpcap version %s\n", pcap_version);
21272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
21282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_LIB_VERSION */
21292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
213053f17a9db278d33517d9888dd77848f554522a38JP Abgrall"Usage: %s [-aAbd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [ -c count ]\n", program_name);
213153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)fprintf(stderr,
213253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
21332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
213453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -i interface ]" j_FLAG_USAGE " [ -M secret ]\n");
213553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_PCAP_SETDIRECTION
213653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	(void)fprintf(stderr,
213753f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -Q in|out|inout ]\n");
213853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
21392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
214053f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -V file ] [ -w file ]\n");
21412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
214253f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -W filecount ] [ -y datalinktype ] [ -z command ]\n");
21432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
214453f17a9db278d33517d9888dd77848f554522a38JP Abgrall"\t\t[ -Z user ] [ expression ]\n");
21452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(1);
21462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
21472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
21512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
21522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_error(netdissect_options *ndo _U_, const char *fmt, ...)
21532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
21542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
21552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: ", program_name);
21572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
21582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
21592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
21602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
21612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
21622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
21632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
21642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
21652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(1);
21662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* NOTREACHED */
21672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
21682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
21702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
21712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_warning(netdissect_options *ndo _U_, const char *fmt, ...)
21722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
21732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
21742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
21752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: WARNING: ", program_name);
21762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
21772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
21782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
21792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
21802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
21812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
21822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
21832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
21842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2185