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 {
|
|
uint32_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_ */
|