blob: 4183d9038a495f0c0b7dce27f9a6f640c97b9b39 [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
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080033 * @brief Wait for events on a set of file descriptors.
34 * New code should prefer the different interface specified in <poll.h> instead,
35 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -070036 */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080037
Yabin Cuidb499032014-12-09 20:15:48 -080038#include <sys/cdefs.h>
39#include <sys/types.h>
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080040
Josh Gao16016df2016-11-07 18:27:16 -080041#include <linux/time.h>
42#include <signal.h>
43
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080044__BEGIN_DECLS
45
Elliott Hughesa6714d12017-12-04 14:16:38 -080046typedef unsigned long fd_mask;
47
Elliott Hughescfac8d02019-10-02 14:12:31 -070048/**
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080049 * The limit on the largest fd that can be used with type `fd_set`.
50 * You can allocate your own memory,
51 * but new code should prefer the different interface specified in <poll.h> instead,
52 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -070053 */
Elliott Hughes3503ce22013-11-05 13:28:36 -080054#define FD_SETSIZE 1024
Elliott Hughesa6714d12017-12-04 14:16:38 -080055#define NFDBITS (8 * sizeof(fd_mask))
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080056
Elliott Hughescfac8d02019-10-02 14:12:31 -070057/**
58 * The type of a file descriptor set. Limited to 1024 fds.
Elliott Hughes61f6dbf2024-07-30 18:49:33 +000059 * The underlying system calls do not have this limit,
60 * and callers can allocate their own sets with calloc().
61 *
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080062 * New code should prefer the different interface specified in <poll.h> instead,
63 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -070064 */
Elliott Hughesd3e64a32013-09-30 17:41:08 -070065typedef struct {
Elliott Hughesa6714d12017-12-04 14:16:38 -080066 fd_mask fds_bits[FD_SETSIZE/NFDBITS];
Elliott Hughesd3e64a32013-09-30 17:41:08 -070067} fd_set;
68
Elliott Hughes3503ce22013-11-05 13:28:36 -080069#define __FDELT(fd) ((fd) / NFDBITS)
70#define __FDMASK(fd) (1UL << ((fd) % NFDBITS))
Elliott Hughes61f6dbf2024-07-30 18:49:33 +000071#define __FDS_BITS(type, set) (__BIONIC_CAST(static_cast, type, set)->fds_bits)
Nick Kralevich7943df62013-10-03 14:08:39 -070072
Elliott Hughes655e4302023-06-16 12:39:33 -070073void __FD_CLR_chk(int, fd_set* _Nonnull , size_t);
74void __FD_SET_chk(int, fd_set* _Nonnull, size_t);
75int __FD_ISSET_chk(int, const fd_set* _Nonnull, size_t);
Dan Albert658727e2014-10-07 11:10:36 -070076
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080077/**
78 * FD_CLR() with no bounds checking for users that allocated their own set.
79 * New code should prefer <poll.h> instead.
80 */
Elliott Hughes61f6dbf2024-07-30 18:49:33 +000081#define __FD_CLR(fd, set) (__FDS_BITS(fd_set*, set)[__FDELT(fd)] &= ~__FDMASK(fd))
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080082
83/**
84 * FD_SET() with no bounds checking for users that allocated their own set.
85 * New code should prefer <poll.h> instead.
86 */
Elliott Hughes61f6dbf2024-07-30 18:49:33 +000087#define __FD_SET(fd, set) (__FDS_BITS(fd_set*, set)[__FDELT(fd)] |= __FDMASK(fd))
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080088
89/**
90 * FD_ISSET() with no bounds checking for users that allocated their own set.
91 * New code should prefer <poll.h> instead.
92 */
Elliott Hughes61f6dbf2024-07-30 18:49:33 +000093#define __FD_ISSET(fd, set) ((__FDS_BITS(const fd_set*, set)[__FDELT(fd)] & __FDMASK(fd)) != 0)
Andreas Gampe00a6d5f2018-04-13 13:52:10 -070094
Elliott Hughesb6b3cce2024-12-12 14:31:58 -080095/**
96 * Removes all 1024 fds from the given set.
97 * Limited to fds under 1024.
98 * New code should prefer <poll.h> instead for this reason,
99 * rather than using memset() directly.
100 */
Elliott Hughes61f6dbf2024-07-30 18:49:33 +0000101#define FD_ZERO(set) __builtin_memset(set, 0, sizeof(*__BIONIC_CAST(static_cast, const fd_set*, set)))
102
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800103/**
104 * Removes `fd` from the given set.
105 * Limited to fds under 1024.
106 * New code should prefer <poll.h> instead for this reason,
107 * rather than using __FD_CLR().
108 */
Elliott Hughes3503ce22013-11-05 13:28:36 -0800109#define FD_CLR(fd, set) __FD_CLR_chk(fd, set, __bos(set))
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800110
111/**
112 * Adds `fd` to the given set.
113 * Limited to fds under 1024.
114 * New code should prefer <poll.h> instead for this reason,
115 * rather than using __FD_SET().
116 */
Elliott Hughes3503ce22013-11-05 13:28:36 -0800117#define FD_SET(fd, set) __FD_SET_chk(fd, set, __bos(set))
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800118
119/**
120 * Tests whether `fd` is in the given set.
121 * Limited to fds under 1024.
122 * New code should prefer <poll.h> instead for this reason,
123 * rather than using __FD_ISSET().
124 */
Elliott Hughes3503ce22013-11-05 13:28:36 -0800125#define FD_ISSET(fd, set) __FD_ISSET_chk(fd, set, __bos(set))
Elliott Hughescfac8d02019-10-02 14:12:31 -0700126
Elliott Hughescfac8d02019-10-02 14:12:31 -0700127/**
Elliott Hughesbbd39aa2024-08-13 20:59:16 +0000128 * [select(2)](https://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -0700129 * set of file descriptors.
130 *
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800131 * New code should prefer poll() from <poll.h> instead,
132 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -0700133 *
134 * Returns the number of ready file descriptors on success, 0 for timeout,
135 * and returns -1 and sets `errno` on failure.
136 */
zijunzhao271abeb2023-04-20 01:19:03 +0000137int 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 -0700138
139/**
Elliott Hughesbbd39aa2024-08-13 20:59:16 +0000140 * [pselect(2)](https://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -0700141 * set of file descriptors.
142 *
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800143 * New code should prefer ppoll() from <poll.h> instead,
144 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -0700145 *
146 * Returns the number of ready file descriptors on success, 0 for timeout,
147 * and returns -1 and sets `errno` on failure.
148 */
zijunzhao271abeb2023-04-20 01:19:03 +0000149int 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 -0700150
151/**
Elliott Hughesbbd39aa2024-08-13 20:59:16 +0000152 * [pselect64(2)](https://man7.org/linux/man-pages/man2/select.2.html) waits on a
Elliott Hughesc849ef12021-06-17 14:41:29 -0700153 * set of file descriptors.
154 *
Elliott Hughesb6b3cce2024-12-12 14:31:58 -0800155 * New code should prefer ppoll64() from <poll.h> instead,
156 * because it scales better and easily avoids the limits on `fd_set` size.
Elliott Hughescfac8d02019-10-02 14:12:31 -0700157 *
158 * Returns the number of ready file descriptors on success, 0 for timeout,
159 * and returns -1 and sets `errno` on failure.
160 *
161 * Available since API level 28.
162 */
Dan Albert02ce4012024-10-25 19:13:49 +0000163#if __BIONIC_AVAILABILITY_GUARD(28)
zijunzhao271abeb2023-04-20 01:19:03 +0000164int 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);
Dan Albert02ce4012024-10-25 19:13:49 +0000165#endif /* __BIONIC_AVAILABILITY_GUARD(28) */
166
The Android Open Source Project1dc9e472009-03-03 19:28:35 -0800167__END_DECLS