1eba8b6baSopenharmony_ci// This file includes selected Linux header files, and supplementary
2eba8b6baSopenharmony_ci// definitions, needed for general-purpose code.
3eba8b6baSopenharmony_ci
4eba8b6baSopenharmony_ci#include "support.h"
5eba8b6baSopenharmony_ci
6eba8b6baSopenharmony_ci// Selected Linux headers.
7eba8b6baSopenharmony_ci
8eba8b6baSopenharmony_ci#include <linux/auxvec.h>
9eba8b6baSopenharmony_ci#include <linux/eventpoll.h>
10eba8b6baSopenharmony_ci#include <linux/fadvise.h>
11eba8b6baSopenharmony_ci#include <linux/falloc.h>
12eba8b6baSopenharmony_ci#include <linux/fcntl.h>
13eba8b6baSopenharmony_ci#include <linux/fs.h>
14eba8b6baSopenharmony_ci#include <linux/futex.h>
15eba8b6baSopenharmony_ci#include <linux/in.h>
16eba8b6baSopenharmony_ci#include <linux/inotify.h>
17eba8b6baSopenharmony_ci#include <linux/ip.h>
18eba8b6baSopenharmony_ci#include <linux/in6.h>
19eba8b6baSopenharmony_ci#include <linux/ipv6.h>
20eba8b6baSopenharmony_ci#include <linux/limits.h>
21eba8b6baSopenharmony_ci#include <linux/magic.h>
22eba8b6baSopenharmony_ci#include <linux/mman.h>
23eba8b6baSopenharmony_ci#include <linux/net.h>
24eba8b6baSopenharmony_ci#include <linux/poll.h>
25eba8b6baSopenharmony_ci#include <linux/prctl.h>
26eba8b6baSopenharmony_ci#include <linux/random.h>
27eba8b6baSopenharmony_ci#include <linux/resource.h>
28eba8b6baSopenharmony_ci#include <linux/sched.h>
29eba8b6baSopenharmony_ci#include <linux/signal.h>
30eba8b6baSopenharmony_ci#include <linux/socket.h>
31eba8b6baSopenharmony_ci#include <linux/stat.h>
32eba8b6baSopenharmony_ci#include <linux/sysinfo.h>
33eba8b6baSopenharmony_ci#include <linux/tcp.h>
34eba8b6baSopenharmony_ci#include <linux/termios.h>
35eba8b6baSopenharmony_ci#include <linux/time.h>
36eba8b6baSopenharmony_ci#include <linux/types.h>
37eba8b6baSopenharmony_ci#include <linux/uio.h>
38eba8b6baSopenharmony_ci#include <linux/un.h>
39eba8b6baSopenharmony_ci#include <linux/unistd.h>
40eba8b6baSopenharmony_ci#include <linux/utsname.h>
41eba8b6baSopenharmony_ci#include <linux/wait.h>
42eba8b6baSopenharmony_ci
43eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)
44eba8b6baSopenharmony_ci#include <linux/memfd.h>
45eba8b6baSopenharmony_ci#endif
46eba8b6baSopenharmony_ci
47eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
48eba8b6baSopenharmony_ci#include <linux/membarrier.h>
49eba8b6baSopenharmony_ci#endif
50eba8b6baSopenharmony_ci
51eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0)
52eba8b6baSopenharmony_ci#include <linux/timerfd.h>
53eba8b6baSopenharmony_ci#endif
54eba8b6baSopenharmony_ci
55eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
56eba8b6baSopenharmony_ci#include <linux/openat2.h>
57eba8b6baSopenharmony_ci#endif
58eba8b6baSopenharmony_ci
59eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
60eba8b6baSopenharmony_ci#include <linux/userfaultfd.h>
61eba8b6baSopenharmony_ci#endif
62eba8b6baSopenharmony_ci
63eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,1,0)
64eba8b6baSopenharmony_ci#include <linux/io_uring.h>
65eba8b6baSopenharmony_ci#endif
66eba8b6baSopenharmony_ci
67eba8b6baSopenharmony_ci// Miscellaneous definitions which don't appear to be defined in Linux's public
68eba8b6baSopenharmony_ci// headers, but which are nonetheless part of the ABI, and necessary for
69eba8b6baSopenharmony_ci// interoperability.
70eba8b6baSopenharmony_ci//
71eba8b6baSopenharmony_ci// When adding definitions here, please only include content needed for
72eba8b6baSopenharmony_ci// interoperability with Linux's public ABI, and please only include types
73eba8b6baSopenharmony_ci// and constants.
74eba8b6baSopenharmony_ci//
75eba8b6baSopenharmony_ci// In particular, please don't copy comments from other sources. And please
76eba8b6baSopenharmony_ci// don't include any functions or function-style macros, as bindgen isn't
77eba8b6baSopenharmony_ci// able to generate bindings for them.
78eba8b6baSopenharmony_ci//
79eba8b6baSopenharmony_ci// Also, please be aware that libc implementations (and thus the Rust libc
80eba8b6baSopenharmony_ci// crate as well) sometimes define types and constants with similar names but
81eba8b6baSopenharmony_ci// which are ABI-incompatible with the Linux kernel ABI. This file should
82eba8b6baSopenharmony_ci// only describe the kernel ABI.
83eba8b6baSopenharmony_ci
84eba8b6baSopenharmony_cistruct sockaddr {
85eba8b6baSopenharmony_ci    struct __kernel_sockaddr_storage __storage;
86eba8b6baSopenharmony_ci};
87eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,32)
88eba8b6baSopenharmony_citypedef uint16_t __kernel_sa_family_t;
89eba8b6baSopenharmony_ci#endif
90eba8b6baSopenharmony_ci
91eba8b6baSopenharmony_cistruct linger {
92eba8b6baSopenharmony_ci    int l_onoff;
93eba8b6baSopenharmony_ci    int l_linger;
94eba8b6baSopenharmony_ci};
95eba8b6baSopenharmony_ci
96eba8b6baSopenharmony_ci#if LINUX_VERSION_CODE <= KERNEL_VERSION(4,4,0)
97eba8b6baSopenharmony_citypedef long long __kernel_time64_t;
98eba8b6baSopenharmony_cistruct __kernel_timespec {
99eba8b6baSopenharmony_ci    __kernel_time64_t tv_sec;
100eba8b6baSopenharmony_ci    long long         tv_nsec;
101eba8b6baSopenharmony_ci};
102eba8b6baSopenharmony_ci#endif
103eba8b6baSopenharmony_ci
104eba8b6baSopenharmony_ci#define DT_UNKNOWN 0
105eba8b6baSopenharmony_ci#define DT_FIFO    1
106eba8b6baSopenharmony_ci#define DT_CHR     2
107eba8b6baSopenharmony_ci#define DT_DIR     4
108eba8b6baSopenharmony_ci#define DT_BLK     6
109eba8b6baSopenharmony_ci#define DT_REG     8
110eba8b6baSopenharmony_ci#define DT_LNK    10
111eba8b6baSopenharmony_ci#define DT_SOCK   12
112eba8b6baSopenharmony_ci
113eba8b6baSopenharmony_ci#define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
114eba8b6baSopenharmony_ci#define WIFEXITED(status)   (((status) & 0x7f) == 0)
115eba8b6baSopenharmony_ci
116eba8b6baSopenharmony_ci#define SHUT_RD   0
117eba8b6baSopenharmony_ci#define SHUT_WR   1
118eba8b6baSopenharmony_ci#define SHUT_RDWR 2
119eba8b6baSopenharmony_ci
120eba8b6baSopenharmony_cistruct linux_dirent64 {
121eba8b6baSopenharmony_ci    __UINT64_TYPE__ d_ino;
122eba8b6baSopenharmony_ci    __INT64_TYPE__  d_off;
123eba8b6baSopenharmony_ci    __u16           d_reclen;
124eba8b6baSopenharmony_ci    __u8            d_type;
125eba8b6baSopenharmony_ci    char            d_name[];
126eba8b6baSopenharmony_ci};
127eba8b6baSopenharmony_ci
128eba8b6baSopenharmony_citypedef __UINT32_TYPE__ socklen_t;
129eba8b6baSopenharmony_ci
130eba8b6baSopenharmony_ci// Obtain the definitions of structs stat/stat64 and statfs/statfs64.
131eba8b6baSopenharmony_ci#include <asm/stat.h>
132eba8b6baSopenharmony_ci#include <asm/statfs.h>
133eba8b6baSopenharmony_ci
134eba8b6baSopenharmony_ci// Linux only defines this as a macro; make it available as a typedef.
135eba8b6baSopenharmony_ci// And use the libc name. And mips and s390x are special.
136eba8b6baSopenharmony_ci#if defined(__mips__) || defined(__s390x__)
137eba8b6baSopenharmony_citypedef __u32 __fsword_t;
138eba8b6baSopenharmony_ci#elif defined(__mips64__)
139eba8b6baSopenharmony_citypedef long __fsword_t;
140eba8b6baSopenharmony_ci#else
141eba8b6baSopenharmony_citypedef __statfs_word __fsword_t;
142eba8b6baSopenharmony_ci#endif
143eba8b6baSopenharmony_ci
144eba8b6baSopenharmony_ci#if defined(__mips__) || defined(__mips64__)
145eba8b6baSopenharmony_ci#define SOCK_STREAM    2
146eba8b6baSopenharmony_ci#define SOCK_DGRAM     1
147eba8b6baSopenharmony_ci#else
148eba8b6baSopenharmony_ci#define SOCK_STREAM    1
149eba8b6baSopenharmony_ci#define SOCK_DGRAM     2
150eba8b6baSopenharmony_ci#endif
151eba8b6baSopenharmony_ci#define SOCK_RAW       3
152eba8b6baSopenharmony_ci#define SOCK_RDM       4
153eba8b6baSopenharmony_ci#define SOCK_SEQPACKET 5
154eba8b6baSopenharmony_ci
155eba8b6baSopenharmony_ci#define F_OK 0
156eba8b6baSopenharmony_ci#define R_OK 4
157eba8b6baSopenharmony_ci#define W_OK 2
158eba8b6baSopenharmony_ci#define X_OK 1
159eba8b6baSopenharmony_ci
160eba8b6baSopenharmony_ci#define UTIME_NOW 0x3fffffff
161eba8b6baSopenharmony_ci#define UTIME_OMIT 0x3ffffffe
162eba8b6baSopenharmony_ci
163eba8b6baSopenharmony_ci#define MSG_DONTWAIT 0x40
164eba8b6baSopenharmony_ci
165eba8b6baSopenharmony_ci#define AF_UNSPEC     0
166eba8b6baSopenharmony_ci#define AF_UNIX       1
167eba8b6baSopenharmony_ci#define AF_INET       2
168eba8b6baSopenharmony_ci#define AF_AX25       3
169eba8b6baSopenharmony_ci#define AF_IPX        4
170eba8b6baSopenharmony_ci#define AF_APPLETALK  5
171eba8b6baSopenharmony_ci#define AF_NETROM     6
172eba8b6baSopenharmony_ci#define AF_BRIDGE     7
173eba8b6baSopenharmony_ci#define AF_ATMPVC     8
174eba8b6baSopenharmony_ci#define AF_X25        9
175eba8b6baSopenharmony_ci#define AF_INET6      10
176eba8b6baSopenharmony_ci#define AF_ROSE       11
177eba8b6baSopenharmony_ci#define AF_DECnet     12
178eba8b6baSopenharmony_ci#define AF_NETBEUI    13
179eba8b6baSopenharmony_ci#define AF_SECURITY   14
180eba8b6baSopenharmony_ci#define AF_KEY        15
181eba8b6baSopenharmony_ci#define AF_NETLINK    16
182eba8b6baSopenharmony_ci#define AF_PACKET     17
183eba8b6baSopenharmony_ci#define AF_ASH        18
184eba8b6baSopenharmony_ci#define AF_ECONET     19
185eba8b6baSopenharmony_ci#define AF_ATMSVC     20
186eba8b6baSopenharmony_ci#define AF_RDS        21
187eba8b6baSopenharmony_ci#define AF_SNA        22
188eba8b6baSopenharmony_ci#define AF_IRDA       23
189eba8b6baSopenharmony_ci#define AF_PPPOX      24
190eba8b6baSopenharmony_ci#define AF_WANPIPE    25
191eba8b6baSopenharmony_ci#define AF_LLC        26
192eba8b6baSopenharmony_ci#define AF_CAN        29
193eba8b6baSopenharmony_ci#define AF_TIPC       30
194eba8b6baSopenharmony_ci#define AF_BLUETOOTH  31
195eba8b6baSopenharmony_ci#define AF_IUCV       32
196eba8b6baSopenharmony_ci#define AF_RXRPC      33
197eba8b6baSopenharmony_ci#define AF_ISDN       34
198eba8b6baSopenharmony_ci#define AF_PHONET     35
199eba8b6baSopenharmony_ci#define AF_IEEE802154 36
200eba8b6baSopenharmony_ci#define AF_MAX        37
201eba8b6baSopenharmony_ci
202eba8b6baSopenharmony_ci#define MSG_OOB          0x1
203eba8b6baSopenharmony_ci#define MSG_PEEK         0x2
204eba8b6baSopenharmony_ci#define MSG_DONTROUTE    0x4
205eba8b6baSopenharmony_ci#define MSG_CTRUNC       0x8
206eba8b6baSopenharmony_ci#define MSG_PROBE        0x10
207eba8b6baSopenharmony_ci#define MSG_TRUNC        0x20
208eba8b6baSopenharmony_ci#define MSG_DONTWAIT     0x40
209eba8b6baSopenharmony_ci#define MSG_EOR          0x80
210eba8b6baSopenharmony_ci#define MSG_WAITALL      0x100
211eba8b6baSopenharmony_ci#define MSG_FIN          0x200
212eba8b6baSopenharmony_ci#define MSG_SYN          0x400
213eba8b6baSopenharmony_ci#define MSG_CONFIRM      0x800
214eba8b6baSopenharmony_ci#define MSG_RST          0x1000
215eba8b6baSopenharmony_ci#define MSG_ERRQUEUE     0x2000
216eba8b6baSopenharmony_ci#define MSG_NOSIGNAL     0x4000
217eba8b6baSopenharmony_ci#define MSG_MORE         0x8000
218eba8b6baSopenharmony_ci#define MSG_CMSG_CLOEXEC 0x40000000
219eba8b6baSopenharmony_ci
220eba8b6baSopenharmony_ci#define STDIN_FILENO  0
221eba8b6baSopenharmony_ci#define STDOUT_FILENO 1
222eba8b6baSopenharmony_ci#define STDERR_FILENO 2
223eba8b6baSopenharmony_ci
224eba8b6baSopenharmony_ci// Linux exports these, but the definitions have syntax that bindgen doesn't
225eba8b6baSopenharmony_ci// recognize as constants.
226eba8b6baSopenharmony_ci#undef RWF_HIPRI
227eba8b6baSopenharmony_ci#undef RWF_DSYNC
228eba8b6baSopenharmony_ci#undef RWF_SYNC
229eba8b6baSopenharmony_ci#undef RWF_NOWAIT
230eba8b6baSopenharmony_ci#undef RWF_APPEND
231eba8b6baSopenharmony_ci#define RWF_HIPRI       0x00000001
232eba8b6baSopenharmony_ci#define RWF_DSYNC       0x00000002
233eba8b6baSopenharmony_ci#define RWF_SYNC        0x00000004
234eba8b6baSopenharmony_ci#define RWF_NOWAIT      0x00000008
235eba8b6baSopenharmony_ci#define RWF_APPEND      0x00000010
236eba8b6baSopenharmony_ci
237eba8b6baSopenharmony_ci// Linux doesn't appear to export <linux/eventfd.h> at all.
238eba8b6baSopenharmony_ci#define EFD_SEMAPHORE   1
239eba8b6baSopenharmony_ci#define EFD_CLOEXEC     O_CLOEXEC
240eba8b6baSopenharmony_ci#define EFD_NONBLOCK    O_NONBLOCK
241eba8b6baSopenharmony_ci
242eba8b6baSopenharmony_ci// Flags for epoll_create1.
243eba8b6baSopenharmony_ci#define EPOLL_CLOEXEC O_CLOEXEC
244eba8b6baSopenharmony_ci
245eba8b6baSopenharmony_ci// Constants for `epoll_ctl`.
246eba8b6baSopenharmony_ci#define EPOLL_CTL_ADD 1
247eba8b6baSopenharmony_ci#define EPOLL_CTL_DEL 2
248eba8b6baSopenharmony_ci#define EPOLL_CTL_MOD 3
249eba8b6baSopenharmony_ci
250eba8b6baSopenharmony_ci// Flags for epoll events
251eba8b6baSopenharmony_ci#define EPOLLIN        0x00000001
252eba8b6baSopenharmony_ci#define EPOLLPRI       0x00000002
253eba8b6baSopenharmony_ci#define EPOLLOUT       0x00000004
254eba8b6baSopenharmony_ci#define EPOLLERR       0x00000008
255eba8b6baSopenharmony_ci#define EPOLLHUP       0x00000010
256eba8b6baSopenharmony_ci#define EPOLLNVAL      0x00000020
257eba8b6baSopenharmony_ci#define EPOLLRDNORM    0x00000040
258eba8b6baSopenharmony_ci#define EPOLLRDBAND    0x00000080
259eba8b6baSopenharmony_ci#define EPOLLWRNORM    0x00000100
260eba8b6baSopenharmony_ci#define EPOLLWRBAND    0x00000200
261eba8b6baSopenharmony_ci#define EPOLLMSG       0x00000400
262eba8b6baSopenharmony_ci#define EPOLLRDHUP     0x00002000
263eba8b6baSopenharmony_ci#define EPOLLEXCLUSIVE 0x10000000
264eba8b6baSopenharmony_ci#define EPOLLWAKEUP    0x20000000
265eba8b6baSopenharmony_ci#define EPOLLONESHOT   0x40000000
266eba8b6baSopenharmony_ci#define EPOLLET        0x80000000
267eba8b6baSopenharmony_ci
268eba8b6baSopenharmony_ci// Flags for timerfd
269eba8b6baSopenharmony_ci#define TFD_TIMER_ABSTIME      1
270eba8b6baSopenharmony_ci#define TFD_CLOEXEC            O_CLOEXEC
271eba8b6baSopenharmony_ci#define TFD_NONBLOCK           O_NONBLOCK
272eba8b6baSopenharmony_ci#define TFD_SHARED_FCNTL_FLAGS (TFD_CLOEXEC | TFD_NONBLOCK)
273eba8b6baSopenharmony_ci#define TFD_CREATE_FLAGS       TFD_SHARED_FCNTL_FLAGS
274eba8b6baSopenharmony_ci#define TFD_SETTIME_FLAGS      TFD_TIMER_ABSTIME
275eba8b6baSopenharmony_ci
276eba8b6baSopenharmony_cistruct user_desc {
277eba8b6baSopenharmony_ci    unsigned entry_number;
278eba8b6baSopenharmony_ci    unsigned base_addr;
279eba8b6baSopenharmony_ci    unsigned limit;
280eba8b6baSopenharmony_ci    unsigned seg_32bit:1;
281eba8b6baSopenharmony_ci    unsigned contents:2;
282eba8b6baSopenharmony_ci    unsigned read_exec_only:1;
283eba8b6baSopenharmony_ci    unsigned limit_in_pages:1;
284eba8b6baSopenharmony_ci    unsigned seg_not_present:1;
285eba8b6baSopenharmony_ci    unsigned useable:1;
286eba8b6baSopenharmony_ci#ifdef __x86_64__
287eba8b6baSopenharmony_ci    unsigned lm:1;
288eba8b6baSopenharmony_ci#endif
289eba8b6baSopenharmony_ci};
290eba8b6baSopenharmony_ci
291eba8b6baSopenharmony_ci#if defined(__x86_64__) || defined(__i386__)
292eba8b6baSopenharmony_ci#define ARCH_SET_FS 0x1002
293eba8b6baSopenharmony_ci#endif
294eba8b6baSopenharmony_ci
295eba8b6baSopenharmony_cistruct msghdr {
296eba8b6baSopenharmony_ci    void         *msg_name;
297eba8b6baSopenharmony_ci    int           msg_namelen;
298eba8b6baSopenharmony_ci    struct iovec *msg_iov;
299eba8b6baSopenharmony_ci    size_t        msg_iovlen;
300eba8b6baSopenharmony_ci    void         *msg_control;
301eba8b6baSopenharmony_ci    size_t        msg_controllen;
302eba8b6baSopenharmony_ci    unsigned int  msg_flags;
303eba8b6baSopenharmony_ci};
304eba8b6baSopenharmony_ci
305eba8b6baSopenharmony_cistruct cmsghdr {
306eba8b6baSopenharmony_ci    size_t cmsg_len;
307eba8b6baSopenharmony_ci    int    cmsg_level;
308eba8b6baSopenharmony_ci    int    cmsg_type;
309eba8b6baSopenharmony_ci};
310eba8b6baSopenharmony_ci
311eba8b6baSopenharmony_ci
312eba8b6baSopenharmony_ci#define SCM_RIGHTS      0x01
313eba8b6baSopenharmony_ci#define SCM_CREDENTIALS 0x02
314eba8b6baSopenharmony_ci#define SCM_SECURITY    0x03
315eba8b6baSopenharmony_ci
316eba8b6baSopenharmony_cistruct ucred {
317eba8b6baSopenharmony_ci    __u32 pid;
318eba8b6baSopenharmony_ci    __u32 uid;
319eba8b6baSopenharmony_ci    __u32 gid;
320eba8b6baSopenharmony_ci};
321eba8b6baSopenharmony_ci
322eba8b6baSopenharmony_cistruct mmsghdr {
323eba8b6baSopenharmony_ci    struct msghdr msg_hdr;
324eba8b6baSopenharmony_ci    unsigned int  msg_len;
325eba8b6baSopenharmony_ci};
326eba8b6baSopenharmony_ci
327eba8b6baSopenharmony_ci#define UFFD_API 0xAA
328eba8b6baSopenharmony_ci
329eba8b6baSopenharmony_ci#define UFFDIO_REGISTER_MODE_MISSING  0x1
330eba8b6baSopenharmony_ci#define UFFDIO_REGISTER_MODE_WP       0x2
331eba8b6baSopenharmony_ci#define UFFDIO_REGISTER_MODE_MINOR    0x4
332eba8b6baSopenharmony_ci
333eba8b6baSopenharmony_ci#define UFFDIO_COPY_MODE_DONTWAKE     0x1
334eba8b6baSopenharmony_ci#define UFFDIO_COPY_MODE_WP           0x2
335eba8b6baSopenharmony_ci
336eba8b6baSopenharmony_ci#define UFFDIO_ZEROPAGE_MODE_DONTWAKE 0x1
337eba8b6baSopenharmony_ci
338eba8b6baSopenharmony_ci#if defined(__mips)
339eba8b6baSopenharmony_ci#define POLLWRNORM 0x4
340eba8b6baSopenharmony_ci
341eba8b6baSopenharmony_ci#undef TCSANOW
342eba8b6baSopenharmony_ci#undef TCSADRAIN
343eba8b6baSopenharmony_ci#undef TCSAFLUSH
344eba8b6baSopenharmony_ci#define TCSANOW 0x540e
345eba8b6baSopenharmony_ci#define TCSADRAIN 0x540f
346eba8b6baSopenharmony_ci#define TCSAFLUSH 0x5410
347eba8b6baSopenharmony_ci#endif
348eba8b6baSopenharmony_ci
349eba8b6baSopenharmony_ci#define SPLICE_F_MOVE      1
350eba8b6baSopenharmony_ci#define SPLICE_F_NONBLOCK  2
351eba8b6baSopenharmony_ci#define SPLICE_F_MORE      4
352eba8b6baSopenharmony_ci#define SPLICE_F_GIFT      8
353