Hi,

Below is a patch that makes breaking out of the loop work when using
a savefile.

The pcap_breakloop() function was backported from tcpdump.org libpcap
to OpenBSD libpcap by djm@ on Nov 18, 2005. The bits to make
pcap_breakloop() work were backported to pcap-bpf.c [1] but not to
savefile.c even though tcpdump.org implemented support there too [2].

The diff below backports this piece of code to savefile.c after all.

Thanks,
Caspar Schutijser

[1] 
https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/lib/libpcap/pcap-bpf.c.diff?r1=1.16&r2=1.17
[2] 
https://github.com/the-tcpdump-group/libpcap/commit/991d444f7116bef16893826b46f3950f62281507#diff-95d4d29d0f11145ff40b850860667a97R745


Index: savefile.c
===================================================================
RCS file: /cvs/src/lib/libpcap/savefile.c,v
retrieving revision 1.16
diff -u -p -r1.16 savefile.c
--- savefile.c  22 Dec 2015 19:51:04 -0000      1.16
+++ savefile.c  15 May 2020 19:03:44 -0000
@@ -307,6 +307,23 @@ pcap_offline_read(pcap_t *p, int cnt, pc
        while (status == 0) {
                struct pcap_pkthdr h;
 
+               /*
+                * Has "pcap_breakloop()" been called?
+                * If so, return immediately - if we haven't read any
+                * packets, clear the flag and return -2 to indicate
+                * that we were told to break out of the loop, otherwise
+                * leave the flag set, so that the *next* call will break
+                * out of the loop without having read any packets, and
+                * return the number of packets we've processed so far.
+                */
+               if (p->break_loop) {
+                       if (n == 0) {
+                               p->break_loop = 0;
+                               return (PCAP_ERROR_BREAK);
+                       } else
+                               return (n);
+               }
+
                status = sf_next_packet(p, &h, p->buffer, p->bufsize);
                if (status) {
                        if (status == 1)

Reply via email to