/* * 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 #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 * `__ * 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 * `__ * 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 * `__ * 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 * `__ * 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 * `__ * 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_ */