123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- .\" 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_GET_SELECTABLE_FD 3PCAP "20 January 2018"
- .SH NAME
- pcap_get_selectable_fd \- get a file descriptor on which a select() can
- be done for a live capture
- .SH SYNOPSIS
- .nf
- .ft B
- #include <pcap/pcap.h>
- .ft
- .LP
- .ft B
- int pcap_get_selectable_fd(pcap_t *p);
- .ft
- .fi
- .SH DESCRIPTION
- .B pcap_get_selectable_fd()
- returns, on UNIX, a file descriptor number for a file descriptor on
- which one can
- do a
- .BR select() ,
- .BR poll() ,
- .BR epoll_wait() ,
- .BR kevent() ,
- or other such call
- to wait for it to be possible to read packets without blocking, if such
- a descriptor exists, or \-1, if no such descriptor exists.
- .PP
- Some network devices opened with
- .B pcap_create()
- and
- .BR pcap_activate() ,
- or with
- .BR pcap_open_live() ,
- do not support those calls (for example, regular network devices on
- FreeBSD 4.3 and 4.4, and Endace DAG devices), so \-1 is returned for
- those devices. In that case, those calls must be given a timeout less
- than or equal to the timeout returned by
- .B pcap_get_required_select_timeout()
- for the device for which
- .B pcap_get_selectable_fd()
- returned \-1, the device must be put in non-blocking mode with a call to
- .BR pcap_setnonblock() ,
- and an attempt must always be made to read packets from the device
- when the call returns. If
- .B pcap_get_required_select_timeout()
- returns
- .BR NULL ,
- it is not possible to wait for packets to arrive on the device in an
- event loop.
- .PP
- Note that a device on which a read can be done without blocking may,
- on some platforms, not have any packets to read if the packet buffer
- timeout has expired. A call to
- .B pcap_dispatch()
- or
- .B pcap_next_ex()
- will return 0 in this case, but will not block.
- .PP
- Note that in:
- .IP
- FreeBSD prior to FreeBSD 4.6;
- .IP
- NetBSD prior to NetBSD 3.0;
- .IP
- OpenBSD prior to OpenBSD 2.4;
- .IP
- Mac OS X prior to Mac OS X 10.7;
- .PP
- .BR select() ,
- .BR poll() ,
- and
- .B kevent()
- do not work correctly on BPF devices;
- .B pcap_get_selectable_fd()
- will return a file descriptor on most of those versions (the exceptions
- being FreeBSD 4.3 and 4.4), but a simple
- .BR select() ,
- .BR poll() ,
- or
- .B kevent()
- call will not indicate that the descriptor is readable until a full
- buffer's worth of packets is received, even if the packet timeout
- expires before then. To work around this, code that uses
- those calls to wait for packets to arrive must put the
- .B pcap_t
- in non-blocking mode, and must arrange that the call
- have a timeout less than or equal to the packet buffer timeout,
- and must try to read packets after that timeout expires, regardless of
- whether the call indicated that the file descriptor for the
- .B pcap_t
- is ready to be read or not. (That workaround will not work in FreeBSD
- 4.3 and later; however, in FreeBSD 4.6 and later, those calls
- work correctly on BPF devices, so the workaround isn't necessary,
- although it does no harm.)
- .PP
- Note also that
- .B poll()
- and
- .B kevent()
- doesn't work on character special files, including BPF devices, in Mac
- OS X 10.4 and 10.5, so, while
- .B select()
- can be used on the descriptor returned by
- .BR pcap_get_selectable_fd() ,
- .B poll()
- and
- .B kevent()
- cannot be used on it those versions of Mac OS X.
- .BR poll() ,
- but not
- .BR kevent() ,
- works on that descriptor in Mac OS X releases prior to
- 10.4;
- .B poll()
- and
- .B kevent()
- work on that descriptor in Mac OS X 10.6 and later.
- .PP
- .B pcap_get_selectable_fd()
- is not available on Windows.
- .SH RETURN VALUE
- A selectable file descriptor is returned if one exists; otherwise, \-1
- is returned.
- .SH SEE ALSO
- pcap(3PCAP), pcap_get_required_select_timeout(3PCAP),
- pcap_setnonblock(3PCAP), select(2), poll(2), epoll_wait(2), kqueue(2)
|