Ethereal-dev: Re: [Ethereal-dev] Bug in tethereal: several capture filters [-f] don't work
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Thomas Steffen <steffen.list.account@xxxxxxxxx>
Date: Mon, 8 Aug 2005 11:41:44 +0200
Ok, here is my patch. It does several things, and I can break it down if necessary: * only one -f option is allowed * implicit capture filters (tethereal sctp) generate an error when compiled without libpcap * -X excludes the ssh traffic for the connection tethereal is on (see pod) It works for me, and it should work on all platforms. My only question is whether I can use g_strdup_printf, or whether that is not present in all supported versions of glib. If you like it, please apply. If not, tell me where I should do better :-) I also feel like the argument handling could do with a cleanup, but then again never touch a running system, so this patch is kept as small as reasonable. Thomas On 8/8/05, Guy Harris <gharris@xxxxxxxxx> wrote: > Thomas Steffen wrote: > > > There are two possibilities: accept only one option -f, or combine the > > arguments using "and" (I assume). > > The former is correct. The intent is to support a *single* capture filter. > > _______________________________________________ > Ethereal-dev mailing list > Ethereal-dev@xxxxxxxxxxxx > http://www.ethereal.com/mailman/listinfo/ethereal-dev >
Index: tethereal.c =================================================================== --- tethereal.c (revision 15243) +++ tethereal.c (working copy) @@ -243,7 +243,7 @@ fprintf(output, "\t[ -f <capture filter> ] [ -F <output file type> ] [ -i <capture interface> ]\n"); fprintf(output, "\t[ -N <name resolving flags> ] [ -o <preference setting> ] ... [ -r <infile> ]\n"); fprintf(output, "\t[ -R <read (display) filter> ] [ -s <capture snaplen> ] [ -t <time stamp format> ]\n"); - fprintf(output, "\t[ -T pdml|ps|psml|text ] [ -w <savefile> ] [ -y <capture link type> ]\n"); + fprintf(output, "\t[ -T pdml|ps|psml|text ] [ -w <savefile> ] [ -X ] [ -y <capture link type> ]\n"); fprintf(output, "\t[ -z <statistics ]\n"); #else fprintf(output, "\nt%s [ -vh ] [ -lnVx ]\n", PACKAGE); @@ -655,6 +655,10 @@ dfilter_t *rfcode = NULL; e_prefs *prefs; char badopt; + char *filter_arg = NULL; + char buf[160] = ""; + char remote_ip[80], local_ip[80]; + unsigned int remote_port, local_port; /* initialize memory allocation subsystem */ ep_init_chunk(); @@ -776,12 +780,24 @@ print_format = PR_FMT_TEXT; /* Now get our args */ - while ((opt = getopt(argc, argv, "a:b:c:d:Df:F:hi:lLnN:o:pqr:R:s:St:T:vw:Vxy:z:")) != -1) { + while ((opt = getopt(argc, argv, "a:b:c:d:Df:F:hi:lLnN:o:pqr:R:s:St:T:vw:VxXy:z:")) != -1) { switch (opt) { + case 'f': /* capture filter */ +#ifdef HAVE_LIBPCAP + if (filter_arg) { + fprintf(stderr, +"tethereal: Several capture filters were specified with \"-f\"\n"); + exit(2); + } + filter_arg = optarg; +#else + capture_option_specified = TRUE; + arg_error = TRUE; +#endif + break; case 'a': /* autostop criteria */ case 'b': /* Ringbuffer option */ case 'c': /* Capture xxx packets */ - case 'f': /* capture filter */ case 'p': /* Don't capture in promiscuous mode */ case 's': /* Set the snapshot (capture) length */ case 'y': /* Set the pcap data link type */ @@ -792,6 +808,26 @@ arg_error = TRUE; #endif break; + case 'X': /* exclude own ssh traffic */ +#ifdef HAVE_LIBPCAP + if (getenv("SSH_CONNECTION") + && strlen(getenv("SSH_CONNECTION")) < 80 + && sscanf(getenv("SSH_CONNECTION"), "%s %u %s %u", + remote_ip, &remote_port, local_ip, &local_port) == 4) { + snprintf(buf, sizeof(buf) - 1, "not (ip host %s and tcp port %u " + "and ip host %s and tcp port %u)", + remote_ip, remote_port, local_ip, local_port); + } else + { + fprintf(stderr, "Cannot determine ssh connection details, " + "excluding all ssh traffic.\n"); + snprintf(buf, sizeof(buf) - 1, "not (tcp port 22)"); + } +#else + capture_option_specified = TRUE; + arg_error = TRUE; +#endif + break; case 'd': /* Decode as rule */ if (!add_decode_as(optarg)) exit(1); @@ -1054,18 +1090,29 @@ rfilter = get_args_as_string(argc, argv, optind); } else { #ifdef HAVE_LIBPCAP - if (capture_filter_specified) { + if (filter_arg) { fprintf(stderr, "tethereal: Capture filters were specified both with \"-f\" and with additional command-line arguments\n"); exit(2); } - capture_opts.cfilter = get_args_as_string(argc, argv, optind); + filter_arg = get_args_as_string(argc, argv, optind); #else capture_option_specified = TRUE; + arg_error = TRUE; #endif } } + if (filter_arg || buf[0]) { + if (buf[0] == 0) { + capture_opts.cfilter = filter_arg; + } else if (filter_arg == NULL) { + capture_opts.cfilter = g_strdup(buf); + } else { + capture_opts.cfilter = g_strdup_printf("(%s) and (%s)", filter_arg, buf); + } + } + /* See if we're writing a capture file and the file is a pipe */ #ifdef HAVE_LIBPCAP ld.output_to_pipe = FALSE; Index: doc/tethereal.pod =================================================================== --- doc/tethereal.pod (revision 15243) +++ doc/tethereal.pod (working copy) @@ -32,6 +32,7 @@ S<[ B<-V> ]> S<[ B<-w> savefile ]> S<[ B<-x> ]> +S<[ B<-X> ]> S<[ B<-y> capture link type ]> S<[ B<-z> statistics ]> @@ -504,6 +505,13 @@ Cause B<Tethereal> to print a hex and ASCII dump of the packet data after printing the summary or details. +=item -X + +Add an additional "and" clause to the capture filter that excludes the +SSH traffic generated by B<Tethereal> itself. This uses the +environment variable $SSH_CONNECTION. If it is not set, all SSH +traffic is excluded. + =item -y Set the data link type to use while capturing packets. The values
- References:
- [Ethereal-dev] Bug in tethereal: several capture filters [-f] don't work
- From: Thomas Steffen
- Re: [Ethereal-dev] Bug in tethereal: several capture filters [-f] don't work
- From: Guy Harris
- [Ethereal-dev] Bug in tethereal: several capture filters [-f] don't work
- Prev by Date: Re: [Ethereal-dev] Re: some netxray traces off by time factor
- Next by Date: [Ethereal-dev] Re: rpc-over-tcp alignment patch
- Previous by thread: Re: [Ethereal-dev] Bug in tethereal: several capture filters [-f] don't work
- Next by thread: [Ethereal-dev] little bug in packet-gsm_a.c or in packet-bssgp.c
- Index(es):