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