Wireshark-dev: [Wireshark-dev] [Patch] Re: capture from a fifo
From: Richard van der Hoff <richardv@xxxxxxxxxxxxx>
Date: Wed, 26 Jul 2006 14:22:57 +0100
Richard van der Hoff wrote:
[tshark from a fifo] Ulf - I notice you made the relevant change here (r16787) - is there any reason why tshark shouldn't use capture_loop_dispatch to do its processing, rather than attempting to use cap_pipe_dispatch or pcap_dispatch directly?
well, there didn't seem to be, so I've made a patch which does exactly this, and which fixes the problem.
I've even gone so far as to add a unit test for it :). Please could this be applied? -- Richard van der Hoff <richardv@xxxxxxxxxxxxx> Telephony Gateways Project Manager Tel: +44 (0) 845 666 7778 http://www.mxtelecom.com
Index: capture_loop.c =================================================================== --- capture_loop.c (revision 9793) +++ capture_loop.c (working copy) @@ -323,7 +323,7 @@ /* We read one record from the pipe, take care of byte order in the record * header, write the record to the capture file, and update capture statistics. */ -int +static int cap_pipe_dispatch(loop_data *ld, guchar *data, char *errmsg, int errmsgl) { struct pcap_pkthdr phdr; @@ -800,7 +800,7 @@ } /* dispatch incoming packets (pcap or capture pipe) */ -static int +int capture_loop_dispatch(capture_options *capture_opts _U_, loop_data *ld, char *errmsg, int errmsg_len) { int inpkts; @@ -1465,10 +1465,10 @@ void capture_loop_stop(void) { #ifdef HAVE_PCAP_BREAKLOOP - pcap_breakloop(ld.pcap_h); -#else + if(ld.pcap_h != NULL) + pcap_breakloop(ld.pcap_h); +#endif ld.go = FALSE; -#endif } Index: capture_loop.h =================================================================== --- capture_loop.h (revision 9793) +++ capture_loop.h (working copy) @@ -159,12 +159,12 @@ extern initfilter_status_t capture_loop_init_filter(pcap_t *pcap_h, gboolean from_cap_pipe, const gchar * iface, gchar * cfilter); -#ifdef HAVE_LIBPCAP -#ifndef _WIN32 -extern int -cap_pipe_dispatch(loop_data *, guchar *, char *, int); -#endif /* _WIN32 */ -#endif +/** read a single record from the capture input, and dispatch it + returns the number of packets processed. +*/ +extern int +capture_loop_dispatch(capture_options *capture_opts, loop_data *ld, + char *errmsg, int errmsg_len); extern gboolean capture_loop_open_input(capture_options *capture_opts, loop_data *ld, Index: tshark.c =================================================================== --- tshark.c (revision 9793) +++ tshark.c (working copy) @@ -1700,12 +1700,7 @@ each packet. */ pcap_cnt = 1; } -#ifndef _WIN32 - if (ld.from_cap_pipe) { - inpkts = cap_pipe_dispatch(&ld, pcap_data, errmsg, sizeof errmsg); - } else -#endif - inpkts = pcap_dispatch(ld.pcap_h, pcap_cnt, ld.packet_cb, (u_char *) &ld); + inpkts=capture_loop_dispatch(pcap_data, &ld, errmsg, sizeof errmsg); if (inpkts < 0) { /* Error from "pcap_dispatch()", or error or "no more packets" from "cap_pipe_dispatch(). */ Index: test/suite-capture.sh =================================================================== --- test/suite-capture.sh (revision 9793) +++ test/suite-capture.sh (working copy) @@ -93,6 +93,38 @@ fi } +# capture packets via a fifo +capture_step_fifo() { + mkfifo 'fifo' + (cat $CAPFILE; sleep 1; tail -c +25 $CAPFILE) > fifo & + $DUT -i fifo -w ./testout.pcap -a duration:$TRAFFIC_CAPTURE_DURATION > ./testout.txt 2>&1 + RETURNVALUE=$? + rm 'fifo' + if [ ! $RETURNVALUE -eq $EXIT_OK ]; then + test_step_failed "exit status of $DUT: $RETURNVALUE" + return + fi + + # we should have an output file now + if [ ! -f "./testout.pcap" ]; then + test_step_failed "No output file!" + return + fi + + # ok, we got a capture file, does it contain exactly 8 packets? + $CAPINFOS ./testout.pcap > ./testout.txt + grep -i 'Number of packets: 8' ./testout.txt > /dev/null + if [ $? -eq 0 ]; then + test_step_ok + else + echo + cat ./testout.txt + test_step_failed "No or not enough traffic captured." + fi +} + + + # capture exactly 2 times 10 packets (multiple files) capture_step_2multi_10packets() { $DUT -i $TRAFFIC_CAPTURE_IFACE -w ./testout.pcap -c 10 -a duration:$TRAFFIC_CAPTURE_DURATION > ./testout.txt 2>&1 @@ -202,6 +234,7 @@ test_step_add "Capture 10 packets using stdout: -w -" capture_step_10packets_stdout test_step_add "Capture read filter (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_read_filter test_step_add "Capture snapshot length 68 bytes (${TRAFFIC_CAPTURE_DURATION}s)" capture_step_snapshot + test_step_add "Capture via fifo" capture_step_fifo } dumpcap_capture_suite() {
- Follow-Ups:
- Re: [Wireshark-dev] [Patch] Re: capture from a fifo
- From: Richard van der Hoff
- Re: [Wireshark-dev] [Patch] Re: capture from a fifo
- References:
- Re: [Wireshark-dev] [Wireshark-users] capture from a fifo
- From: Richard van der Hoff
- Re: [Wireshark-dev] [Wireshark-users] capture from a fifo
- Prev by Date: Re: [Wireshark-dev] [Wireshark-users] capture from a fifo
- Next by Date: [Wireshark-dev] [patch] capture_sync.c cosmetics
- Previous by thread: Re: [Wireshark-dev] [Wireshark-users] capture from a fifo
- Next by thread: Re: [Wireshark-dev] [Patch] Re: capture from a fifo
- Index(es):