Go to main content

man pages section 3: Extended Library Functions, Volume 1

Exit Print View

Updated: Wednesday, July 27, 2022
 
 

pcap_get_selectable_fd (3pcap)

Name

pcap_get_selectable_fd - get a file descriptor on which a select() can be done for a live capture

Synopsis

#include <pcap/pcap.h>

int pcap_get_selectable_fd(pcap_t *p);

Description

                                                 PCAP_GET_SELECTABLE_FD(3pcap)



NAME
       pcap_get_selectable_fd  - get a file descriptor on which a select() can
       be done for a live capture

SYNOPSIS
       #include <pcap/pcap.h>

       int pcap_get_selectable_fd(pcap_t *p);

DESCRIPTION
       pcap_get_selectable_fd() returns, on UNIX, a file descriptor number for
       a   file   descriptor  on  which  one  can  do  a  select(2),  poll(2),
       epoll_wait(2), kevent(), or other such call to wait for it to be possi-
       ble  to  read packets without blocking, if such a descriptor exists, or
       PCAP_ERROR, if no such descriptor exists.

       Some network devices  opened  with  pcap_create(3PCAP)  and  pcap_acti-
       vate(3PCAP),  or with pcap_open_live(3PCAP), do not support those calls
       (for example, regular network devices  on  FreeBSD  4.3  and  4.4,  and
       Endace  DAG  devices), so PCAP_ERROR is returned for those devices.  In
       that case, those calls must be given a timeout less than  or  equal  to
       the timeout returned by pcap_get_required_select_timeout(3PCAP) for the
       device for  which  pcap_get_selectable_fd()  returned  PCAP_ERROR,  the
       device   must   be   put   in   non-blocking   mode   with  a  call  to
       pcap_setnonblock(3PCAP), and an attempt must always  be  made  to  read
       packets    from    the    device    when    the   call   returns.    If
       pcap_get_required_select_timeout() returns NULL, it is not possible  to
       wait for packets to arrive on the device in an event loop.

       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 time-
       out has expired.  A call to pcap_dispatch(3PCAP) or pcap_next_ex(3PCAP)
       will return 0 in this case, but will not block.

       Note that in:

              FreeBSD prior to FreeBSD 4.6;

              NetBSD prior to NetBSD 3.0;

              OpenBSD prior to OpenBSD 2.4;

              Mac OS X prior to Mac OS X 10.7;

       select(), poll(), and kevent() do not work correctly  on  BPF  devices;
       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
       select(),  poll(), or kevent() call will not indicate that the descrip-
       tor 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
       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 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.)

       Note  also  that  poll() and kevent() doesn't work on character special
       files, including BPF devices, in Mac OS X  10.4  and  10.5,  so,  while
       select()    can    be    used    on    the   descriptor   returned   by
       pcap_get_selectable_fd(), poll() and kevent()  cannot  be  used  on  it
       those  versions  of  Mac OS X.  poll(), but not kevent(), works on that
       descriptor in Mac OS X releases prior to 10.4; poll() and kevent() work
       on that descriptor in Mac OS X 10.6 and later.

       pcap_get_selectable_fd() is not available on Windows.

RETURN VALUE
       A  selectable  file  descriptor  is  returned if one exists; otherwise,
       PCAP_ERROR is returned.


ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:


       +---------------+------------------------+
       |ATTRIBUTE TYPE |    ATTRIBUTE VALUE     |
       +---------------+------------------------+
       |Availability   | system/library/libpcap |
       +---------------+------------------------+
       |Stability      | Uncommitted            |
       +---------------+------------------------+

SEE ALSO
       pcap(3PCAP), kqueue(2)



NOTES
       Source code for open source software components in Oracle  Solaris  can
       be found at https://www.oracle.com/downloads/opensource/solaris-source-
       code-downloads.html.

       This    software    was    built    from    source     available     at
       https://github.com/oracle/solaris-userland.    The  original  community
       source  was  downloaded   from    https://www.tcpdump.org/release/libp-
       cap-1.9.1.tar.gz.

       Further information about this software can be found on the open source
       community website at https://www.tcpdump.org/.



                                 25 July 2018
                                                 PCAP_GET_SELECTABLE_FD(3pcap)