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_ =
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/tcpdump.c,v 1.253.2.13 2007/09/12 19:48:51 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>
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pwd.h>
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <grp.h>
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <errno.h>
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "netdissect.h"
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "machdep.h"
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "setsignal.h"
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "gmt2local.h"
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "pcap-missing.h"
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnetdissect_options Gndo;
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnetdissect_options *gndo = &Gndo;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Define the maximum number of files for the -C flag, and how many
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * characters can be added to a filename for the -C flag (which
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * should be enough to handle MAX_CFLAG - 1).
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAX_CFLAG	1000000
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define MAX_CFLAG_CHARS	6
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint dflag;			/* print filter code */
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint Lflag;			/* list available data link types and exit */
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int infodelay;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int infoprint;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectchar *program_name;
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint32_t thiszone;		/* seconds offset from gmt to local time */
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Forwards */
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic RETSIGTYPE cleanup(int);
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void usage(void) __attribute__((noreturn));
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void show_dlts_and_exit(pcap_t *pd) __attribute__((noreturn));
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ndo_default_print(netdissect_options *, const u_char *, u_int);
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *);
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void dump_packet(u_char *, const struct pcap_pkthdr *, const u_char *);
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void droproot(const char *, const char *);
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ndo_error(netdissect_options *ndo, const char *fmt, ...);
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void ndo_warning(netdissect_options *ndo, const char *fmt, ...);
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef SIGINFO
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectRETSIGTYPE requestinfo(int);
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(USE_WIN32_MM_TIMER)
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  #include <MMsystem.h>
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static UINT timer_id;
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static void CALLBACK verbose_stats_dump(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR);
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  static void verbose_stats_dump(int sig);
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void info(int);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic u_int packets_captured;
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttypedef u_int (*if_printer)(const struct pcap_pkthdr *, const u_char *);
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct printer {
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if_printer f;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct printer printers[] = {
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ arcnet_if_print,	DLT_ARCNET },
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ARCNET_LINUX
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ether_if_print,	DLT_EN10MB },
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ token_if_print,	DLT_IEEE802 },
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LANE8023
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ lane_if_print,        DLT_LANE8023 },
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_CIP
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ cip_if_print,         DLT_CIP },
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ATM_CLIP
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ cip_if_print,         DLT_ATM_CLIP },
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sl_if_print,		DLT_SLIP },
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SLIP_BSDOS
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sl_bsdos_if_print,	DLT_SLIP_BSDOS },
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_if_print,		DLT_PPP },
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_WITHDIRECTION
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_if_print,		DLT_PPP_WITHDIRECTION },
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_BSDOS
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_bsdos_if_print,	DLT_PPP_BSDOS },
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fddi_if_print,	DLT_FDDI },
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ null_if_print,	DLT_NULL },
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LOOP
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ null_if_print,	DLT_LOOP },
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ raw_if_print,		DLT_RAW },
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ atm_if_print,		DLT_ATM_RFC1483 },
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_C_HDLC
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ chdlc_if_print,	DLT_C_HDLC },
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_HDLC
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ chdlc_if_print,	DLT_HDLC },
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_SERIAL
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ppp_hdlc_if_print,    DLT_PPP_SERIAL },
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PPP_ETHER
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ pppoe_if_print,	DLT_PPP_ETHER },
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LINUX_SLL
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sll_if_print,		DLT_LINUX_SLL },
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IEEE802_11
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ieee802_11_if_print,	DLT_IEEE802_11},
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_LTALK
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ltalk_if_print,	DLT_LTALK },
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(DLT_PFLOG) && defined(HAVE_NET_PFVAR_H)
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ pflog_if_print, 	DLT_PFLOG },
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_FR
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fr_if_print,		DLT_FR },
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_FRELAY
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ fr_if_print,		DLT_FRELAY },
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SUNATM
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ sunatm_if_print,	DLT_SUNATM },
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IP_OVER_FC
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ipfc_if_print,	DLT_IP_OVER_FC },
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_PRISM_HEADER
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ prism_if_print,	DLT_PRISM_HEADER },
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_IEEE802_11_RADIO
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_ENC
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ enc_if_print, 	DLT_ENC },
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_SYMANTEC_FIREWALL
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ symantec_if_print, 	DLT_SYMANTEC_FIREWALL },
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_APPLE_IP_OVER_IEEE1394
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ATM1
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_atm1_print,	DLT_JUNIPER_ATM1 },
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ATM2
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_atm2_print,	DLT_JUNIPER_ATM2 },
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MFR
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mfr_print,	DLT_JUNIPER_MFR },
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MLFR
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mlfr_print,	DLT_JUNIPER_MLFR },
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MLPPP
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_mlppp_print,	DLT_JUNIPER_MLPPP },
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPPOE
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_pppoe_print,	DLT_JUNIPER_PPPOE },
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPPOE_ATM
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_pppoe_atm_print, DLT_JUNIPER_PPPOE_ATM },
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_GGSN
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_ggsn_print,	DLT_JUNIPER_GGSN },
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ES
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_es_print,	DLT_JUNIPER_ES },
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_MONITOR
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_monitor_print, DLT_JUNIPER_MONITOR },
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_SERVICES
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_services_print, DLT_JUNIPER_SERVICES },
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_ETHER
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_ether_print, DLT_JUNIPER_ETHER },
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_PPP
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_ppp_print, DLT_JUNIPER_PPP },
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_FRELAY
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_frelay_print, DLT_JUNIPER_FRELAY },
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_JUNIPER_CHDLC
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ juniper_chdlc_print, DLT_JUNIPER_CHDLC },
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef DLT_MFR
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ mfr_if_print, DLT_MFR },
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ NULL,			0 },
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic if_printer
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlookup_printer(int type)
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct printer *p;
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	for (p = printers; p->f; ++p)
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (type == p->type)
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return p->f;
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return NULL;
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* NOTREACHED */
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic pcap_t *pd;
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int optind;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern int opterr;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextern char *optarg;
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct print_info {
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if_printer printer;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct dump_info {
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char	*WFileName;
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_t	*pd;
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dumper_t *p;
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectshow_dlts_and_exit(pcap_t *pd)
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int n_dlts;
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int *dlts = 0;
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *dlt_name;
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	n_dlts = pcap_list_datalinks(pd, &dlts);
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (n_dlts < 0)
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else if (n_dlts == 0 || !dlts)
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("No data link types.");
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void) fprintf(stderr, "Data link types (use option -y to set):\n");
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (--n_dlts >= 0) {
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlts[n_dlts]);
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name != NULL) {
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void) fprintf(stderr, "  %s (%s)", dlt_name,
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlts[n_dlts]));
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * OK, does tcpdump handle that type?
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (lookup_printer(dlts[n_dlts]) == NULL)
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void) fprintf(stderr, " (not supported)");
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('\n');
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void) fprintf(stderr, "  DLT %d (not supported)\n",
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    dlts[n_dlts]);
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	free(dlts);
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(0);
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Set up flags that might or might not be supported depending on the
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * version of libpcap we're using.
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG		"B:"
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG_USAGE	" [ -B size ]"
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define B_FLAG_USAGE
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_PCAP_IF_T
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef HAVE_PCAP_FINDALLDEVS
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define D_FLAG	"D"
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define D_FLAG
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define U_FLAG	"U"
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define U_FLAG
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// not supported on android
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint initgroups(const char *user, gid_t group) {return 0;}
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Drop root privileges and chroot if necessary */
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdroproot(const char *username, const char *chroot_dir)
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct passwd *pw = NULL;
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (chroot_dir && !username) {
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "tcpdump: Chroot without dropping root is insecure\n");
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(1);
3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pw = getpwnam(username);
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pw) {
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (chroot_dir) {
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (chroot(chroot_dir) != 0 || chdir ("/") != 0) {
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				fprintf(stderr, "tcpdump: Couldn't chroot/chdir to '%.64s': %s\n",
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    chroot_dir, pcap_strerror(errno));
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				exit(1);
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (initgroups(pw->pw_name, pw->pw_gid) != 0 ||
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    setgid(pw->pw_gid) != 0 || setuid(pw->pw_uid) != 0) {
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "tcpdump: Couldn't change to '%.32s' uid=%lu gid=%lu: %s\n",
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    username,
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (unsigned long)pw->pw_uid,
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    (unsigned long)pw->pw_gid,
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_strerror(errno));
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			exit(1);
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else {
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "tcpdump: Couldn't find user '%.32s'\n",
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    username);
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(1);
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectgetWflagChars(int x)
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int c = 0;
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	x -= 1;
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (x > 0) {
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		c += 1;
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		x /= 10;
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return c;
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectMakeFilename(char *buffer, char *orig_name, int cnt, int max_chars)
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (cnt == 0 && max_chars == 0)
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		strcpy(buffer, orig_name);
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		sprintf(buffer, "%s%0*d", orig_name, max_chars, cnt);
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic int tcpdump_printf(netdissect_options *ndo _U_,
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  const char *fmt, ...)
4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_list args;
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  int ret;
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_start(args, fmt);
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  ret=vfprintf(stdout, fmt, args);
4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  va_end(args);
4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project  return ret;
4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectmain(int argc, char **argv)
4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int cnt, op, i;
4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	bpf_u_int32 localnet, netmask;
4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register char *cp, *infile, *cmdbuf, *device, *RFileName, *WFileName, *WFileNameAlt;
4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_handler callback;
4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int type;
4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct bpf_program fcode;
4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	RETSIGTYPE (*oldhandler)(int);
4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct print_info printinfo;
4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dump_info dumpinfo;
4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_char *pcap_userdata;
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char ebuf[PCAP_ERRBUF_SIZE];
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *username = NULL;
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *chroot_dir = NULL;
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_if_t *devpointer;
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int devnum;
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int status;
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int UserBufferSize = 1000000;
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if(wsockinit() != 0) return 1;
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        gndo->ndo_Oflag=1;
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_Rflag=1;
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_dlt=-1;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_default_print=ndo_default_print;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_printf=tcpdump_printf;
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_error=ndo_error;
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_warning=ndo_warning;
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	gndo->ndo_snaplen = DEFAULT_SNAPLEN;
4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	cnt = -1;
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	device = NULL;
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	infile = NULL;
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	RFileName = NULL;
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	WFileName = NULL;
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((cp = strrchr(argv[0], '/')) != NULL)
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		program_name = cp + 1;
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		program_name = argv[0];
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (abort_on_misalignment(ebuf, sizeof(ebuf)) < 0)
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", ebuf);
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef LIBSMI
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	smiInit("tcpdump");
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	opterr = 0;
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	while (
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    (op = getopt(argc, argv, "aA" B_FLAG "c:C:d" D_FLAG "eE:fF:i:lLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:YZ:")) != -1)
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (op) {
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'a':
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* compatibility for old -a */
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'A':
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Aflag;
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'B':
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			UserBufferSize = atoi(optarg)*1024;
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (UserBufferSize < 0)
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid packet buffer size %s", optarg);
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'c':
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			cnt = atoi(optarg);
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (cnt <= 0)
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid packet count %s", optarg);
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'C':
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Cflag = atoi(optarg) * 1000000;
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Cflag < 0)
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid file size %s", optarg);
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'd':
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++dflag;
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'D':
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pcap_findalldevs(&devpointer, ebuf) < 0)
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", ebuf);
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				for (i = 0; devpointer != 0; i++) {
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf("%d.%s", i+1, devpointer->name);
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					if (devpointer->description != NULL)
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						printf(" (%s)", devpointer->description);
5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					printf("\n");
5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					devpointer = devpointer->next;
5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return 0;
5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_FINDALLDEVS */
5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'L':
5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Lflag++;
5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'e':
5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++eflag;
5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'E':
5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_LIBCRYPTO
5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("crypto code not compiled in");
5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_espsecret = optarg;
5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'f':
5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++fflag;
5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'F':
5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			infile = optarg;
5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'i':
5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg[0] == '0' && optarg[1] == 0)
5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("Invalid adapter index");
5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_FINDALLDEVS
5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * If the argument is a number, treat it as
5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * an index into the list of adapters, as
5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * printed by "tcpdump -D".
5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * This should be OK on UNIX systems, as interfaces
5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * shouldn't have names that begin with digits.
5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * It can be useful on Windows, where more than
5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * one interface can have the same name.
5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if ((devnum = atoi(optarg)) != 0) {
5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (devnum < 0)
5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					error("Invalid adapter index");
5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				if (pcap_findalldevs(&devpointer, ebuf) < 0)
5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					error("%s", ebuf);
5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				else {
6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					for (i = 0; i < devnum-1; i++){
6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						devpointer = devpointer->next;
6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						if (devpointer == NULL)
6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project							error("Invalid adapter index");
6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					}
6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				}
6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				device = devpointer->name;
6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_FINDALLDEVS */
6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			device = optarg;
6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'l':
6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * _IOLBF is the same as _IOFBF in Microsoft's C
6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * libraries; the only alternative they offer
6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * is _IONBF.
6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 *
6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * XXX - this should really be checking for MSVC++,
6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * not WIN32, if, for example, MinGW has its own
6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * C library that is more UNIX-compatible.
6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setvbuf(stdout, NULL, _IONBF, 0);
6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_SETLINEBUF
6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setlinebuf(stdout);
6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			setvbuf(stdout, NULL, _IOLBF, 0);
6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'n':
6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++nflag;
6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'N':
6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Nflag;
6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'm':
6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef LIBSMI
6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        if (smiLoadModule(optarg) == 0) {
6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("could not load MIB module %s", optarg);
6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		        }
6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			sflag = 1;
6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: ignoring option `-m %s' ",
6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				      program_name, optarg);
6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "(no libsmi support)\n");
6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'M':
6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* TCP-MD5 shared secret */
6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_LIBCRYPTO
6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("crypto code not compiled in");
6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			tcpmd5secret = optarg;
6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'O':
6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Oflag = 0;
6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'p':
6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++pflag;
6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'q':
6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++qflag;
6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'r':
6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			RFileName = optarg;
6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'R':
6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Rflag = 0;
6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 's': {
6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			char *end;
6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snaplen = strtol(optarg, &end, 0);
6882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg == end || *end != '\0'
6892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    || snaplen < 0 || snaplen > 65535)
6902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid snaplen %s", optarg);
6912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (snaplen == 0)
6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				snaplen = 65535;
6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'S':
6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Sflag;
6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 't':
7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++tflag;
7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'T':
7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (strcasecmp(optarg, "vat") == 0)
7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_VAT;
7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "wb") == 0)
7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_WB;
7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rpc") == 0)
7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RPC;
7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rtp") == 0)
7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RTP;
7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "rtcp") == 0)
7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_RTCP;
7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "snmp") == 0)
7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_SNMP;
7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "cnfp") == 0)
7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_CNFP;
7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "tftp") == 0)
7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_TFTP;
7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else if (strcasecmp(optarg, "aodv") == 0)
7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				packettype = PT_AODV;
7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("unknown packet type `%s'", optarg);
7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'u':
7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++uflag;
7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'U':
7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Uflag;
7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'v':
7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++vflag;
7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'w':
7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			WFileName = optarg;
7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'W':
7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			Wflag = atoi(optarg);
7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Wflag < 0)
7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid number of output files %s", optarg);
7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			WflagChars = getWflagChars(Wflag);
7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'x':
7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++xflag;
7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'X':
7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++Xflag;
7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			++suppress_default_print;
7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'y':
7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_dltname = optarg;
7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_dlt =
7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			  pcap_datalink_name_to_val(gndo->ndo_dltname);
7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (gndo->ndo_dlt < 0)
7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("invalid data link type %s", gndo->ndo_dltname);
7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG)
7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'Y':
7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			{
7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* Undocumented flag */
7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DEBUG
7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			extern int pcap_debug;
7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_debug = 1;
7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			extern int yydebug;
7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			yydebug = 1;
7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case 'Z':
7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (optarg) {
7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				username = strdup(optarg);
7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else {
7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				usage();
7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				/* NOTREACHED */
7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			break;
7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default:
7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			usage();
7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* NOTREACHED */
7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (tflag) {
8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 0: /* Default */
8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 4: /* Default + Date*/
8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		thiszone = gmt2local(0);
8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 1: /* No time stamp */
8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 2: /* Unix timeval style */
8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case 3: /* Microseconds since previous packet */
8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	default: /* Not supported */
8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("only -t, -tt, -ttt, and -tttt are supported");
8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WITH_CHROOT
8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* if run as root, prepare for chrooting */
8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (getuid() == 0 || geteuid() == 0) {
8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* future extensibility for cmd-line arguments */
8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!chroot_dir)
8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			chroot_dir = WITH_CHROOT;
8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WITH_USER
8262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* if run as root, prepare for dropping root privileges */
8272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (getuid() == 0 || geteuid() == 0) {
8282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Run with '-Z root' to restore old behaviour */
8292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!username)
8302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			username = WITH_USER;
8312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
8322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
8332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (RFileName != NULL) {
8352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int dlt;
8362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const char *dlt_name;
8372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
8392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
8402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We don't need network access, so relinquish any set-UID
8412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * or set-GID privileges we have (if any).
8422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
8432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We do *not* want set-UID privileges when opening a
8442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * trace file, as that might let the user read other
8452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * people's trace files (especially if we're set-UID
8462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * root).
8472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
8482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (setgid(getgid()) != 0 || setuid(getuid()) != 0 )
8492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "Warning: setgid/setuid failed !\n");
8502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
8512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pd = pcap_open_offline(RFileName, ebuf);
8522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pd == NULL)
8532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", ebuf);
8542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt = pcap_datalink(pd);
8552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlt);
8562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name == NULL) {
8572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "reading from file %s, link-type %u\n",
8582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    RFileName, dlt);
8592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
8602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr,
8612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    "reading from file %s, link-type %s (%s)\n",
8622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    RFileName, dlt_name,
8632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlt));
8642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		localnet = 0;
8662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		netmask = 0;
8672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fflag != 0)
8682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("-f and -r options are incompatible");
8692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
8702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (device == NULL) {
8712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			device = pcap_lookupdev(ebuf);
8722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (device == NULL)
8732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", ebuf);
8742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
8762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if(strlen(device) == 1)	//we assume that an ASCII string is always longer than 1 char
8772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{						//a Unicode string has a \0 as second byte (so strlen() is 1)
8782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "%s: listening on %ws\n", program_name, device);
8792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
8812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		{
8822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "%s: listening on %s\n", program_name, device);
8832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
8842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
8852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fflush(stderr);
8862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
8872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*ebuf = '\0';
8882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf);
8892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pd == NULL)
8902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", ebuf);
8912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else if (*ebuf)
8922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("%s", ebuf);
8932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
8942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Let user own process after socket has been opened.
8952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
8962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
8972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (setgid(getgid()) != 0 || setuid(getuid()) != 0)
8982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fprintf(stderr, "Warning: setgid/setuid failed !\n");
8992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
9012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if(UserBufferSize != 1000000)
9022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if(pcap_setbuff(pd, UserBufferSize)==-1){
9032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", pcap_geterr(pd));
9042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Lflag)
9072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			show_dlts_and_exit(pd);
9082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (gndo->ndo_dlt >= 0) {
9092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_SET_DATALINK
9102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0)
9112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s", pcap_geterr(pd));
9122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
9132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
9142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * We don't actually support changing the
9152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * data link type, so we only let them
9162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * set it to what it already is.
9172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
9182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (gndo->ndo_dlt != pcap_datalink(pd)) {
9192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("%s is not one of the DLTs supported by this device\n",
9202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				      gndo->ndo_dltname);
9212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
9222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
9232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: data link type %s\n",
9242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			              program_name, gndo->ndo_dltname);
9252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fflush(stderr);
9262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		i = pcap_snapshot(pd);
9282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (snaplen < i) {
9292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("snaplen raised from %d to %d", snaplen, i);
9302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			snaplen = i;
9312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {
9332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			localnet = 0;
9342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			netmask = 0;
9352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			warning("%s", ebuf);
9362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infile)
9392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cmdbuf = read_infile(infile);
9402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
9412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		cmdbuf = copy_argv(&argv[optind]);
9422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
9442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
9452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (dflag) {
9462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		bpf_dump(&fcode, dflag);
9472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_close(pd);
9482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		exit(0);
9492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	init_addrtoname(localnet, netmask);
9512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
9532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGPIPE, cleanup);
9542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGTERM, cleanup);
9562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGINT, cleanup);
9572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Cooperate with nohup(1) */
9582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
9592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((oldhandler = setsignal(SIGHUP, cleanup)) != SIG_DFL)
9602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)setsignal(SIGHUP, oldhandler);
9612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
9622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_setfilter(pd, &fcode) < 0)
9642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		error("%s", pcap_geterr(pd));
9652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (WFileName) {
9662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dumper_t *p;
9672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
9682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		WFileNameAlt = (char *)malloc(strlen(WFileName) + MAX_CFLAG_CHARS + 1);
9692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (WFileNameAlt == NULL)
9702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("malloc of WFileNameAlt");
9712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		MakeFilename(WFileNameAlt, WFileName, 0, WflagChars);
9722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p = pcap_dump_open(pd, WFileNameAlt);
9732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (p == NULL)
9742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", pcap_geterr(pd));
9752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Cflag != 0) {
9762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			callback = dump_packet_and_trunc;
9772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.WFileName = WFileName;
9782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.pd = pd;
9792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			dumpinfo.p = p;
9802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_userdata = (u_char *)&dumpinfo;
9812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
9822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			callback = dump_packet;
9832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			pcap_userdata = (u_char *)p;
9842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
9862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		type = pcap_datalink(pd);
9872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printinfo.printer = lookup_printer(type);
9882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (printinfo.printer == NULL) {
9892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			gndo->ndo_dltname = pcap_datalink_val_to_name(type);
9902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (gndo->ndo_dltname != NULL)
9912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("unsupported data link type %s",
9922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				      gndo->ndo_dltname);
9932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
9942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("unsupported data link type %d", type);
9952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
9962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		callback = print_packet;
9972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_userdata = (u_char *)&printinfo;
9982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
9992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
10002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
10012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * We cannot do this earlier, because we want to be able to open
10022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the file (if done) for writing before giving up permissions.
10032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
10042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (getuid() == 0 || geteuid() == 0) {
10052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (username || chroot_dir)
10062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			droproot(username, chroot_dir);
10072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
10092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef SIGINFO
10102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)setsignal(SIGINFO, requestinfo);
10112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
10122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag > 0 && WFileName) {
10142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
10152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * When capturing to a file, "-v" means tcpdump should,
10162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * every 10 secodns, "v"erbosely report the number of
10172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * packets captured.
10182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
10192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
10202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* call verbose_stats_dump() each 1000 +/-100msec */
10212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		timer_id = timeSetEvent(1000, 100, verbose_stats_dump, 0, TIME_PERIODIC);
10222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		setvbuf(stderr, NULL, _IONBF, 0);
10232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
10242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)setsignal(SIGALRM, verbose_stats_dump);
10252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		alarm(1);
10262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
10272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef WIN32
10302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (RFileName == NULL) {
10312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		int dlt;
10322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const char *dlt_name;
10332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!vflag && !WFileName) {
10352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr,
10362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
10372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    program_name);
10382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else
10392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "%s: ", program_name);
10402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt = pcap_datalink(pd);
10412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dlt_name = pcap_datalink_val_to_name(dlt);
10422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dlt_name == NULL) {
10432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n",
10442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    device, dlt, snaplen);
10452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
10462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n",
10472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    device, dlt_name,
10482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    pcap_datalink_val_to_description(dlt), snaplen);
10492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fflush(stderr);
10512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
10532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	status = pcap_loop(pd, cnt, callback, pcap_userdata);
10542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (WFileName == NULL) {
10552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
10562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We're printing packets.  Flush the printed output,
10572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * so it doesn't get intermingled with error output.
10582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
10592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (status == -2) {
10602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
10612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * We got interrupted, so perhaps we didn't
10622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * manage to finish a line we were printing.
10632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Print an extra newline, just in case.
10642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
10652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			putchar('\n');
10662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
10672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fflush(stdout);
10682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (status == -1) {
10702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
10712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Error.  Report it.
10722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
10732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fprintf(stderr, "%s: pcap_loop: %s\n",
10742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    program_name, pcap_geterr(pd));
10752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (RFileName == NULL) {
10772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
10782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We're doing a live capture.  Report the capture
10792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * statistics.
10802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
10812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(1);
10822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
10832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_close(pd);
10842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(status == -1 ? 1 : 0);
10852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
10862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* make a clean exit on interrupts */
10882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic RETSIGTYPE
10892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcleanup(int signo _U_)
10902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
10912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
10922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (timer_id)
10932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		timeKillEvent(timer_id);
10942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	timer_id = 0;
10952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
10962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	alarm(0);
10972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
10982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
10992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_BREAKLOOP
11002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * We have "pcap_breakloop()"; use it, so that we do as little
11022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * as possible in the signal handler (it's probably not safe
11032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * to do anything with standard I/O streams in a signal handler -
11042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * the ANSI C standard doesn't say it is).
11052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_breakloop(pd);
11072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else
11082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * We don't have "pcap_breakloop()"; this isn't safe, but
11102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * it's the best we can do.  Print the summary if we're
11112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * not reading from a savefile - i.e., if we're doing a
11122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * live capture - and exit.
11132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pd != NULL && pcap_file(pd) == NULL) {
11152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
11162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We got interrupted, so perhaps we didn't
11172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * manage to finish a line we were printing.
11182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print an extra newline, just in case.
11192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
11202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putchar('\n');
11212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fflush(stdout);
11222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(1);
11232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(0);
11252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
11262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
11292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectinfo(register int verbose)
11302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
11322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_stats(pd, &stat) < 0) {
11342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)fprintf(stderr, "pcap_stats: %s\n", pcap_geterr(pd));
11352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
11362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
11392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "%s: ", program_name);
11402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%u packets captured", packets_captured);
11422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
11432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(", ", stderr);
11442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
11452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putc('\n', stderr);
11462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%d packets received by filter", stat.ps_recv);
11472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!verbose)
11482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fputs(", ", stderr);
11492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
11502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		putc('\n', stderr);
11512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%d packets dropped by kernel\n", stat.ps_drop);
11522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	infoprint = 0;
11532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
11542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
11562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
11572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
11582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct dump_info *dump_info;
11592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char *name;
11602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
11622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
11642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dump_info = (struct dump_info *)user;
11662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
11682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * XXX - this won't prevent capture files from getting
11692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * larger than Cflag - the last packet written to the
11702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * file could put it over Cflag.
11712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
11722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (pcap_dump_ftell(dump_info->p) > Cflag) {
11732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
11742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Close the current file and open a new one.
11752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
11762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_close(dump_info->p);
11772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		Cflag_count++;
11782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Wflag > 0) {
11792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Cflag_count >= Wflag)
11802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				Cflag_count = 0;
11812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
11822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (Cflag_count >= MAX_CFLAG)
11832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				error("too many output files");
11842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
11852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		name = (char *)malloc(strlen(dump_info->WFileName) + MAX_CFLAG_CHARS + 1);
11862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (name == NULL)
11872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("dump_packet_and_trunc: malloc");
11882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		MakeFilename(name, dump_info->WFileName, Cflag_count, WflagChars);
11892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		dump_info->p = pcap_dump_open(dump_info->pd, name);
11902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		free(name);
11912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (dump_info->p == NULL)
11922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			error("%s", pcap_geterr(pd));
11932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
11942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
11952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dump((u_char *)dump_info->p, h, sp);
11962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
11972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Uflag)
11982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_flush(dump_info->p);
11992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
12002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
12022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
12032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
12042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
12082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
12102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
12122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	pcap_dump(user, h, sp);
12142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_DUMP_FLUSH
12152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Uflag)
12162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		pcap_dump_flush((pcap_dumper_t *)user);
12172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
12182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
12202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
12212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
12222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
12232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
12252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprint_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
12262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
12272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct print_info *print_info;
12282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int hdrlen;
12292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++packets_captured;
12312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	++infodelay;
12332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ts_print(&h->ts);
12342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	print_info = (struct print_info *)user;
12362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
12382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Some printers want to check that they're not walking off the
12392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * end of the packet.
12402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Rather than pass it all the way down, we set this global.
12412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
12422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	snapend = sp + h->caplen;
12432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
12442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hdrlen = (*print_info->printer)(h, sp);
12452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (Xflag) {
12462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
12472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in hex and ASCII.
12482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Xflag > 1) {
12502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
12522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			hex_and_ascii_print("\n\t", sp, h->caplen);
12542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
12552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
12572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
12582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
12592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
12612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				hex_and_ascii_print("\n\t", sp + hdrlen,
12622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    h->caplen - hdrlen);
12632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (xflag) {
12652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
12662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in hex.
12672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (xflag > 1) {
12692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
12712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			hex_print("\n\t", sp, h->caplen);
12732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
12742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
12762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
12772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
12782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
12802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				hex_print("\n\t", sp + hdrlen,
12812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    h->caplen - hdrlen);
12822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
12832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (Aflag) {
12842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
12852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Print the raw packet data in ASCII.
12862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
12872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (Aflag > 1) {
12882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Include the link-layer header.
12902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			ascii_print(sp, h->caplen);
12922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
12932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
12942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Don't include the link-layer header - and if
12952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * we have nothing past the link-layer header,
12962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * print nothing.
12972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
12982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (h->caplen > hdrlen)
12992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				ascii_print(sp + hdrlen, h->caplen - hdrlen);
13002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
13012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
13022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	putchar('\n');
13042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	--infodelay;
13062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infoprint)
13072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
13082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
13112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
13122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * XXX - there should really be libpcap calls to get the version
13132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * number as a string (the string would be generated from #defines
13142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * at run time, so that it's not generated from string constants
13152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * in the library, as, on many UNIX systems, those constants would
13162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * be statically linked into the application executable image, and
13172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * would thus reflect the version of libpcap on the system on
13182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * which the application was *linked*, not the system on which it's
13192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * *running*.
13202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *
13212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * That routine should be documented, unlike the "version[]"
13222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * string, so that UNIX vendors providing their own libpcaps
13232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * don't omit it (as a couple of vendors have...).
13242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 *
13252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Packet.dll should perhaps also export a routine to return the
13262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * version number of the Packet.dll code, to supply the
13272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * "Wpcap_version" information on Windows.
13282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
13292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char WDversion[]="current-cvs.tcpdump.org";
13302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if !defined(HAVE_GENERATED_VERSION)
13312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char version[]="current-cvs.tcpdump.org";
13322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
13332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char pcap_version[]="current-cvs.tcpdump.org";
13342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	char Wpcap_version[]="3.1";
13352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
13362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
13382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * By default, print the specified data out in hex and ASCII.
13392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
13402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
13412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_default_print(netdissect_options *ndo _U_, const u_char *bp, u_int length)
13422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hex_and_ascii_print("\n\t", bp, length); /* pass on lf and identation string */
13442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
13472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectdefault_print(const u_char *bp, u_int length)
13482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ndo_default_print(gndo, bp, length);
13502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef SIGINFO
13532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectRETSIGTYPE requestinfo(int signo _U_)
13542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay)
13562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		++infoprint;
13572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
13582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		info(0);
13592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
13612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
13632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Called once each second in verbose mode while dumping to file
13642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
13652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef USE_WIN32_MM_TIMER
13662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid CALLBACK verbose_stats_dump (UINT timer_id _U_, UINT msg _U_, DWORD_PTR arg _U_,
13672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                  DWORD_PTR dw1 _U_, DWORD_PTR dw2 _U_)
13682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
13702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
13722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "Got %u\r", packets_captured);
13732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#elif defined(HAVE_ALARM)
13752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void verbose_stats_dump(int sig _U_)
13762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct pcap_stat stat;
13782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (infodelay == 0 && pcap_stats(pd, &stat) >= 0)
13802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fprintf(stderr, "Got %u\r", packets_captured);
13812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	alarm(1);
13822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
13832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
13842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
13862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusage(void)
13872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
13882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	extern char version[];
13892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef HAVE_PCAP_LIB_VERSION
13902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if defined(WIN32) || defined(HAVE_PCAP_VERSION)
13912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	extern char pcap_version[];
13922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
13932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	static char pcap_version[] = "unknown";
13942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* defined(WIN32) || defined(HAVE_PCAP_VERSION) */
13952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_LIB_VERSION */
13962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
13972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_PCAP_LIB_VERSION
13982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
13992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
14002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
14012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s\n", program_name, version);
14022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
14032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s\n",pcap_lib_version());
14042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* HAVE_PCAP_LIB_VERSION */
14052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef WIN32
14062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s, based on tcpdump version %s\n", program_name, WDversion, version);
14072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "WinPcap version %s, based on libpcap version %s\n",Wpcap_version, pcap_version);
14082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#else /* WIN32 */
14092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s version %s\n", program_name, version);
14102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "libpcap version %s\n", pcap_version);
14112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* WIN32 */
14122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif /* HAVE_PCAP_LIB_VERSION */
14132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
14142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project"Usage: %s [-aAd" D_FLAG "eflLnNOpqRStu" U_FLAG "vxX]" B_FLAG_USAGE " [-c count] [ -C file_size ]\n", program_name);
14152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
14162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project"\t\t[ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]\n");
14172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
14182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]\n");
14192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
14202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project"\t\t[ -W filecount ] [ -y datalinktype ] [ -Z user ]\n");
14212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr,
14222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project"\t\t[ expression ]\n");
14232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(1);
14242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
14292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
14302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_error(netdissect_options *ndo _U_, const char *fmt, ...)
14312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
14332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: ", program_name);
14352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
14362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
14372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
14382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
14392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
14402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
14412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
14422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	exit(1);
14442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* NOTREACHED */
14452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
14462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* VARARGS */
14482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void
14492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectndo_warning(netdissect_options *ndo _U_, const char *fmt, ...)
14502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
14512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_list ap;
14522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
14532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)fprintf(stderr, "%s: WARNING: ", program_name);
14542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_start(ap, fmt);
14552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)vfprintf(stderr, fmt, ap);
14562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	va_end(ap);
14572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (*fmt) {
14582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		fmt += strlen(fmt);
14592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (fmt[-1] != '\n')
14602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)fputc('\n', stderr);
14612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
14622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1463