blob: 8c6c2ff41cc948fe361477388d71b10b80c2f0c3 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
Elliott Hughes3503ce22013-11-05 13:28:36 -080028
Elliott Hughescfac8d02019-10-02 14:12:31 -070029#pragma once
30
31/**
32 * @file sys/select.h
33 * @brief Wait for events on a set of file descriptors (but use <poll.h> instead).
34 */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080035
Yabin Cuidb499032014-12-09 20:15:48 -080036#include <sys/cdefs.h>
37#include <sys/types.h>
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080038
Josh Gao16016df2016-11-07 18:27:16 -080039#include <linux/time.h>
40#include <signal.h>
41
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080042__BEGIN_DECLS
43
Elliott Hughesa6714d12017-12-04 14:16:38 -080044typedef unsigned long fd_mask;
45
Elliott Hughescfac8d02019-10-02 14:12:31 -070046/**
47 * The limit on the largest fd that can be used with this API.
48 * Use <poll.h> instead.
49 */
Elliott Hughes3503ce22013-11-05 13:28:36 -080050#define FD_SETSIZE 1024
Elliott Hughesa6714d12017-12-04 14:16:38 -080051#define NFDBITS (8 * sizeof(fd_mask))
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080052
Elliott Hughescfac8d02019-10-02 14:12:31 -070053/**
54 * The type of a file descriptor set. Limited to 1024 fds.
55 * Use <poll.h> instead.
56 */
Elliott Hughesd3e64a32013-09-30 17:41:08 -070057typedef struct {
Elliott Hughesa6714d12017-12-04 14:16:38 -080058 fd_mask fds_bits[FD_SETSIZE/NFDBITS];
Elliott Hughesd3e64a32013-09-30 17:41:08 -070059} fd_set;
60
Elliott Hughes3503ce22013-11-05 13:28:36 -080061#define __FDELT(fd) ((fd) / NFDBITS)
62#define __FDMASK(fd) (1UL << ((fd) % NFDBITS))
Elliott Hughesa6714d12017-12-04 14:16:38 -080063#define __FDS_BITS(type,set) (__BIONIC_CAST(static_cast, type, set)->fds_bits)
Elliott Hughes3503ce22013-11-05 13:28:36 -080064
Elliott Hughes5038b192015-01-28 21:02:34 -080065/* Inline loop so we don't have to declare memset. */
66#define FD_ZERO(set) \
67 do { \
68 size_t __i; \
Elliott Hughesa6714d12017-12-04 14:16:38 -080069 for (__i = 0; __i < sizeof(fd_set)/sizeof(fd_mask); ++__i) { \
Elliott Hughes5038b192015-01-28 21:02:34 -080070 (set)->fds_bits[__i] = 0; \
71 } \
72 } while (0)
Nick Kralevich7943df62013-10-03 14:08:39 -070073
zijunzhao271abeb2023-04-20 01:19:03 +000074void __FD_CLR_chk(int, fd_set* _Nonnull , size_t) __INTRODUCED_IN(21);
75void __FD_SET_chk(int, fd_set* _Nonnull, size_t) __INTRODUCED_IN(21);
76int __FD_ISSET_chk(int, const fd_set* _Nonnull, size_t) __INTRODUCED_IN(21);
Dan Albert658727e2014-10-07 11:10:36 -070077
Andreas Gampe00a6d5f2018-04-13 13:52:10 -070078#define __FD_CLR(fd, set) (__FDS_BITS(fd_set*,set)[__FDELT(fd)] &= ~__FDMASK(fd))
79#define __FD_SET(fd, set) (__FDS_BITS(fd_set*,set)[__FDELT(fd)] |= __FDMASK(fd))
80#define __FD_ISSET(fd, set) ((__FDS_BITS(const fd_set*,set)[__FDELT(fd)] & __FDMASK(fd)) != 0)
81
Elliott Hughescfac8d02019-10-02 14:12:31 -070082/** Removes `fd` from the given set. Use <poll.h> instead. */
Elliott Hughes3503ce22013-11-05 13:28:36 -080083#define FD_CLR(fd, set) __FD_CLR_chk(fd, set, __bos(set))
Elliott Hughescfac8d02019-10-02 14:12:31 -070084/** Adds `fd` to the given set. Use <poll.h> instead. */
Elliott Hughes3503ce22013-11-05 13:28:36 -080085#define FD_SET(fd, set) __FD_SET_chk(fd, set, __bos(set))
Elliott Hughescfac8d02019-10-02 14:12:31 -070086/** Tests whether `fd` is in the given set. Use <poll.h> instead. */
Elliott Hughes3503ce22013-11-05 13:28:36 -080087#define FD_ISSET(fd, set) __FD_ISSET_chk(fd, set, __bos(set))
Elliott Hughescfac8d02019-10-02 14:12:31 -070088
Elliott Hughescfac8d02019-10-02 14:12:31 -070089/**
90 * [select(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -070091 * set of file descriptors.
92 *
93 * Use poll() instead.
Elliott Hughescfac8d02019-10-02 14:12:31 -070094 *
95 * Returns the number of ready file descriptors on success, 0 for timeout,
96 * and returns -1 and sets `errno` on failure.
97 */
zijunzhao271abeb2023-04-20 01:19:03 +000098int select(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, struct timeval* _Nullable __timeout);
Elliott Hughescfac8d02019-10-02 14:12:31 -070099
100/**
101 * [pselect(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -0700102 * set of file descriptors.
103 *
104 * Use ppoll() instead.
Elliott Hughescfac8d02019-10-02 14:12:31 -0700105 *
106 * Returns the number of ready file descriptors on success, 0 for timeout,
107 * and returns -1 and sets `errno` on failure.
108 */
zijunzhao271abeb2023-04-20 01:19:03 +0000109int pselect(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, const struct timespec* _Nullable __timeout, const sigset_t* _Nullable __mask);
Elliott Hughescfac8d02019-10-02 14:12:31 -0700110
111/**
112 * [pselect64(2)](http://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -0700113 * set of file descriptors.
114 *
115 * Use ppoll64() instead.
Elliott Hughescfac8d02019-10-02 14:12:31 -0700116 *
117 * Returns the number of ready file descriptors on success, 0 for timeout,
118 * and returns -1 and sets `errno` on failure.
119 *
120 * Available since API level 28.
121 */
zijunzhao271abeb2023-04-20 01:19:03 +0000122int pselect64(int __max_fd_plus_one, fd_set* _Nullable __read_fds, fd_set* _Nullable __write_fds, fd_set* _Nullable __exception_fds, const struct timespec* _Nullable __timeout, const sigset64_t* _Nullable __mask) __INTRODUCED_IN(28);
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800123
124__END_DECLS