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