I just committed this, thank you :)

dlg

> On 16 May 2020, at 05:14, Caspar Schutijser <cas...@schutijser.com> wrote:
> 
> 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