X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3f1a81d40a784db2b273cbbc810f7e5b0616b8a3..2d0270b827db5c1eaa6af8ca85bd07aca1ef90df:/tcpdump.c diff --git a/tcpdump.c b/tcpdump.c index 45db78d8..207908a5 100644 --- a/tcpdump.c +++ b/tcpdump.c @@ -58,7 +58,6 @@ The Regents of the University of California. All rights reserved.\n"; #ifdef WIN32 #include "w32_fzs.h" -extern int strcasecmp (const char *__s1, const char *__s2); extern int SIZE_BUF; #define off_t long #define uint UINT @@ -121,6 +120,7 @@ extern int SIZE_BUF; #include "setsignal.h" #include "gmt2local.h" #include "pcap-missing.h" +#include "ascii_strcasecmp.h" #include "print.h" @@ -134,18 +134,24 @@ extern int SIZE_BUF; #define SIGNAL_REQ_INFO SIGUSR1 #endif -netdissect_options Gndo; -netdissect_options *gndo = &Gndo; - +static int Cflag; /* rotate dump files after this many bytes */ +static int Cflag_count; /* Keep track of which file number we're writing */ static int Dflag; /* list available devices and exit */ static int dflag; /* print filter code */ +static int Gflag; /* rotate dump files after this many seconds */ +static int Gflag_count; /* number of files created with Gflag rotation */ +static time_t Gflag_time; /* The last time_t the dump file was rotated. */ static int Lflag; /* list available data link types and exit */ +static int Iflag; /* rfmon (monitor) mode */ #ifdef HAVE_PCAP_SET_TSTAMP_TYPE static int Jflag; /* list available time stamp types */ #endif #ifdef HAVE_PCAP_SETDIRECTION int Qflag = -1; /* restrict captured packet by send/receive direction */ #endif +static int Uflag; /* "unbuffered" output of dump files */ +static int Wflag; /* recycle output files after this number of files */ +static int WflagChars; static char *zflag = NULL; /* compress each savefile using a specified command (like gzip or bzip2) */ static int infodelay; @@ -158,7 +164,8 @@ static RETSIGTYPE cleanup(int); static RETSIGTYPE child_cleanup(int); static void print_version(void); static void print_usage(void); -static void show_dlts_and_exit(const char *device, pcap_t *pd) __attribute__((noreturn)); +static void show_tstamp_types_and_exit(const char *device) __attribute__((noreturn)); +static void show_dlts_and_exit(const char *device) __attribute__((noreturn)); static void print_packet(u_char *, const struct pcap_pkthdr *, const u_char *); static void dump_packet_and_trunc(u_char *, const struct pcap_pkthdr *, const u_char *); @@ -211,7 +218,7 @@ struct dump_info { #ifdef HAVE_PCAP_SET_TSTAMP_TYPE static void -show_tstamp_types_and_exit(const char *device, pcap_t *pd) +show_tstamp_types_and_exit(const char *device) { int n_tstamp_types; int *tstamp_types = 0; @@ -244,7 +251,7 @@ show_tstamp_types_and_exit(const char *device, pcap_t *pd) #endif static void -show_dlts_and_exit(const char *device, pcap_t *pd) +show_dlts_and_exit(const char *device) { int n_dlts, i; int *dlts = 0; @@ -267,7 +274,7 @@ show_dlts_and_exit(const char *device, pcap_t *pd) if (supports_monitor_mode) (void) fprintf(stderr, "Data link types for %s %s (use option -y to set):\n", device, - gndo->ndo_Iflag ? "when in monitor mode" : "when not in monitor mode"); + Iflag ? "when in monitor mode" : "when not in monitor mode"); else (void) fprintf(stderr, "Data link types for %s (use option -y to set):\n", device); @@ -486,12 +493,13 @@ droproot(const char *username, const char *chroot_dir) } } #ifdef HAVE_LIBCAP_NG - int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG); - if (ret < 0) { - fprintf(stderr, "error : ret %d\n", ret); - } - else { - fprintf(stderr, "dropped privs to %s\n", username); + { + int ret = capng_change_id(pw->pw_uid, pw->pw_gid, CAPNG_NO_FLAG); + if (ret < 0) { + fprintf(stderr, "error : ret %d\n", ret); + } else { + fprintf(stderr, "dropped privs to %s\n", username); + } } #else if (initgroups(pw->pw_name, pw->pw_gid) != 0 || @@ -550,11 +558,11 @@ MakeFilename(char *buffer, char *orig_name, int cnt, int max_chars) error("Makefilename: malloc"); /* Process with strftime if Gflag is set. */ - if (gndo->ndo_Gflag != 0) { + if (Gflag != 0) { struct tm *local_tm; /* Convert Gflag_time to a usable format */ - if ((local_tm = localtime(&gndo->ndo_Gflag_time)) == NULL) { + if ((local_tm = localtime(&Gflag_time)) == NULL) { error("MakeTimedFilename: localtime"); } @@ -725,18 +733,23 @@ main(int argc, char **argv) cap_rights_t rights; int cansandbox; #endif /* HAVE_CAPSICUM */ + int Bflag=0; /* buffer size */ + int jflag=-1; /* packet time stamp source */ + int Oflag=1; /* run filter code optimizer */ + int pflag=0; /* don't go promiscuous */ + netdissect_options Ndo; + netdissect_options *ndo = &Ndo; #ifdef WIN32 if(wsockinit() != 0) return 1; #endif /* WIN32 */ - gndo->ndo_jflag=-1; /* not set */ - gndo->ndo_Oflag=1; - gndo->ndo_Rflag=1; - gndo->ndo_dlt=-1; - ndo_set_function_pointers(gndo); - gndo->ndo_snaplen = DEFAULT_SNAPLEN; - gndo->ndo_immediate = 0; + memset(ndo, 0, sizeof(*ndo)); + ndo->ndo_Rflag=1; + ndo->ndo_dlt=-1; + ndo_set_function_pointers(ndo); + ndo->ndo_snaplen = DEFAULT_SNAPLEN; + ndo->ndo_immediate = 0; cnt = -1; device = NULL; @@ -774,17 +787,17 @@ main(int argc, char **argv) break; case 'A': - ++gndo->ndo_Aflag; + ++ndo->ndo_Aflag; break; case 'b': - ++gndo->ndo_bflag; + ++ndo->ndo_bflag; break; #if defined(HAVE_PCAP_CREATE) || defined(WIN32) case 'B': - gndo->ndo_Bflag = atoi(optarg)*1024; - if (gndo->ndo_Bflag <= 0) + Bflag = atoi(optarg)*1024; + if (Bflag <= 0) error("invalid packet buffer size %s", optarg); break; #endif /* defined(HAVE_PCAP_CREATE) || defined(WIN32) */ @@ -796,8 +809,8 @@ main(int argc, char **argv) break; case 'C': - gndo->ndo_Cflag = atoi(optarg) * 1000000; - if (gndo->ndo_Cflag < 0) + Cflag = atoi(optarg) * 1000000; + if (Cflag < 0) error("invalid file size %s", optarg); break; @@ -814,18 +827,18 @@ main(int argc, char **argv) break; case 'e': - ++gndo->ndo_eflag; + ++ndo->ndo_eflag; break; case 'E': #ifndef HAVE_LIBCRYPTO warning("crypto code not compiled in"); #endif - gndo->ndo_espsecret = optarg; + ndo->ndo_espsecret = optarg; break; case 'f': - ++gndo->ndo_fflag; + ++ndo->ndo_fflag; break; case 'F': @@ -833,15 +846,15 @@ main(int argc, char **argv) break; case 'G': - gndo->ndo_Gflag = atoi(optarg); - if (gndo->ndo_Gflag < 0) + Gflag = atoi(optarg); + if (Gflag < 0) error("invalid number of seconds %s", optarg); /* We will create one file initially. */ - gndo->ndo_Gflag_count = 0; + Gflag_count = 0; /* Grab the current time for rotation use. */ - if ((gndo->ndo_Gflag_time = time(NULL)) == (time_t)-1) { + if ((Gflag_time = time(NULL)) == (time_t)-1) { error("main: can't get current time: %s", pcap_strerror(errno)); } @@ -853,7 +866,7 @@ main(int argc, char **argv) break; case 'H': - ++gndo->ndo_Hflag; + ++ndo->ndo_Hflag; break; case 'i': @@ -900,14 +913,14 @@ main(int argc, char **argv) #ifdef HAVE_PCAP_CREATE case 'I': - ++gndo->ndo_Iflag; + ++Iflag; break; #endif /* HAVE_PCAP_CREATE */ #ifdef HAVE_PCAP_SET_TSTAMP_TYPE case 'j': - gndo->ndo_jflag = pcap_tstamp_type_name_to_val(optarg); - if (gndo->ndo_jflag < 0) + jflag = pcap_tstamp_type_name_to_val(optarg); + if (jflag < 0) error("invalid time stamp type %s", optarg); break; @@ -938,7 +951,7 @@ main(int argc, char **argv) break; case 'K': - ++gndo->ndo_Kflag; + ++ndo->ndo_Kflag; break; case 'm': @@ -946,7 +959,7 @@ main(int argc, char **argv) if (smiLoadModule(optarg) == 0) { error("could not load MIB module %s", optarg); } - gndo->ndo_sflag = 1; + ndo->ndo_sflag = 1; #else (void)fprintf(stderr, "%s: ignoring option `-m %s' ", program_name, optarg); @@ -959,37 +972,37 @@ main(int argc, char **argv) #ifndef HAVE_LIBCRYPTO warning("crypto code not compiled in"); #endif - gndo->ndo_sigsecret = optarg; + ndo->ndo_sigsecret = optarg; break; case 'n': - ++gndo->ndo_nflag; + ++ndo->ndo_nflag; break; case 'N': - ++gndo->ndo_Nflag; + ++ndo->ndo_Nflag; break; case 'O': - gndo->ndo_Oflag = 0; + Oflag = 0; break; case 'p': - ++gndo->ndo_pflag; + ++pflag; break; case 'q': - ++gndo->ndo_qflag; - ++gndo->ndo_suppress_default_print; + ++ndo->ndo_qflag; + ++ndo->ndo_suppress_default_print; break; #ifdef HAVE_PCAP_SETDIRECTION case 'Q': - if (strcasecmp(optarg, "in") == 0) + if (ascii_strcasecmp(optarg, "in") == 0) Qflag = PCAP_D_IN; - else if (strcasecmp(optarg, "out") == 0) + else if (ascii_strcasecmp(optarg, "out") == 0) Qflag = PCAP_D_OUT; - else if (strcasecmp(optarg, "inout") == 0) + else if (ascii_strcasecmp(optarg, "inout") == 0) Qflag = PCAP_D_INOUT; else error("unknown capture direction `%s'", optarg); @@ -1001,75 +1014,75 @@ main(int argc, char **argv) break; case 'R': - gndo->ndo_Rflag = 0; + ndo->ndo_Rflag = 0; break; case 's': - gndo->ndo_snaplen = strtol(optarg, &end, 0); + ndo->ndo_snaplen = strtol(optarg, &end, 0); if (optarg == end || *end != '\0' - || gndo->ndo_snaplen < 0 || gndo->ndo_snaplen > MAXIMUM_SNAPLEN) + || ndo->ndo_snaplen < 0 || ndo->ndo_snaplen > MAXIMUM_SNAPLEN) error("invalid snaplen %s", optarg); - else if (gndo->ndo_snaplen == 0) - gndo->ndo_snaplen = MAXIMUM_SNAPLEN; + else if (ndo->ndo_snaplen == 0) + ndo->ndo_snaplen = MAXIMUM_SNAPLEN; break; case 'S': - ++gndo->ndo_Sflag; + ++ndo->ndo_Sflag; break; case 't': - ++gndo->ndo_tflag; + ++ndo->ndo_tflag; break; case 'T': - if (strcasecmp(optarg, "vat") == 0) - gndo->ndo_packettype = PT_VAT; - else if (strcasecmp(optarg, "wb") == 0) - gndo->ndo_packettype = PT_WB; - else if (strcasecmp(optarg, "rpc") == 0) - gndo->ndo_packettype = PT_RPC; - else if (strcasecmp(optarg, "rtp") == 0) - gndo->ndo_packettype = PT_RTP; - else if (strcasecmp(optarg, "rtcp") == 0) - gndo->ndo_packettype = PT_RTCP; - else if (strcasecmp(optarg, "snmp") == 0) - gndo->ndo_packettype = PT_SNMP; - else if (strcasecmp(optarg, "cnfp") == 0) - gndo->ndo_packettype = PT_CNFP; - else if (strcasecmp(optarg, "tftp") == 0) - gndo->ndo_packettype = PT_TFTP; - else if (strcasecmp(optarg, "aodv") == 0) - gndo->ndo_packettype = PT_AODV; - else if (strcasecmp(optarg, "carp") == 0) - gndo->ndo_packettype = PT_CARP; - else if (strcasecmp(optarg, "radius") == 0) - gndo->ndo_packettype = PT_RADIUS; - else if (strcasecmp(optarg, "zmtp1") == 0) - gndo->ndo_packettype = PT_ZMTP1; - else if (strcasecmp(optarg, "vxlan") == 0) - gndo->ndo_packettype = PT_VXLAN; - else if (strcasecmp(optarg, "pgm") == 0) - gndo->ndo_packettype = PT_PGM; - else if (strcasecmp(optarg, "pgm_zmtp1") == 0) - gndo->ndo_packettype = PT_PGM_ZMTP1; - else if (strcasecmp(optarg, "lmp") == 0) - gndo->ndo_packettype = PT_LMP; + if (ascii_strcasecmp(optarg, "vat") == 0) + ndo->ndo_packettype = PT_VAT; + else if (ascii_strcasecmp(optarg, "wb") == 0) + ndo->ndo_packettype = PT_WB; + else if (ascii_strcasecmp(optarg, "rpc") == 0) + ndo->ndo_packettype = PT_RPC; + else if (ascii_strcasecmp(optarg, "rtp") == 0) + ndo->ndo_packettype = PT_RTP; + else if (ascii_strcasecmp(optarg, "rtcp") == 0) + ndo->ndo_packettype = PT_RTCP; + else if (ascii_strcasecmp(optarg, "snmp") == 0) + ndo->ndo_packettype = PT_SNMP; + else if (ascii_strcasecmp(optarg, "cnfp") == 0) + ndo->ndo_packettype = PT_CNFP; + else if (ascii_strcasecmp(optarg, "tftp") == 0) + ndo->ndo_packettype = PT_TFTP; + else if (ascii_strcasecmp(optarg, "aodv") == 0) + ndo->ndo_packettype = PT_AODV; + else if (ascii_strcasecmp(optarg, "carp") == 0) + ndo->ndo_packettype = PT_CARP; + else if (ascii_strcasecmp(optarg, "radius") == 0) + ndo->ndo_packettype = PT_RADIUS; + else if (ascii_strcasecmp(optarg, "zmtp1") == 0) + ndo->ndo_packettype = PT_ZMTP1; + else if (ascii_strcasecmp(optarg, "vxlan") == 0) + ndo->ndo_packettype = PT_VXLAN; + else if (ascii_strcasecmp(optarg, "pgm") == 0) + ndo->ndo_packettype = PT_PGM; + else if (ascii_strcasecmp(optarg, "pgm_zmtp1") == 0) + ndo->ndo_packettype = PT_PGM_ZMTP1; + else if (ascii_strcasecmp(optarg, "lmp") == 0) + ndo->ndo_packettype = PT_LMP; else error("unknown packet type `%s'", optarg); break; case 'u': - ++gndo->ndo_uflag; + ++ndo->ndo_uflag; break; #ifdef HAVE_PCAP_DUMP_FLUSH case 'U': - ++gndo->ndo_Uflag; + ++Uflag; break; #endif case 'v': - ++gndo->ndo_vflag; + ++ndo->ndo_vflag; break; case 'V': @@ -1081,28 +1094,28 @@ main(int argc, char **argv) break; case 'W': - gndo->ndo_Wflag = atoi(optarg); - if (gndo->ndo_Wflag < 0) + Wflag = atoi(optarg); + if (Wflag < 0) error("invalid number of output files %s", optarg); - gndo->ndo_WflagChars = getWflagChars(gndo->ndo_Wflag); + WflagChars = getWflagChars(Wflag); break; case 'x': - ++gndo->ndo_xflag; - ++gndo->ndo_suppress_default_print; + ++ndo->ndo_xflag; + ++ndo->ndo_suppress_default_print; break; case 'X': - ++gndo->ndo_Xflag; - ++gndo->ndo_suppress_default_print; + ++ndo->ndo_Xflag; + ++ndo->ndo_suppress_default_print; break; case 'y': - gndo->ndo_dltname = optarg; - gndo->ndo_dlt = - pcap_datalink_name_to_val(gndo->ndo_dltname); - if (gndo->ndo_dlt < 0) - error("invalid data link type %s", gndo->ndo_dltname); + ndo->ndo_dltname = optarg; + ndo->ndo_dlt = + pcap_datalink_name_to_val(ndo->ndo_dltname); + if (ndo->ndo_dlt < 0) + error("invalid data link type %s", ndo->ndo_dltname); break; #if defined(HAVE_PCAP_DEBUG) || defined(HAVE_YYDEBUG) @@ -1121,14 +1134,18 @@ main(int argc, char **argv) #endif case 'z': zflag = strdup(optarg); + if (zflag == NULL) + error("Unable to allocate memory for -z argument"); break; case 'Z': username = strdup(optarg); + if (username == NULL) + error("Unable to allocate memory for -Z argument"); break; case '#': - gndo->ndo_packet_number = 1; + ndo->ndo_packet_number = 1; break; case OPTION_VERSION: @@ -1138,15 +1155,15 @@ main(int argc, char **argv) #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION case OPTION_TSTAMP_PRECISION: - gndo->ndo_tstamp_precision = tstamp_precision_from_string(optarg); - if (gndo->ndo_tstamp_precision < 0) + ndo->ndo_tstamp_precision = tstamp_precision_from_string(optarg); + if (ndo->ndo_tstamp_precision < 0) error("unsupported time stamp precision"); break; #endif #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE case OPTION_IMMEDIATE_MODE: - gndo->ndo_immediate = 1; + ndo->ndo_immediate = 1; break; #endif @@ -1161,7 +1178,7 @@ main(int argc, char **argv) show_devices_and_exit(); #endif - switch (gndo->ndo_tflag) { + switch (ndo->ndo_tflag) { case 0: /* Default */ case 4: /* Default + Date*/ @@ -1179,7 +1196,7 @@ main(int argc, char **argv) break; } - if (gndo->ndo_fflag != 0 && (VFileName != NULL || RFileName != NULL)) + if (ndo->ndo_fflag != 0 && (VFileName != NULL || RFileName != NULL)) error("-f can not be used with -V or -r"); if (VFileName != NULL && RFileName != NULL) @@ -1193,7 +1210,7 @@ main(int argc, char **argv) * probably expecting to see packets pop up immediately. */ if (WFileName == NULL && isatty(1)) - gndo->ndo_immediate = 1; + ndo->ndo_immediate = 1; #endif #ifdef WITH_CHROOT @@ -1254,7 +1271,7 @@ main(int argc, char **argv) #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION pd = pcap_open_offline_with_tstamp_precision(RFileName, - gndo->ndo_tstamp_precision, ebuf); + ndo->ndo_tstamp_precision, ebuf); #else pd = pcap_open_offline(RFileName, ebuf); #endif @@ -1310,19 +1327,19 @@ main(int argc, char **argv) error("%s", ebuf); #ifdef HAVE_PCAP_SET_TSTAMP_TYPE if (Jflag) - show_tstamp_types_and_exit(device, pd); + show_tstamp_types_and_exit(device); #endif #ifdef HAVE_PCAP_SET_TSTAMP_PRECISION - status = pcap_set_tstamp_precision(pd, gndo->ndo_tstamp_precision); + status = pcap_set_tstamp_precision(pd, ndo->ndo_tstamp_precision); if (status != 0) error("%s: Can't set %ssecond time stamp precision: %s", device, - tstamp_precision_to_string(gndo->ndo_tstamp_precision), + tstamp_precision_to_string(ndo->ndo_tstamp_precision), pcap_statustostr(status)); #endif #ifdef HAVE_PCAP_SET_IMMEDIATE_MODE - if (gndo->ndo_immediate) { + if (ndo->ndo_immediate) { status = pcap_set_immediate_mode(pd, 1); if (status != 0) error("%s: Can't set immediate mode: %s", @@ -1337,15 +1354,15 @@ main(int argc, char **argv) supports_monitor_mode = 1; else supports_monitor_mode = 0; - status = pcap_set_snaplen(pd, gndo->ndo_snaplen); + status = pcap_set_snaplen(pd, ndo->ndo_snaplen); if (status != 0) error("%s: Can't set snapshot length: %s", device, pcap_statustostr(status)); - status = pcap_set_promisc(pd, !gndo->ndo_pflag); + status = pcap_set_promisc(pd, !pflag); if (status != 0) error("%s: Can't set promiscuous mode: %s", device, pcap_statustostr(status)); - if (gndo->ndo_Iflag) { + if (Iflag) { status = pcap_set_rfmon(pd, 1); if (status != 0) error("%s: Can't set monitor mode: %s", @@ -1355,15 +1372,15 @@ main(int argc, char **argv) if (status != 0) error("%s: pcap_set_timeout failed: %s", device, pcap_statustostr(status)); - if (gndo->ndo_Bflag != 0) { - status = pcap_set_buffer_size(pd, gndo->ndo_Bflag); + if (Bflag != 0) { + status = pcap_set_buffer_size(pd, Bflag); if (status != 0) error("%s: Can't set buffer size: %s", device, pcap_statustostr(status)); } #ifdef HAVE_PCAP_SET_TSTAMP_TYPE - if (gndo->ndo_jflag != -1) { - status = pcap_set_tstamp_type(pd, gndo->ndo_jflag); + if (jflag != -1) { + status = pcap_set_tstamp_type(pd, jflag); if (status < 0) error("%s: Can't set time stamp type: %s", device, pcap_statustostr(status)); @@ -1431,10 +1448,10 @@ main(int argc, char **argv) } #endif /* !defined(HAVE_PCAP_CREATE) && defined(WIN32) */ if (Lflag) - show_dlts_and_exit(device, pd); - if (gndo->ndo_dlt >= 0) { + show_dlts_and_exit(device); + if (ndo->ndo_dlt >= 0) { #ifdef HAVE_PCAP_SET_DATALINK - if (pcap_set_datalink(pd, gndo->ndo_dlt) < 0) + if (pcap_set_datalink(pd, ndo->ndo_dlt) < 0) error("%s", pcap_geterr(pd)); #else /* @@ -1442,21 +1459,21 @@ main(int argc, char **argv) * data link type, so we only let them * set it to what it already is. */ - if (gndo->ndo_dlt != pcap_datalink(pd)) { + if (ndo->ndo_dlt != pcap_datalink(pd)) { error("%s is not one of the DLTs supported by this device\n", - gndo->ndo_dltname); + ndo->ndo_dltname); } #endif (void)fprintf(stderr, "%s: data link type %s\n", - program_name, gndo->ndo_dltname); + program_name, ndo->ndo_dltname); (void)fflush(stderr); } i = pcap_snapshot(pd); - if (gndo->ndo_snaplen < i) { - warning("snaplen raised from %d to %d", gndo->ndo_snaplen, i); - gndo->ndo_snaplen = i; + if (ndo->ndo_snaplen < i) { + warning("snaplen raised from %d to %d", ndo->ndo_snaplen, i); + ndo->ndo_snaplen = i; } - if(gndo->ndo_fflag != 0) { + if(ndo->ndo_fflag != 0) { if (pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) { warning("foreign (-f) flag used but: %s", ebuf); } @@ -1468,7 +1485,7 @@ main(int argc, char **argv) else cmdbuf = copy_argv(&argv[optind]); - if (pcap_compile(pd, &fcode, cmdbuf, gndo->ndo_Oflag, netmask) < 0) + if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0) error("%s", pcap_geterr(pd)); if (dflag) { bpf_dump(&fcode, dflag); @@ -1476,7 +1493,7 @@ main(int argc, char **argv) free(cmdbuf); exit(0); } - init_print(localnet, netmask, timezone_offset); + init_print(ndo, localnet, netmask, timezone_offset); #ifndef WIN32 (void)setsignal(SIGPIPE, cleanup); @@ -1565,8 +1582,8 @@ main(int argc, char **argv) error("malloc of dumpinfo.CurrentFileName"); /* We do not need numbering for dumpfiles if Cflag isn't set. */ - if (gndo->ndo_Cflag != 0) - MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, gndo->ndo_WflagChars); + if (Cflag != 0) + MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, WflagChars); else MakeFilename(dumpinfo.CurrentFileName, WFileName, 0, 0); @@ -1578,7 +1595,7 @@ main(int argc, char **argv) */ capng_update( CAPNG_DROP, - (gndo->ndo_Cflag || gndo->ndo_Gflag ? 0 : CAPNG_PERMITTED) + (Cflag || Gflag ? 0 : CAPNG_PERMITTED) | CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE ); @@ -1589,9 +1606,13 @@ main(int argc, char **argv) #ifdef HAVE_CAPSICUM set_dumper_capsicum_rights(p); #endif - if (gndo->ndo_Cflag != 0 || gndo->ndo_Gflag != 0) { + if (Cflag != 0 || Gflag != 0) { #ifdef HAVE_CAPSICUM dumpinfo.WFileName = strdup(basename(WFileName)); + if (dumpinfo.WFileName == NULL) { + error("Unable to allocate memory for file %s", + WFileName); + } dumpinfo.dirfd = open(dirname(WFileName), O_DIRECTORY | O_RDONLY); if (dumpinfo.dirfd < 0) { @@ -1620,12 +1641,12 @@ main(int argc, char **argv) pcap_userdata = (u_char *)p; } #ifdef HAVE_PCAP_DUMP_FLUSH - if (gndo->ndo_Uflag) + if (Uflag) pcap_dump_flush(p); #endif } else { type = pcap_datalink(pd); - printinfo = get_print_info(type); + printinfo = get_print_info(ndo, type); callback = print_packet; pcap_userdata = (u_char *)&printinfo; } @@ -1639,10 +1660,10 @@ main(int argc, char **argv) (void)setsignal(SIGNAL_REQ_INFO, requestinfo); #endif - if (gndo->ndo_vflag > 0 && WFileName) { + if (ndo->ndo_vflag > 0 && WFileName) { /* * When capturing to a file, "-v" means tcpdump should, - * every 10 secodns, "v"erbosely report the number of + * every 10 seconds, "v"erbosely report the number of * packets captured. */ #ifdef USE_WIN32_MM_TIMER @@ -1662,7 +1683,7 @@ main(int argc, char **argv) * to a file from the -V file). Print a message to * the standard error on UN*X. */ - if (!gndo->ndo_vflag && !WFileName) { + if (!ndo->ndo_vflag && !WFileName) { (void)fprintf(stderr, "%s: verbose output suppressed, use -v or -vv for full protocol decode\n", program_name); @@ -1672,22 +1693,20 @@ main(int argc, char **argv) dlt_name = pcap_datalink_val_to_name(dlt); if (dlt_name == NULL) { (void)fprintf(stderr, "listening on %s, link-type %u, capture size %u bytes\n", - device, dlt, gndo->ndo_snaplen); + device, dlt, ndo->ndo_snaplen); } else { (void)fprintf(stderr, "listening on %s, link-type %s (%s), capture size %u bytes\n", device, dlt_name, - pcap_datalink_val_to_description(dlt), gndo->ndo_snaplen); + pcap_datalink_val_to_description(dlt), ndo->ndo_snaplen); } (void)fflush(stderr); } #endif /* WIN32 */ #ifdef HAVE_CAPSICUM - cansandbox = (gndo->ndo_nflag && VFileName == NULL && zflag == NULL); + cansandbox = (ndo->ndo_nflag && VFileName == NULL && zflag == NULL); if (cansandbox && cap_enter() < 0 && errno != ENOSYS) error("unable to enter the capability mode"); - if (cap_sandboxed()) - fprintf(stderr, "capability mode sandbox enabled\n"); #endif /* HAVE_CAPSICUM */ do { @@ -1747,7 +1766,7 @@ main(int argc, char **argv) new_dlt = pcap_datalink(pd); if (WFileName && new_dlt != dlt) error("%s: new dlt does not match original", RFileName); - printinfo = get_print_info(new_dlt); + printinfo = get_print_info(ndo, new_dlt); dlt_name = pcap_datalink_val_to_name(new_dlt); if (dlt_name == NULL) { fprintf(stderr, "reading from file %s, link-type %u\n", @@ -1758,7 +1777,7 @@ main(int argc, char **argv) RFileName, dlt_name, pcap_datalink_val_to_description(new_dlt)); } - if (pcap_compile(pd, &fcode, cmdbuf, gndo->ndo_Oflag, netmask) < 0) + if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0) error("%s", pcap_geterr(pd)); if (pcap_setfilter(pd, &fcode) < 0) error("%s", pcap_geterr(pd)); @@ -1927,7 +1946,7 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s * first thereby cancelling the Cflag boundary (since the file should * be 0). */ - if (gndo->ndo_Gflag != 0) { + if (Gflag != 0) { /* Check if it is time to rotate */ time_t t; @@ -1939,16 +1958,16 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s /* If the time is greater than the specified window, rotate */ - if (t - gndo->ndo_Gflag_time >= gndo->ndo_Gflag) { + if (t - Gflag_time >= Gflag) { #ifdef HAVE_CAPSICUM FILE *fp; int fd; #endif /* Update the Gflag_time */ - gndo->ndo_Gflag_time = t; + Gflag_time = t; /* Update Gflag_count */ - gndo->ndo_Gflag_count++; + Gflag_count++; /* * Close the current file and open a new one. */ @@ -1964,9 +1983,9 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s * Check to see if we've exceeded the Wflag (when * not using Cflag). */ - if (gndo->ndo_Cflag == 0 && gndo->ndo_Wflag > 0 && gndo->ndo_Gflag_count >= gndo->ndo_Wflag) { + if (Cflag == 0 && Wflag > 0 && Gflag_count >= Wflag) { (void)fprintf(stderr, "Maximum file limit reached: %d\n", - gndo->ndo_Wflag); + Wflag); exit(0); /* NOTREACHED */ } @@ -1981,16 +2000,16 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s * so multiple files would end with 1,2,3 in the filename. * The counting is handled with the -C flow after this. */ - gndo->ndo_Cflag_count = 0; + Cflag_count = 0; /* * This is always the first file in the Cflag * rotation: e.g. 0 * We also don't need numbering if Cflag is not set. */ - if (gndo->ndo_Cflag != 0) + if (Cflag != 0) MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, - gndo->ndo_WflagChars); + WflagChars); else MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, 0, 0); @@ -2032,12 +2051,12 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s * larger than Cflag - the last packet written to the * file could put it over Cflag. */ - if (gndo->ndo_Cflag != 0) { + if (Cflag != 0) { long size = pcap_dump_ftell(dump_info->p); if (size == -1) error("ftell fails on output file"); - if (size > gndo->ndo_Cflag) { + if (size > Cflag) { #ifdef HAVE_CAPSICUM FILE *fp; int fd; @@ -2055,17 +2074,17 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s if (zflag != NULL) compress_savefile(dump_info->CurrentFileName); - gndo->ndo_Cflag_count++; - if (gndo->ndo_Wflag > 0) { - if (gndo->ndo_Cflag_count >= gndo->ndo_Wflag) - gndo->ndo_Cflag_count = 0; + Cflag_count++; + if (Wflag > 0) { + if (Cflag_count >= Wflag) + Cflag_count = 0; } if (dump_info->CurrentFileName != NULL) free(dump_info->CurrentFileName); dump_info->CurrentFileName = (char *)malloc(PATH_MAX + 1); if (dump_info->CurrentFileName == NULL) error("dump_packet_and_trunc: malloc"); - MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, gndo->ndo_Cflag_count, gndo->ndo_WflagChars); + MakeFilename(dump_info->CurrentFileName, dump_info->WFileName, Cflag_count, WflagChars); #ifdef HAVE_LIBCAP_NG capng_update(CAPNG_ADD, CAPNG_EFFECTIVE, CAP_DAC_OVERRIDE); capng_apply(CAPNG_SELECT_BOTH); @@ -2100,7 +2119,7 @@ dump_packet_and_trunc(u_char *user, const struct pcap_pkthdr *h, const u_char *s pcap_dump((u_char *)dump_info->p, h, sp); #ifdef HAVE_PCAP_DUMP_FLUSH - if (gndo->ndo_Uflag) + if (Uflag) pcap_dump_flush(dump_info->p); #endif @@ -2118,7 +2137,7 @@ dump_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) pcap_dump(user, h, sp); #ifdef HAVE_PCAP_DUMP_FLUSH - if (gndo->ndo_Uflag) + if (Uflag) pcap_dump_flush((pcap_dumper_t *)user); #endif @@ -2131,7 +2150,6 @@ static void print_packet(u_char *user, const struct pcap_pkthdr *h, const u_char *sp) { struct print_info *print_info; - u_int hdrlen; ++packets_captured;