Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
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_break-
       loop()  are  Linux and Windows, and the wakeup will only	be caused when
       capturing on network interfaces;	it will	not be caused on other operat-
       ing 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 con-
       sole 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 re-
       turns after calling pcap_breakloop(), the call will be  restarted,  and
       the loop	will not terminate until more packets arrive and the call com-
       pletes.

       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 pro-
       vides 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_break-
       loop() 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	termi-
       nated  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	subse-
       quent 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)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=pcap_breakloop&sektion=3&manpath=FreeBSD+Ports+14.3.quarterly>

home | help