PCAP_BREAKLOOP(3PCAP) PCAP_BREAKLOOP(3PCAP)

NAME


pcap_breakloop - force a pcap_dispatch() or pcap_loop() call to
return

SYNOPSIS


#include <pcap/pcap.h>

void pcap_breakloop(pcap_t *);

DESCRIPTION


pcap_breakloop() sets a flag that will force pcap_dispatch(3PCAP) or
pcap_loop(3PCAP) to return rather than looping; they will return the
number of packets that have been processed so far, or
PCAP_ERROR_BREAK if no packets have been processed so far. If the
loop is currently blocked waiting for packets to arrive,
pcap_breakloop() will also, on some platforms, wake up the thread
that is blocked. In this version of libpcap, the only platforms on
which a wakeup is caused by pcap_breakloop() are Linux and Windows,
and the wakeup will only be caused when capturing on network
interfaces; it will not be caused on other operating systems, and
will not be caused on any OS when capturing on other types of
devices.

This routine is safe to use inside a signal handler on UNIX or a
console control handler on Windows, or in a thread other than the one
in which the loop is running, as it merely sets a flag that is
checked within the loop and, on some platforms, performs a signal-
safe and thread-safe API call.

The flag is checked in loops reading packets from the OS - a signal
by itself will not necessarily terminate those loops - as well as in
loops processing a set of packets returned by the OS. Note that if
you are catching signals on UNIX systems that support restarting
system calls after a signal, and calling pcap_breakloop() in the
signal handler, you must specify, when catching those signals, that
system calls should NOT be restarted by that signal. Otherwise, if
the signal interrupted a call reading packets in a live capture, when
your signal handler returns after calling pcap_breakloop(), the call
will be restarted, and the loop will not terminate until more packets
arrive and the call completes.

Note also that, in a multi-threaded application, if one thread is
blocked in pcap_dispatch(), pcap_loop(), pcap_next(3PCAP), or
pcap_next_ex(3PCAP), a call to pcap_breakloop() in a different thread
will only unblock that thread on the platforms and capture devices
listed above.

If a non-zero packet buffer timeout is set on the pcap_t, and you are
capturing on a network interface, the thread will be unblocked with
the timeout expires. This is not guaranteed to happen unless at
least one packet has arrived; the only platforms on which it happens
are macOS, the BSDs, Solaris 11, AIX, Tru64 UNIX, and Windows.

If you want to ensure that the loop will eventually be unblocked on
any other platforms, or unblocked when capturing on a device other
than a network interface, you will need to use whatever mechanism the
OS provides for breaking a thread out of blocking calls in order to
unblock the thread, such as thread cancellation or thread signalling
in systems that support POSIX threads.

Note that if pcap_breakloop() unblocks the thread capturing packets,
and you are running on a platform that supports packet buffering,
there may be packets in the buffer that arrived before
pcap_breakloop() were called but that weren't yet provided to
libpcap, those packets will not have been processed by
pcap_dispatch() or pcap_loop(). If pcap_breakloop() was called in
order to terminate the capture process, then, in order to process
those packets, you would have to call pcap_dispatch() one time in
order to process the last batch of packets. This may block until the
packet buffer timeout expires, so a non-zero packet buffer timeout
must be used.

Note that pcap_next() and pcap_next_ex() will, on some platforms,
loop reading packets from the OS; that loop will not necessarily be
terminated by a signal, so pcap_breakloop() should be used to
terminate packet processing even if pcap_next() or pcap_next_ex() is
being used.

pcap_breakloop() does not guarantee that no further packets will be
processed by pcap_dispatch() or pcap_loop() after it is called; at
most one more packet might be processed.

If PCAP_ERROR_BREAK is returned from pcap_dispatch() or pcap_loop(),
the flag is cleared, so a subsequent call will resume reading
packets. If a positive number is returned, the flag is not cleared,
so a subsequent call will return PCAP_ERROR_BREAK and clear the flag.

BACKWARD COMPATIBILITY


This function became available in libpcap release 0.8.1.

In releases prior to libpcap 1.10.0, pcap_breakloop() will not wake
up a blocked thread on any platform.

SEE ALSO


pcap(3PCAP)

8 December 2022 PCAP_BREAKLOOP(3PCAP)

tribblix@gmail.com :: GitHub :: Privacy