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