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