8de9cc7079
Folks found the use of @rststar/@endrststar non-intuitive (wanted to use @rststart). The "star" was there indicating the doxygen comment lines had a leading asterisk that needed to be stripped, but since our commenting convention is to use the leading asterisk on continuation lines, the leading asterisk is always there. So, change the doxygen alias to the more expected @rst/@endrst. Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
156 lines
3.7 KiB
C
156 lines
3.7 KiB
C
/*
|
|
* Copyright (c) 2019 Linaro Limited
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_NET_SOCKET_SELECT_H_
|
|
#define ZEPHYR_INCLUDE_NET_SOCKET_SELECT_H_
|
|
|
|
/**
|
|
* @brief BSD Sockets compatible API
|
|
* @defgroup bsd_sockets BSD Sockets compatible API
|
|
* @ingroup networking
|
|
* @{
|
|
*/
|
|
|
|
#include <zephyr/types.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct zsock_timeval {
|
|
/* Using longs, as many (?) implementations seem to use it. */
|
|
long tv_sec;
|
|
long tv_usec;
|
|
};
|
|
|
|
typedef struct zsock_fd_set {
|
|
u32_t bitset[(CONFIG_POSIX_MAX_FDS + 31) / 32];
|
|
} zsock_fd_set;
|
|
|
|
|
|
/**
|
|
* @brief Legacy function to poll multiple sockets for events
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html>`__
|
|
* for normative description. This function is provided to ease porting of
|
|
* existing code and not recommended for usage due to its inefficiency,
|
|
* use :c:func:`zsock_poll()` instead. In Zephyr this function works only with
|
|
* sockets, not arbitrary file descriptors.
|
|
* This function is also exposed as ``select()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined (in which case
|
|
* it may conflict with generic POSIX ``select()`` function).
|
|
* @endrst
|
|
*/
|
|
int zsock_select(int nfds, zsock_fd_set *readfds, zsock_fd_set *writefds,
|
|
zsock_fd_set *exceptfds, struct zsock_timeval *timeout);
|
|
|
|
/** Number of file descriptors which can be added to zsock_fd_set */
|
|
#define ZSOCK_FD_SETSIZE (sizeof(((zsock_fd_set *)0)->bitset) * 8)
|
|
|
|
/**
|
|
* @brief Initialize (clear) fd_set
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``FD_ZERO()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
void ZSOCK_FD_ZERO(zsock_fd_set *set);
|
|
|
|
/**
|
|
* @brief Check whether socket is a member of fd_set
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``FD_ISSET()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
int ZSOCK_FD_ISSET(int fd, zsock_fd_set *set);
|
|
|
|
/**
|
|
* @brief Remove socket from fd_set
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``FD_CLR()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
void ZSOCK_FD_CLR(int fd, zsock_fd_set *set);
|
|
|
|
/**
|
|
* @brief Add socket to fd_set
|
|
*
|
|
* @details
|
|
* @rst
|
|
* See `POSIX.1-2017 article
|
|
* <http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html>`__
|
|
* for normative description.
|
|
* This function is also exposed as ``FD_SET()``
|
|
* if :option:`CONFIG_NET_SOCKETS_POSIX_NAMES` is defined.
|
|
* @endrst
|
|
*/
|
|
void ZSOCK_FD_SET(int fd, zsock_fd_set *set);
|
|
|
|
#ifdef CONFIG_NET_SOCKETS_POSIX_NAMES
|
|
|
|
#define fd_set zsock_fd_set
|
|
#define timeval zsock_timeval
|
|
#define FD_SETSIZE ZSOCK_FD_SETSIZE
|
|
|
|
static inline int select(int nfds, zsock_fd_set *readfds,
|
|
zsock_fd_set *writefds, zsock_fd_set *exceptfds,
|
|
struct timeval *timeout)
|
|
{
|
|
return zsock_select(nfds, readfds, writefds, exceptfds, timeout);
|
|
}
|
|
|
|
static inline void FD_ZERO(zsock_fd_set *set)
|
|
{
|
|
ZSOCK_FD_ZERO(set);
|
|
}
|
|
|
|
static inline int FD_ISSET(int fd, zsock_fd_set *set)
|
|
{
|
|
return ZSOCK_FD_ISSET(fd, set);
|
|
}
|
|
|
|
static inline void FD_CLR(int fd, zsock_fd_set *set)
|
|
{
|
|
ZSOCK_FD_CLR(fd, set);
|
|
}
|
|
|
|
static inline void FD_SET(int fd, zsock_fd_set *set)
|
|
{
|
|
ZSOCK_FD_SET(fd, set);
|
|
}
|
|
|
|
#endif /* CONFIG_NET_SOCKETS_POSIX_NAMES */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* ZEPHYR_INCLUDE_NET_SOCKET_SELECT_H_ */
|