.\" Copyright (c) 1994, 1996, 1997
.\"	The Regents of the University of California.  All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that: (1) source code distributions
.\" retain the above copyright notice and this paragraph in its entirety, (2)
.\" distributions including binary code include the above copyright notice and
.\" this paragraph in its entirety in the documentation or other materials
.\" provided with the distribution, and (3) all advertising materials mentioning
.\" features or use of this software display the following acknowledgement:
.\" ``This product includes software developed by the University of California,
.\" Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
.\" the University nor the names of its contributors may be used to endorse
.\" or promote products derived from this software without specific prior
.\" written permission.
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
.TH PCAP_SETNONBLOCK 3PCAP "25 July 2018"
.SH NAME
pcap_setnonblock, pcap_getnonblock \- set or get the state of
non-blocking mode on a capture device
.SH SYNOPSIS
.nf
.ft B
#include <pcap/pcap.h>
.ft
.LP
.nf
.ft B
char errbuf[PCAP_ERRBUF_SIZE];
.ft
.LP
.ft B
int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf);
int pcap_getnonblock(pcap_t *p, char *errbuf);
.ft
.fi
.SH DESCRIPTION
.BR pcap_setnonblock ()
puts a capture handle into ``non-blocking'' mode, or takes it out
of ``non-blocking'' mode, depending on whether the
.I nonblock
argument is non-zero or zero.  It has no effect on ``savefiles''.
If there is an error,
.B PCAP_ERROR
is returned and
.I errbuf
is filled in with an appropriate error message; otherwise,
.B 0
is returned.
.PP
In
``non-blocking'' mode, an attempt to read from the capture descriptor
with
.BR pcap_dispatch (3PCAP)
and
.BR pcap_next_ex (3PCAP)
will, if no packets are currently available to be read, return
.B 0
immediately rather than blocking waiting for packets to arrive.
.PP
.BR pcap_loop (3PCAP)
will loop forever, consuming CPU time when no packets are currently
available;
.BR pacp_dispatch ()
should be used instead.
.BR pcap_next (3PCAP)
will return
.B NULL
if there are no packets currently available to read;
this is indistinguishable from an error, so
.BR pcap_next_ex ()
should be used instead.
.PP
When first activated with
.BR pcap_activate (3PCAP)
or opened with
.BR pcap_open_live (3PCAP) ,
a capture handle is not in ``non-blocking mode''; a call to
.BR pcap_setnonblock ()
is required in order to put it into ``non-blocking'' mode.
.SH RETURN VALUE
.BR pcap_getnonblock ()
returns the current ``non-blocking'' state of the capture descriptor; it
always returns
.B 0
on ``savefiles''.
If there is an error,
.B PCAP_ERROR
is returned and
.I errbuf
is filled in with an appropriate error message.
.PP
.I errbuf
is assumed to be able to hold at least
.B PCAP_ERRBUF_SIZE
chars.
.SH SEE ALSO
.BR pcap (3PCAP),
.BR pcap_next_ex (3PCAP),
.BR pcap_geterr (3PCAP)
