Ethereal-dev: [Ethereal-dev] Display filter as stop condition
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: sford@xxxxxxxxxxxxx
Date: Fri, 24 Oct 2003 12:23:10 -0700 (PDT)
I've added a "Halt" feature to tethereal that uses a display filter as a stop condition. It is supplied as a string argument to "-H". It can be very useful for troubleshooting to see what led up to a particular condition (kindof like setting a breakpoint with an emulator). Combined with ring buffer, you can just start it, come back the next morning and have a good snapshot. I appologize for not adding the same feature to GUI ethereal (I wouldn't even know how to start), but for my purposes, this is exactly what the doctor ordered (capturing on a text-only box, analyzing with a GUI). I've tested it on Linux (RedHat 8.0) and Windows (2K). I'm not familliar with the code (I downloaded and saw it for the first time this morning), but a few hour's examination led to the following patch. Hopefully it is not too much of an abomination. Steve --- ethereal-0.9.15/cfile.c Fri Sep 6 18:14:04 2002 +++ ./cfile.c Fri Oct 24 12:38:02 2003 @@ -50,6 +50,7 @@ cf->user_saved = FALSE; cf->is_tempfile = FALSE; cf->rfcode = NULL; + cf->hfcode = NULL; cf->dfilter = NULL; cf->dfcode = NULL; #ifdef HAVE_LIBPCAP --- ethereal-0.9.15/cfile.h Thu Sep 4 21:09:35 2003 +++ ./cfile.h Fri Oct 24 12:38:02 2003 @@ -66,6 +66,7 @@ int save_file_fd; /* File descriptor for saved file */ wtap *wth; /* Wiretap session */ dfilter_t *rfcode; /* Compiled read filter program */ + dfilter_t *hfcode; /* Compiled halt filter program */ gchar *dfilter; /* Display filter string */ dfilter_t *dfcode; /* Compiled display filter program */ #ifdef HAVE_LIBPCAP --- ethereal-0.9.15/file.c Mon Sep 8 20:22:22 2003 +++ ./file.c Fri Oct 24 12:38:02 2003 @@ -256,6 +256,10 @@ dfilter_free(cf->rfcode); cf->rfcode = NULL; } + if (cf->hfcode != NULL) { + dfilter_free(cf->hfcode); + cf->hfcode = NULL; + } cf->plist = NULL; cf->plist_end = NULL; unselect_packet(cf); /* nothing to select */ --- ethereal-0.9.15/tethereal.c Sun Sep 7 22:11:33 2003 +++ ./tethereal.c Fri Oct 24 13:03:22 2003 @@ -789,11 +789,12 @@ gboolean capture_option_specified = FALSE; #endif int out_file_type = WTAP_FILE_PCAP; - gchar *cf_name = NULL, *rfilter = NULL; + gchar *cf_name = NULL, *rfilter = NULL, *hfilter = NULL; #ifdef HAVE_LIBPCAP gchar *if_text; #endif dfilter_t *rfcode = NULL; + dfilter_t *hfcode = NULL; e_prefs *prefs; char badopt; ethereal_tap_list *tli; @@ -899,7 +900,7 @@ get_runtime_version_info(runtime_info_str); /* Now get our args */ - while ((opt = getopt(argc, argv, "a:b:c:d:Df:F:hi:lnN:o:pqr:R:s:St:vw:Vxz:")) != -1) { + while ((opt = getopt(argc, argv, "a:b:c:d:Df:F:hH:i:lnN:o:pqr:R:s:St:vw:Vxz:")) != -1) { switch (opt) { case 'a': /* autostop criteria */ #ifdef HAVE_LIBPCAP @@ -988,6 +989,9 @@ print_usage(TRUE); exit(0); break; + case 'H': /* Read file filter */ + hfilter = optarg; + break; case 'i': /* Use interface xxx */ #ifdef HAVE_LIBPCAP /* @@ -1141,12 +1145,12 @@ runtime_info_str->str); exit(0); break; - case 'w': /* Write to capture file xxx */ - cfile.save_file = g_strdup(optarg); - break; case 'V': /* Verbose */ verbose = TRUE; break; + case 'w': /* Write to capture file xxx */ + cfile.save_file = g_strdup(optarg); + break; case 'x': /* Print packet data in hex (and ASCII) */ print_hex = TRUE; break; @@ -1340,7 +1344,15 @@ exit(2); } } + if (hfilter != NULL) { + if (!dfilter_compile(hfilter, &hfcode)) { + fprintf(stderr, "tethereal: %s\n", dfilter_error_msg); + epan_cleanup(); + exit(2); + } + } cfile.rfcode = rfcode; + cfile.hfcode = hfcode; if (cf_name) { err = open_cap_file(cf_name, FALSE, &cfile); if (err != 0) { @@ -2175,10 +2187,12 @@ cb_args_t *args = (cb_args_t *) user; capture_file *cf = args->cf; wtap_dumper *pdh = args->pdh; - frame_data fdata; + frame_data fdata, hfdata; int err; gboolean passed; + gboolean halt; epan_dissect_t *edt; + epan_dissect_t *hedt; #ifdef HAVE_LIBPCAP #ifdef SIGINFO @@ -2192,6 +2206,17 @@ #endif /* HAVE_LIBPCAP */ cf->count++; + /* check halt condition */ + if (cf->hfcode) { + fill_in_fdata(&hfdata, cf, phdr, offset); + hedt = epan_dissect_new(TRUE, FALSE); + epan_dissect_prime_dfilter(hedt, cf->hfcode); + epan_dissect_run(hedt, pseudo_header, buf, &hfdata, NULL); + if (dfilter_apply_edt(cf->hfcode, hedt)) + ld.go = FALSE; + } else { + hedt = NULL; + } if (cf->rfcode) { fill_in_fdata(&fdata, cf, phdr, offset); edt = epan_dissect_new(TRUE, FALSE); @@ -2224,6 +2249,10 @@ exit(2); } } + if (hedt != NULL) + epan_dissect_free(hedt); + if (cf->hfcode) + clear_fdata(&hfdata); if (edt != NULL) epan_dissect_free(edt); if (cf->rfcode)
- Follow-Ups:
- Re: [Ethereal-dev] Display filter as stop condition
- From: Gerald Combs
- Re: [Ethereal-dev] Display filter as stop condition
- From: Ronnie Sahlberg
- Re: [Ethereal-dev] Display filter as stop condition
- Prev by Date: Re: [Ethereal-dev] [patch] save & load hostname-cache
- Next by Date: Re: [Ethereal-dev] Display filter as stop condition
- Previous by thread: RE: [Ethereal-dev] reorganizing source tree
- Next by thread: Re: [Ethereal-dev] Display filter as stop condition
- Index(es):