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