diff --git a/.github/workflows/rust-libc.yml b/.github/workflows/rust-libc.yml index c72013718..71ec44eae 100644 --- a/.github/workflows/rust-libc.yml +++ b/.github/workflows/rust-libc.yml @@ -14,17 +14,24 @@ jobs: apt-get install -y meson ninja-build \ python3-setuptools python3-jsonschema \ python3-pexpect python3-pip python3-clang \ - netbase clang lld rustfmt git rsync + netbase clang lld git rsync nodejs rustup pip install --break-system-packages -U xbstrap pyexpect - name: Prepare directories run: | mkdir src/ mkdir src/mlibc/ + mkdir src/rust-libc/ mkdir build/ - name: Checkout uses: actions/checkout@v2 with: path: src/mlibc/ + - name: Checkout rust-libc + uses: actions/checkout@v4 + with: + repository: 'rust-lang/libc' + ref: '0.2.175' + path: src/rust-libc - name: Prepare src/ run: | cp mlibc/ci/bootstrap.yml . @@ -42,8 +49,16 @@ jobs: - name: Build mlibc run: 'xbstrap install mlibc-headers-only' working-directory: build/ + - name: Expand rust-libc sources + run: | + rustup toolchain install stable + cargo install cargo-expand + ~/.cargo/bin/cargo-expand expand unix > ../../build/libc-ignore.rs + cd ../mlibc/scripts/libc-parser + cargo run ../../../../build/libc-ignore.rs > ../../../../build/libc-ignore.yml + working-directory: src/rust-libc/ - name: Run generator run: | - python3 ./scripts/rust-libc.py ../../build/packages/mlibc-headers-only/usr/include gcc | rustfmt + python3 ./scripts/rust-libc.py ../../build/packages/mlibc-headers-only/usr/include gcc -c ./scripts/rust-libc-config.yml ../../build/libc-ignore.yml | rustfmt working-directory: src/mlibc/ diff --git a/abis/linux/blksize_t.h b/abis/linux/blksize_t.h index 02b207a7f..25abcbe32 100644 --- a/abis/linux/blksize_t.h +++ b/abis/linux/blksize_t.h @@ -2,7 +2,11 @@ #ifndef _ABIBITS_BLKSIZE_T_H #define _ABIBITS_BLKSIZE_T_H +#if defined(__x86_64__) || defined(__i386__) || defined(__m68k__) typedef long blksize_t; +#elif defined(__riscv) || defined(__aarch64__) || defined(__loongarch64) +typedef int blksize_t; +#endif #endif /* _ABIBITS_BLKSIZE_T_H */ diff --git a/abis/linux/nlink_t.h b/abis/linux/nlink_t.h index eb15553cd..c9c641679 100644 --- a/abis/linux/nlink_t.h +++ b/abis/linux/nlink_t.h @@ -2,7 +2,11 @@ #ifndef _ABIBITS_NLINK_T_H #define _ABIBITS_NLINK_T_H +#if defined(__x86_64__) typedef unsigned long nlink_t; +#else +typedef unsigned int nlink_t; +#endif #endif /* _ABIBITS_NLINK_T_H */ diff --git a/scripts/libc-parser/Cargo.lock b/scripts/libc-parser/Cargo.lock new file mode 100644 index 000000000..ecdca91e7 --- /dev/null +++ b/scripts/libc-parser/Cargo.lock @@ -0,0 +1,46 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "generate-rust-libc-ignorelist" +version = "0.1.0" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" diff --git a/scripts/libc-parser/Cargo.toml b/scripts/libc-parser/Cargo.toml new file mode 100644 index 000000000..baa600a63 --- /dev/null +++ b/scripts/libc-parser/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "generate-rust-libc-ignorelist" +version = "0.1.0" +description = "A program to generate the configuration for the rust-libc binding generator that respects the types that the libc crate already pre-defines for us." +license = "MIT" +edition = "2024" +publish = false + +[dependencies] +syn = { version = "2.0", features = ["full", "visit"] } +quote = "1.0" diff --git a/scripts/libc-parser/src/main.rs b/scripts/libc-parser/src/main.rs new file mode 100644 index 000000000..b19638c3d --- /dev/null +++ b/scripts/libc-parser/src/main.rs @@ -0,0 +1,224 @@ +use syn::{visit::Visit, File, ForeignItemFn, ItemConst, ItemEnum, ItemFn, ItemMod, ItemStruct, ItemType, ItemUnion, Visibility}; +use std::{env, fs, process}; + +#[derive(Default)] +struct Collector { + module_stack: Vec, + pub_consts: Vec, + pub_enums: Vec, + pub_fns: Vec, + pub_structs: Vec, + pub_unions: Vec, + pub_types: Vec, +} + +impl Collector { + fn ignore_mod(&self) -> bool { + if self.module_stack.len() > 2 || self.module_stack.is_empty() { + return true; + } + + if self.module_stack[0] != "unix" { + return true; + } + + if self.module_stack.len() == 2 && self.module_stack[1] != "linux_like" { + return true; + } + + false + } +} + +impl<'ast> Visit<'ast> for Collector { + fn visit_item_mod(&mut self, i: &'ast ItemMod) { + if let Some((_, items)) = &i.content { + self.module_stack.push(i.ident.to_string()); + for item in items { + self.visit_item(item); + } + self.module_stack.pop(); + } + } + + fn visit_item_const(&mut self, node: &'ast ItemConst) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_consts.push(node.ident.to_string()); + } + + // Continue visiting nested items (if any) + syn::visit::visit_item_const(self, node); + } + + fn visit_item_enum(&mut self, node: &'ast ItemEnum) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_enums.push(node.ident.to_string()); + } + + // Continue walking the tree if needed + syn::visit::visit_item_enum(self, node); + } + + fn visit_item_fn(&mut self, node: &'ast ItemFn) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_fns.push(node.sig.ident.to_string()); + } + + // Continue walking the tree if needed + syn::visit::visit_item_fn(self, node); + } + + fn visit_foreign_item_fn(&mut self, node: &'ast ForeignItemFn) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_fns.push(node.sig.ident.to_string()); + } + + // Continue walking the tree if needed + syn::visit::visit_foreign_item_fn(self, node); + } + + fn visit_item_struct(&mut self, node: &'ast ItemStruct) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_structs.push(node.ident.to_string()); + } + + // Continue walking the tree if needed + syn::visit::visit_item_struct(self, node); + } + + fn visit_item_union(&mut self, node: &'ast ItemUnion) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_unions.push(node.ident.to_string()); + } + + // Continue walking the tree if needed + syn::visit::visit_item_union(self, node); + } + + fn visit_item_type(&mut self, node: &'ast ItemType) { + if self.ignore_mod() { + return; + } + + if matches!(node.vis, Visibility::Public(_)) { + self.pub_types.push(node.ident.to_string()); + } + + syn::visit::visit_item_type(self, node); + } +} + +fn process_file(file_path: &str) -> Result { + let content = fs::read_to_string(file_path) + .map_err(|e| format!("Failed to read '{}': {}", file_path, e))?; + + let syntax: File = syn::parse_file(&content) + .map_err(|e| format!("Failed to parse '{}': {}", file_path, e))?; + + let mut visitor = Collector::default(); + visitor.visit_file(&syntax); + + Ok(visitor) +} + +fn main() { + let args: Vec = env::args().skip(1).collect(); + + if args.is_empty() { + eprintln!("Usage: generate-rust-libc-ignorelist ..."); + process::exit(1); + } + + let mut pub_consts: Vec = Vec::new(); + let mut pub_enums: Vec = Vec::new(); + let mut pub_fns: Vec = Vec::new(); + let mut pub_structs: Vec = Vec::new(); + let mut pub_unions: Vec = Vec::new(); + let mut pub_types: Vec = Vec::new(); + + for file_path in &args { + match process_file(file_path) { + Ok(v) => { + pub_consts.extend(v.pub_consts); + pub_enums.extend(v.pub_enums); + pub_fns.extend(v.pub_fns); + pub_structs.extend(v.pub_structs); + pub_unions.extend(v.pub_unions); + pub_types.extend(v.pub_types); + } + Err(e) => { + eprintln!("Error parsing {}: {}", file_path, e); + } + } + } + + println!("ignored_macros:"); + for c in &pub_consts { + println!(" - \"{}\"", c); + } + for c in &pub_fns { + println!(" - \"{}\"", c); + } + + println!("ignored_structs:"); + for c in &pub_structs { + println!(" - \"{}\"", c); + } + for c in &pub_enums { + println!(" - \"{}\"", c); + } + for c in &pub_unions { + println!(" - \"{}\"", c); + } + + println!("ignored_unions:"); + for c in &pub_unions { + println!(" - \"{}\"", c); + } + for c in &pub_structs { + println!(" - \"{}\"", c); + } + + println!("ignored_types:"); + for c in &pub_types { + println!(" - \"{}\"", c); + } + for c in &pub_structs { + println!(" - \"{}\"", c); + } + for c in &pub_enums { + println!(" - \"{}\"", c); + } + for c in &pub_unions { + println!(" - \"{}\"", c); + } + + println!("ignored_functions:"); + for c in &pub_fns { + println!(" - \"{}\"", c); + } +} diff --git a/scripts/rust-libc-header.rs b/scripts/rust-libc-bindings.rs.in similarity index 68% rename from scripts/rust-libc-header.rs rename to scripts/rust-libc-bindings.rs.in index 97c8d6c59..9b0b4f5b3 100644 --- a/scripts/rust-libc-header.rs +++ b/scripts/rust-libc-bindings.rs.in @@ -1,20 +1,18 @@ -// This file is autogenerated! -// All changes made will be lost (eventually)! - use crate::prelude::*; - -use crate::sighandler_t; +use crate::{AF_LOCAL, PF_LOCAL, sighandler_t}; pub type blkcnt64_t = i64; pub type rlimit64 = crate::rlimit; pub type rlim64_t = crate::rlim_t; pub type dirent64 = crate::dirent; -pub type stat64 = crate::stat; pub type statfs64 = crate::statfs; pub type statvfs64 = crate::statvfs; pub type idtype_t = c_uint; +pub type sem_t = c_uint; pub type Ioctl = c_ulong; + pub type pthread_t = *mut c_void; +pub type pthread_once_t = c_int; pub type __u8 = c_uchar; pub type __u16 = c_ushort; @@ -24,9 +22,6 @@ pub type __s32 = c_int; pub type __u64 = c_ulonglong; pub type __s64 = c_longlong; -pub const RTLD_DEFAULT: *mut c_void = 0i64 as *mut c_void; -pub const RLIM_INFINITY: crate::rlim_t = !0; - pub type Elf32_Half = u16; pub type Elf32_Word = u32; pub type Elf32_Off = u32; @@ -38,6 +33,8 @@ pub type Elf64_Off = u64; pub type Elf64_Addr = u64; pub type Elf64_Xword = u64; +@BINDINGS_TYPES@ + s! { pub struct Elf32_Phdr { pub p_type: Elf32_Word, @@ -60,9 +57,7 @@ s! { pub p_memsz: Elf64_Xword, pub p_align: Elf64_Xword, } -} -s! { pub struct dl_phdr_info { #[cfg(target_pointer_width = "64")] pub dlpi_addr: Elf64_Addr, @@ -86,49 +81,112 @@ s! { pub dlpi_tls_modid: size_t, pub dlpi_tls_data: *mut c_void, } -} -f! { - pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { - if ((*cmsg).cmsg_len as usize) < mem::size_of::() { - return 0 as *mut cmsghdr; - }; - let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; - let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; - if (next.offset(1)) as usize > max || - next as usize + super::CMSG_ALIGN((*next).cmsg_len as usize) > max { - 0 as *mut cmsghdr - } else { - next as *mut cmsghdr - } + pub struct cpu_set_t { + pub bits: [c_ulong; 16], } -} -pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - size: [0; 16], -}; -pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - size: [0; 12], -}; -pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - size: [0; 12], -}; + pub struct ipc_perm { + pub __ipc_perm_key: crate::key_t, + pub uid: crate::uid_t, + pub gid: crate::gid_t, + pub cuid: crate::uid_t, + pub cgid: crate::gid_t, + pub mode: crate::mode_t, + pub __ipc_perm_seq: c_int, + pub __unused: [c_long; 2], + } + + pub struct semid_ds { + pub sem_perm: crate::ipc_perm, + pub sem_otime: crate::time_t, + pub sem_ctime: crate::time_t, + pub sem_nsems: c_ulong, + } + + pub struct msqid_ds { + pub msg_perm: crate::ipc_perm, + pub msg_stime: crate::time_t, + pub msg_rtime: crate::time_t, + pub msg_ctime: crate::time_t, + pub msg_cbytes: c_ulong, + pub msg_qnum: crate::msgqnum_t, + pub msg_qbytes: crate::msglen_t, + pub msg_lspid: crate::pid_t, + pub msg_lrpid: crate::pid_t, + pub __unused: [c_ulong; 2], + } + + pub struct shmid_ds { + pub shm_perm: crate::ipc_perm, + pub shm_segsz: crate::size_t, + pub shm_atime: crate::time_t, + pub shm_dtime: crate::time_t, + pub shm_ctime: crate::time_t, + pub shm_cpid: crate::pid_t, + pub shm_lpid: crate::pid_t, + pub shm_nattch: c_ulong, + pub __unused: [c_ulong; 2], + } + +@BINDINGS_STRUCTS_DECORATED@ +} s_no_extra_traits! { - pub struct ifreq { + pub struct __c_anonymous_ifru_map { + pub mem_start: c_ulong, + pub mem_end: c_ulong, + pub base_addr: c_ushort, + pub irq: c_uchar, + pub dma: c_uchar, + pub port: c_uchar, + } + + pub union __c_anonymous_ifr_ifru { pub ifru_addr: crate::sockaddr, pub ifru_dstaddr: crate::sockaddr, pub ifru_broadaddr: crate::sockaddr, pub ifru_netmask: crate::sockaddr, pub ifru_hwaddr: crate::sockaddr, pub ifru_flags: c_short, - pub ifru_ivalue: c_int, + pub ifru_ifindex: c_int, + pub ifru_metric: c_int, pub ifru_mtu: c_int, - pub ifru_map: crate::ifmap, - pub ifru_slave: [c_char; 16], - pub ifru_newname: [c_char; 16], + pub ifru_map: __c_anonymous_ifru_map, + pub ifru_slave: [c_char; crate::IFNAMSIZ], + pub ifru_newname: [c_char; crate::IFNAMSIZ], pub ifru_data: *mut c_char, } + + pub struct ifreq { + pub ifr_name: [c_char; crate::IFNAMSIZ], + pub ifr_ifru: __c_anonymous_ifr_ifru, + } + + pub struct sockaddr_nl { + pub nl_family: crate::sa_family_t, + nl_pad: c_ushort, + pub nl_pid: u32, + pub nl_groups: u32, + } +@BINDINGS_STRUCTS_UNDECORATED@ +} + +f! { + pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { + if ((*cmsg).cmsg_len as usize) < size_of::() { + return core::ptr::null_mut::(); + } + let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; + let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; + if (next.wrapping_offset(1)) as usize > max + || next as usize + super::CMSG_ALIGN((*next).cmsg_len as usize) > max + { + core::ptr::null_mut::() + } else { + next + } + } } safe_f! { @@ -158,11 +216,6 @@ safe_f! { } } -extern "C" { - #[link_name = "__gnu_strerror_r"] - pub fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: size_t) -> c_int; -} - impl siginfo_t { pub unsafe fn si_status(&self) -> c_int { #[repr(C)] @@ -176,7 +229,7 @@ impl siginfo_t { si_utime: crate::clock_t, si_stime: crate::clock_t, } - (*(self as *const siginfo_t as *const siginfo_sigchld)).si_status + (*(self as *const siginfo_t).cast::()).si_status } pub unsafe fn si_addr(&self) -> *mut c_void { @@ -187,18 +240,22 @@ impl siginfo_t { _si_code: c_int, si_addr: *mut c_void, } - (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + (*(self as *const siginfo_t).cast::()).si_addr } } -s! { - pub struct sockaddr_nl { - pub nl_family: crate::sa_family_t, - nl_pad: c_ushort, - pub nl_pid: u32, - pub nl_groups: u32, - } -} +pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { + size: [0; 16], +}; +pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { + size: [0; 12], +}; +pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + size: [0; 12], +}; + +pub const RTLD_DEFAULT: *mut c_void = 0i64 as *mut c_void; +pub const RLIM_INFINITY: crate::rlim_t = !0; // linux/netlink.h pub const NLA_ALIGNTO: c_int = 4; @@ -265,3 +322,35 @@ pub const NETLINK_GET_STRICT_CHK: c_int = 12; pub const NLA_F_NESTED: c_int = 1 << 15; pub const NLA_F_NET_BYTEORDER: c_int = 1 << 14; pub const NLA_TYPE_MASK: c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER); + +@BINDINGS_CONSTANTS@ + +extern "C" { + #[link_name = "__gnu_strerror_r"] + pub fn strerror_r(errnum: c_int, buf: *mut c_char, buflen: size_t) -> c_int; + + /// POSIX version of `basename(3)`, defined in `libgen.h`. + #[link_name = "basename"] + pub fn posix_basename(path: *mut c_char) -> *mut c_char; + /// GNU version of `basename(3)`, defined in `string.h`. + #[link_name = "__mlibc_gnu_basename_c"] + pub fn gnu_basename(path: *const c_char) -> *mut c_char; + + pub fn msgctl(msqid: c_int, cmd: c_int, buf: *mut crate::msqid_ds) -> c_int; +@BINDINGS_FUNCTIONS@ +} +@BINDINGS_ENUMS@ +cfg_if! { + if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use self::aarch64::*; + } else if #[cfg(any(target_arch = "riscv64"))] { + mod riscv64; + pub use self::riscv64::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else { + // Unknown target_arch + } +} diff --git a/scripts/rust-libc-config.yml b/scripts/rust-libc-config.yml index 32cd21b26..ba2ff40a6 100644 --- a/scripts/rust-libc-config.yml +++ b/scripts/rust-libc-config.yml @@ -6,13 +6,24 @@ ignored_files: - "abi-bits/wait.h" - "abi-bits/xattr.h" - "arpa/nameser.h" + - "bits/ansi/fenv.h" - "bits/ensure.h" + - "bits/ether_addr.h" - "bits/glibc/glibc_assert.h" + - "bits/glibc/glibc_icmp6.h" + - "bits/glibc/glibc_malloc.h" - "bits/glibc/glibc_search.h" - "bits/glibc/glibc_signal.h" + - "bits/glibc/glibc_stdlib.h" - "bits/null.h" + - "bits/posix/posix_ctype.h" + - "bits/posix/posix_string.h" + - "bits/posix/posix_wctype.h" - "bits/search.h" - "bits/syscall.h" + - "bits/wctrans_t.h" + - "bits/wctype_t.h" + - "bits/wint_t.h" - "net/ethernet.h" - "net/if_arp.h" - "net/if_ppp.h" @@ -28,29 +39,37 @@ ignored_files: - "scsi/scsi.h" - "scsi/sg.h" - "sys/dir.h" + - "sys/io.h" - "sys/mount.h" - "sys/mtio.h" - - "sys/user.h" + - "sys/param.h" - "sys/procfs.h" - "sys/queue.h" + - "sys/quota.h" + - "sys/reg.h" - "sys/ttydefaults.h" + - "sys/ucontext.h" + - "sys/user.h" - "ar.h" - "byteswap.h" - "complex.h" + - "ctype.h" - "dlfcn.h" - "elf.h" - "endian.h" - "err.h" + - "error.h" - "fenv.h" - "fnmatch.h" - - "ftw.h" - "fstab.h" + - "ftw.h" - "gshadow.h" - "inttypes.h" - "lastlog.h" - "locale.h" - "math.h" + - "memory.h" - "mlibc-config.h" - "module.h" - "paths.h" @@ -58,14 +77,20 @@ ignored_files: - "pty.h" - "resolv.h" - "search.h" + - "semaphore.h" - "setjmp.h" - "stdarg.h" - "stddef.h" - "stdint.h" + - "stdio_ext.h" + - "string.h" - "strings.h" - "sysexits.h" - "syslog.h" - "threads.h" + - "uchar.h" + - "ucontext.h" + - "user.h" - "utime.h" - "values.h" - "wchar.h" @@ -81,76 +106,49 @@ ignored_structs: - "dl_phdr_info" - "link_map" - "r_debug" - - "epoll_event" - "ifreq" - "ifconf" - "stat64" - "statfs64" - "statvfs64" - "timezone" - # unix/linux_like/mod.rs - - "in_addr" - - "ip_mreq" - - "ip_mreqn" - - "ip_mreq_source" - - "sockaddr" - - "sockaddr_in" - - "sockaddr_in6" - - "addrinfo" # TODO: fix #[cfg()] - - "sockaddr_ll" - - "fd_set" - - "tm" - - "sched_param" # TODO: fix #[cfg()] - - "Dl_info" - - "lconv" - - "in_pktinfo" - - "ifaddrs" - - "in6_rtmsg" - - "arpreq" - - "arpreq_old" - - "arphdr" - - "mmsghdr" - - "sockaddr_un" - - "sockaddr_storage" - - "utsname" - - "sigevent" - # unix/mod.rs - - "iovec" - - "ipv6_mreq" - - "timeval" - - "rusage" + - "f_owner_ex" - "timespec" - - "itimerval" - - "linger" - - "winsize" - - "group" - - "hostent" - - "protoent" - - "servent" - - "rlimit" - - "tms" - - "pollfd" - # unix/align.rs - - "in6_addr" + - "group_req" + - "group_source_req" + - "ipc64_perm" + - "msqid64_ds" + - "shmid_ds" + - "shminfo" + - "shm_info" + - "cpu_set_t" + - "termio" + - "file_handle" + - "ifmap" + - "netent" + - "ether_arp" + - "semid_ds" + - "stat" + - "stat64" + - "_fpreg" + - "_fpxreg" + - "_xmmreg" + - "_fpstate" + - "mcontext_t" + - "sigcontext" forced_structs: - - "__mlibc_file_base" - - "__mlibc_threadattr" - - "__mlibc_once" - - "__mlibc_mutexattr" - - "__mlibc_mutex" - - "__mlibc_condattr" - - "__mlibc_cond" - - "__mlibc_barrierattr_struct" + - "__mlibc_fsid" - "__mlibc_barrier" + - "__mlibc_barrierattr_struct" + - "__mlibc_cond" + - "__mlibc_condattr" - "__mlibc_fair_rwlock" + - "__mlibc_mutex" + - "__mlibc_mutexattr" - "__mlibc_rwlockattr" - - "__mlibc_dir_struct" - - "__mlibc_mbstate" + - "__mlibc_threadattr" - "__mlibc_thread_data" - - "__fd_mask" - - "__mlibc_fsid" - - "__ucontext" - "__stack" forced_empty_structs: [] @@ -193,10 +191,12 @@ ignored_macros: - "e_termination" - "stat64" - "MB_CUR_MAX" + - "AF_MAX" - "CHARBITS" - "CHAR_MAX" - "CHAR_MIN" - "CLOCKS_PER_SEC" + - "CMSG_ALIGN" - "CMSG_NXTHDR" - "CPU_ALLOC" - "CPU_ALLOC_SIZE" @@ -217,8 +217,24 @@ ignored_macros: - "FLOATBITS" - "GSHADOW" - "IFTODT" - - "IN6ADDR_ANY_INIT" - - "IN6ADDR_LOOPBACK_INIT" + - "ifr_name" + - "ifr_hwaddr" + - "ifr_addr" + - "ifr_dstaddr" + - "ifr_broadaddr" + - "ifr_netmask" + - "ifr_flags" + - "ifr_metric" + - "ifr_mtu" + - "ifr_map" + - "ifr_slave" + - "ifr_data" + - "ifr_ifindex" + - "ifr_bandwidth" + - "ifr_qlen" + - "ifr_newname" + - "ifc_buf" + - "ifc_req" - "IN6_ARE_ADDR_EQUAL" - "IN6_IS_ADDR_LINKLOCAL" - "IN6_IS_ADDR_LOOPBACK" @@ -235,11 +251,7 @@ ignored_macros: - "INADDR_ALLHOSTS_GROUP" - "INADDR_ALLRTRS_GROUP" - "INADDR_ALLSNOOPERS_GROUP" - - "INADDR_ANY" - - "INADDR_BROADCAST" - - "INADDR_LOOPBACK" - "INADDR_MAX_LOCAL_GROUP" - - "INADDR_NONE" - "INADDR_UNSPEC_GROUP" - "INT16_C" - "INT32_C" @@ -247,8 +259,6 @@ ignored_macros: - "INT8_C" - "INTBITS" - "INTMAX_C" - - "INT_MAX" - - "INT_MIN" - "IN_BADCLASS" - "IN_BADCLASS" - "IN_CLASSA" @@ -261,6 +271,7 @@ ignored_macros: - "IN_EXPERIMENTAL" - "IN_EXPERIMENTAL" - "IN_MULTICAST" + - "IPC_64" - "IPC_PRIVATE" - "IPTOS_TOS" - "LLONG_MAX" @@ -273,11 +284,18 @@ ignored_macros: - "MAX" - "MB_CUR_MAX" - "MIN" + - "MNTOPT_DEFAULTS" + - "MNTOPT_RO" + - "MNTOPT_RW" + - "MNTOPT_SUID" + - "MNTOPT_NOSUID" + - "MNTOPT_NOAUTO" - "MOUNTED" - "NULL" - "PAGE_MASK" - "PAGE_SHIFT" - "PAGE_SIZE" + - "PF_MAX" - "PTHREAD_CANCELED" - "PTHREAD_COND_INITIALIZER" - "PTHREAD_MUTEX_INITIALIZER" @@ -286,6 +304,9 @@ ignored_macros: - "PTRBITS" - "P_tmpdir" - "RENAME_EXCHANGE" + - "RLIM_INFINITY" + - "RLIM_SAVED_MAX" + - "RLIM_SAVED_CUR" - "SCHAR_MAX" - "SCHAR_MIN" - "SEM_FAILED" @@ -294,9 +315,6 @@ ignored_macros: - "SHORTBITS" - "SHRT_MAX" - "SHRT_MIN" - - "SIG_DFL" - - "SIG_ERR" - - "SIG_IGN" - "SSIZE_MAX" - "SSIZE_MIN" - "SUBCMDMASK" @@ -336,8 +354,6 @@ ignored_macros: - "ULONG_MIN" - "USHRT_MAX" - "USHRT_MIN" - - "UTIME_NOW" - - "UTIME_OMIT" - "UTMP_FILE" - "UTMP_FILENAME" - "WCHAR_MAX" @@ -415,6 +431,133 @@ ignored_macros: - "no_argument" - "required_argument" - "optional_argument" + - "_POSIX_VERSION" + - "_XOPEN_VERSION" + - "_POSIX_JOB_CONTROL" + - "_POSIX_SAVED_IDS" + - "_POSIX_SHELL" + - "_POSIX_MONOTONIC_CLOCK" + - "_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS" + - "_CS_GNU_LIBC_VERSION" + - "_CS_GNU_LIBPTHREAD_VERSION" + - "_CS_POSIX_V5_WIDTH_RESTRICTED_ENVS" + - "_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS" + - "_CS_POSIX_V6_ILP32_OFF32_CFLAGS" + - "_CS_POSIX_V6_ILP32_OFF32_LDFLAGS" + - "_CS_POSIX_V6_ILP32_OFF32_LIBS" + - "_CS_POSIX_V6_ILP32_OFF32_LINTFLAGS" + - "_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS" + - "_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS" + - "_CS_POSIX_V6_ILP32_OFFBIG_LIBS" + - "_CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS" + - "_CS_POSIX_V6_LP64_OFF64_CFLAGS" + - "_CS_POSIX_V6_LP64_OFF64_LDFLAGS" + - "_CS_POSIX_V6_LP64_OFF64_LIBS" + - "_CS_POSIX_V6_LP64_OFF64_LINTFLAGS" + - "_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS" + - "_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS" + - "_CS_POSIX_V6_LPBIG_OFFBIG_LIBS" + - "_CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS" + - "_CS_POSIX_V7_ILP32_OFF32_CFLAGS" + - "_CS_POSIX_V7_ILP32_OFF32_LDFLAGS" + - "_CS_POSIX_V7_ILP32_OFF32_LIBS" + - "_CS_POSIX_V7_ILP32_OFF32_LINTFLAGS" + - "_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS" + - "_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS" + - "_CS_POSIX_V7_ILP32_OFFBIG_LIBS" + - "_CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS" + - "_CS_POSIX_V7_LP64_OFF64_CFLAGS" + - "_CS_POSIX_V7_LP64_OFF64_LDFLAGS" + - "_CS_POSIX_V7_LP64_OFF64_LIBS" + - "_CS_POSIX_V7_LP64_OFF64_LINTFLAGS" + - "_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS" + - "_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS" + - "_CS_POSIX_V7_LPBIG_OFFBIG_LIBS" + - "_CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS" + - "L_ctermid" + - "SHM_HUGE_SHIFT" + - "SHM_HUGE_MASK" + - "SHM_HUGE_64KB" + - "SHM_HUGE_512KB" + - "SHM_HUGE_1MB" + - "SHM_HUGE_2MB" + - "SHM_HUGE_8MB" + - "SHM_HUGE_16MB" + - "SHM_HUGE_32MB" + - "SHM_HUGE_256MB" + - "SHM_HUGE_512MB" + - "SHM_HUGE_1GB" + - "SHM_HUGE_2GB" + - "SHM_HUGE_16GB" + - "NSIG" + - "_NSIG" + - "REG_R8" + - "REG_R9" + - "REG_R10" + - "REG_R11" + - "REG_R12" + - "REG_R13" + - "REG_R14" + - "REG_R15" + - "REG_RDI" + - "REG_RSI" + - "REG_RBP" + - "REG_RBX" + - "REG_RDX" + - "REG_RAX" + - "REG_RCX" + - "REG_RSP" + - "REG_RIP" + - "REG_EFL" + - "REG_CSGSFS" + - "REG_ERR" + - "REG_TRAPNO" + - "REG_OLDMASK" + - "REG_CR2" + - "NGREG" + - "NCC" + - "IN_CLASSA_NET" + - "IN_CLASSA_NSHIFT" + - "IN_CLASSA_MAX" + - "IN_CLASSB_NET" + - "IN_CLASSB_NSHIFT" + - "IN_CLASSB_MAX" + - "IN_CLASSC_NET" + - "IN_CLASSC_NSHIFT" + - "IN_LOOPBACKNET" + - "CHAR_BIT" + - "MB_LEN_MAX" + - "LONG_BIT" + - "NAME_MAX" + - "LINE_MAX" + - "CHARCLASS_NAME_MAX" + - "RE_DUP_MAX" + - "NGROUPS_MAX" + - "NL_ARGMAX" + - "_POSIX_ARG_MAX" + - "_POSIX_OPEN_MAX" + - "_POSIX_HOST_NAME_MAX" + - "_POSIX_NAME_MAX" + - "_POSIX_TZNAME_MAX" + - "_XOPEN_NAME_MAX" + - "ALTIFNAMSIZ" + - "IFALIASZ" + - "IFHWADDRLEN" + - "HOST_NOT_FOUND" + - "TRY_AGAIN" + - "NO_RECOVERY" + - "NO_DATA" + - "NO_ADDRESS" + - "PTHREAD_SCOPE_SYSTEM" + - "PTHREAD_SCOPE_PROCESS" + - "PTHREAD_CANCEL_DEFERRED" + - "PTHREAD_CANCEL_ASYNCHRONOUS" + - "PTHREAD_CANCEL_ENABLE" + - "PTHREAD_CANCEL_DISABLE" + - "PTHREAD_DESTRUCTOR_ITERATIONS" + - "PTHREAD_ATTR_NO_SIGMASK_NP" + - "NBBY" + - "PR_SET_PTRACER_ANY" # DO NOT REMOVE: mlibc internals - "MLIBC_UNIMPLEMENTED" - "MLIBC_MISSING_SYSDEP" @@ -423,1086 +566,19 @@ ignored_macros: - "NFDBITS" - "ElfW" - "ELFMAG" - # unix/mod.rs - - "INT_MIN" - - "INT_MAX" - - "SIG_DFL" - - "SIG_IGN" - - "SIG_ERR" - - "DT_UNKNOWN" - - "DT_FIFO" - - "DT_CHR" - - "DT_DIR" - - "DT_BLK" - - "DT_REG" - - "DT_LNK" - - "DT_SOCK" - - "FD_CLOEXEC" - - "USRQUOTA" - - "GRPQUOTA" - - "SIGIOT" - - "S_ISUID" - - "S_ISGID" - - "S_ISVTX" - - "IF_NAMESIZE" - - "IFNAMSIZ" - - "LOG_EMERG" - - "LOG_ALERT" - - "LOG_CRIT" - - "LOG_ERR" - - "LOG_WARNING" - - "LOG_NOTICE" - - "LOG_INFO" - - "LOG_DEBUG" - - "LOG_KERN" - - "LOG_USER" - - "LOG_MAIL" - - "LOG_DAEMON" - - "LOG_AUTH" - - "LOG_SYSLOG" - - "LOG_LPR" - - "LOG_NEWS" - - "LOG_UUCP" - - "LOG_LOCAL0" - - "LOG_LOCAL1" - - "LOG_LOCAL2" - - "LOG_LOCAL3" - - "LOG_LOCAL4" - - "LOG_LOCAL5" - - "LOG_LOCAL6" - - "LOG_LOCAL7" - - "LOG_PID" - - "LOG_CONS" - - "LOG_ODELAY" - - "LOG_NDELAY" - - "LOG_NOWAIT" - - "LOG_PRIMASK" - - "LOG_FACMASK" - - "PRIO_MIN" - - "PRIO_MAX" - - "IPPROTO_ICMP" - - "IPPROTO_ICMPV6" - - "IPPROTO_TCP" - - "IPPROTO_UDP" - - "IPPROTO_IP" - - "IPPROTO_IPV6" - - "INADDR_LOOPBACK" - - "INADDR_ANY" - - "INADDR_BROADCAST" - - "INADDR_NONE" - - "ARPOP_REQUEST" - - "ARPOP_REPLY" - - "ATF_COM" - - "ATF_PERM" - - "ATF_PUBL" - - "ATF_USETRAILERS" - # unix/linux_like/mod.rs - - "EXIT_FAILURE" - - "EXIT_SUCCESS" - - "RAND_MAX" - - "EOF" - - "SEEK_SET" - - "SEEK_CUR" - - "SEEK_END" - - "_IOFBF" - - "_IONBF" - - "_IOLBF" - - "F_DUPFD" - - "F_GETFD" - - "F_SETFD" - - "F_GETFL" - - "F_SETFL" - - "F_SETLEASE" - - "F_GETLEASE" - - "F_NOTIFY" - - "F_CANCELLK" - - "F_DUPFD_CLOEXEC" - - "F_SETPIPE_SZ" - - "F_GETPIPE_SZ" - - "F_ADD_SEALS" - - "F_GET_SEALS" - - "F_SEAL_SEAL" - - "F_SEAL_SHRINK" - - "F_SEAL_GROW" - - "F_SEAL_WRITE" - - "SIGTRAP" - - "PTHREAD_CREATE_JOINABLE" - - "PTHREAD_CREATE_DETACHED" - - "CLOCK_REALTIME" - - "CLOCK_MONOTONIC" - - "CLOCK_PROCESS_CPUTIME_ID" - - "CLOCK_THREAD_CPUTIME_ID" - - "CLOCK_MONOTONIC_RAW" - - "CLOCK_REALTIME_COARSE" - - "CLOCK_MONOTONIC_COARSE" - - "CLOCK_BOOTTIME" - - "CLOCK_REALTIME_ALARM" - - "CLOCK_BOOTTIME_ALARM" - - "CLOCK_TAI" - - "TIMER_ABSTIME" - - "RUSAGE_SELF" - - "O_RDONLY" - - "O_WRONLY" - - "O_RDWR" - - "SOCK_CLOEXEC" - - "S_IFIFO" - - "S_IFCHR" - - "S_IFBLK" - - "S_IFDIR" - - "S_IFREG" - - "S_IFLNK" - - "S_IFSOCK" - - "S_IFMT" - - "S_IRWXU" - - "S_IXUSR" - - "S_IWUSR" - - "S_IRUSR" - - "S_IRWXG" - - "S_IXGRP" - - "S_IWGRP" - - "S_IRGRP" - - "S_IRWXO" - - "S_IXOTH" - - "S_IWOTH" - - "S_IROTH" - - "F_OK" - - "R_OK" - - "W_OK" - - "X_OK" - - "STDIN_FILENO" - - "STDOUT_FILENO" - - "STDERR_FILENO" - - "SIGHUP" - - "SIGINT" - - "SIGQUIT" - - "SIGILL" - - "SIGABRT" - - "SIGFPE" - - "SIGKILL" - - "SIGSEGV" - - "SIGPIPE" - - "SIGALRM" - - "SIGTERM" - - "PROT_NONE" - - "PROT_READ" - - "PROT_WRITE" - - "PROT_EXEC" - - "XATTR_CREATE" - - "XATTR_REPLACE" - - - "LC_CTYPE_MASK" - - "LC_NUMERIC_MASK" - - "LC_TIME_MASK" - - "LC_COLLATE_MASK" - - "LC_MONETARY_MASK" - - "LC_MESSAGES_MASK" - - - "MAP_FILE" - - "MAP_SHARED" - - "MAP_PRIVATE" - - "MAP_FIXED" - - "MAP_FAILED" - - - "MS_ASYNC" - - "MS_INVALIDATE" - - "MS_SYNC" - - - "MS_RDONLY" - - "MS_NOSUID" - - "MS_NODEV" - - "MS_NOEXEC" - - "MS_SYNCHRONOUS" - - "MS_REMOUNT" - - "MS_MANDLOCK" - - "MS_DIRSYNC" - - "MS_NOATIME" - - "MS_NODIRATIME" - - "MS_BIND" - - "MS_MOVE" - - "MS_REC" - - "MS_SILENT" - - "MS_POSIXACL" - - "MS_UNBINDABLE" - - "MS_PRIVATE" - - "MS_SLAVE" - - "MS_SHARED" - - "MS_RELATIME" - - "MS_KERNMOUNT" - - "MS_I_VERSION" - - "MS_STRICTATIME" - - "MS_LAZYTIME" - - "MS_ACTIVE" - - "MS_MGC_VAL" - - "MS_MGC_MSK" - - - "SCM_RIGHTS" - - "SCM_CREDENTIALS" - - - "PROT_GROWSDOWN" - - "PROT_GROWSUP" - - - "MAP_TYPE" - - - "MADV_NORMAL" - - "MADV_RANDOM" - - "MADV_SEQUENTIAL" - - "MADV_WILLNEED" - - "MADV_DONTNEED" - - "MADV_FREE" - - "MADV_REMOVE" - - "MADV_DONTFORK" - - "MADV_DOFORK" - - "MADV_MERGEABLE" - - "MADV_UNMERGEABLE" - - "MADV_HUGEPAGE" - - "MADV_NOHUGEPAGE" - - "MADV_DONTDUMP" - - "MADV_DODUMP" - - "MADV_WIPEONFORK" - - "MADV_KEEPONFORK" - - "MADV_COLD" - - "MADV_PAGEOUT" - - "MADV_HWPOISON" - - - "MADV_POPULATE_READ" - - "MADV_POPULATE_WRITE" - - "MADV_DONTNEED_LOCKED" - - - "IFF_UP" - - "IFF_BROADCAST" - - "IFF_DEBUG" - - "IFF_LOOPBACK" - - "IFF_POINTOPOINT" - - "IFF_NOTRAILERS" - - "IFF_RUNNING" - - "IFF_NOARP" - - "IFF_PROMISC" - - "IFF_ALLMULTI" - - "IFF_MASTER" - - "IFF_SLAVE" - - "IFF_MULTICAST" - - "IFF_PORTSEL" - - "IFF_AUTOMEDIA" - - "IFF_DYNAMIC" - - - "SOL_IP" - - "SOL_TCP" - - "SOL_UDP" - - "SOL_IPV6" - - "SOL_ICMPV6" - - "SOL_RAW" - - "SOL_DECNET" - - "SOL_X25" - - "SOL_PACKET" - - "SOL_ATM" - - "SOL_AAL" - - "SOL_IRDA" - - "SOL_NETBEUI" - - "SOL_LLC" - - "SOL_DCCP" - - "SOL_NETLINK" - - "SOL_TIPC" - - "SOL_BLUETOOTH" - - "SOL_ALG" - - - "AF_UNSPEC" - - "AF_UNIX" - - "AF_INET" - - "AF_AX25" - - "AF_IPX" - - "AF_APPLETALK" - - "AF_NETROM" - - "AF_BRIDGE" - - "AF_ATMPVC" - - "AF_X25" - - "AF_INET6" - - "AF_ROSE" - - "AF_DECnet" - - "AF_NETBEUI" - - "AF_SECURITY" - - "AF_KEY" - - "AF_NETLINK" - - "AF_ROUTE" - - "AF_PACKET" - - "AF_ASH" - - "AF_ECONET" - - "AF_ATMSVC" - - "AF_RDS" - - "AF_SNA" - - "AF_IRDA" - - "AF_PPPOX" - - "AF_WANPIPE" - - "AF_LLC" - - "AF_CAN" - - "AF_TIPC" - - "AF_BLUETOOTH" - - "AF_IUCV" - - "AF_RXRPC" - - "AF_ISDN" - - "AF_PHONET" - - "AF_IEEE802154" - - "AF_CAIF" - - "AF_ALG" - - - "PF_UNSPEC" - - "PF_UNIX" - - "PF_INET" - - "PF_AX25" - - "PF_IPX" - - "PF_APPLETALK" - - "PF_NETROM" - - "PF_BRIDGE" - - "PF_ATMPVC" - - "PF_X25" - - "PF_INET6" - - "PF_ROSE" - - "PF_DECnet" - - "PF_NETBEUI" - - "PF_SECURITY" - - "PF_KEY" - - "PF_NETLINK" - - "PF_ROUTE" - - "PF_PACKET" - - "PF_ASH" - - "PF_ECONET" - - "PF_ATMSVC" - - "PF_RDS" - - "PF_SNA" - - "PF_IRDA" - - "PF_PPPOX" - - "PF_WANPIPE" - - "PF_LLC" - - "PF_CAN" - - "PF_TIPC" - - "PF_BLUETOOTH" - - "PF_IUCV" - - "PF_RXRPC" - - "PF_ISDN" - - "PF_PHONET" - - "PF_IEEE802154" - - "PF_CAIF" - - "PF_ALG" - - - "MSG_OOB" - - "MSG_PEEK" - - "MSG_DONTROUTE" - - "MSG_CTRUNC" - - "MSG_TRUNC" - - "MSG_DONTWAIT" - - "MSG_EOR" - - "MSG_WAITALL" - - "MSG_FIN" - - "MSG_SYN" - - "MSG_CONFIRM" - - "MSG_RST" - - "MSG_ERRQUEUE" - - "MSG_NOSIGNAL" - - "MSG_MORE" - - "MSG_WAITFORONE" - - "MSG_FASTOPEN" - - "MSG_CMSG_CLOEXEC" - - - "SCM_TIMESTAMP" - - - "SOCK_RAW" - - "SOCK_RDM" - - "IP_TOS" - - "IP_TTL" - - "IP_HDRINCL" - - "IP_OPTIONS" - - "IP_ROUTER_ALERT" - - "IP_RECVOPTS" - - "IP_RETOPTS" - - "IP_PKTINFO" - - "IP_PKTOPTIONS" - - "IP_MTU_DISCOVER" - - "IP_RECVERR" - - "IP_RECVTTL" - - "IP_RECVTOS" - - "IP_MTU" - - "IP_FREEBIND" - - "IP_IPSEC_POLICY" - - "IP_XFRM_POLICY" - - "IP_PASSSEC" - - "IP_TRANSPARENT" - - "IP_ORIGDSTADDR" - - "IP_RECVORIGDSTADDR" - - "IP_MINTTL" - - "IP_NODEFRAG" - - "IP_CHECKSUM" - - "IP_BIND_ADDRESS_NO_PORT" - - "IP_MULTICAST_IF" - - "IP_MULTICAST_TTL" - - "IP_MULTICAST_LOOP" - - "IP_ADD_MEMBERSHIP" - - "IP_DROP_MEMBERSHIP" - - "IP_UNBLOCK_SOURCE" - - "IP_BLOCK_SOURCE" - - "IP_ADD_SOURCE_MEMBERSHIP" - - "IP_DROP_SOURCE_MEMBERSHIP" - - "IP_MSFILTER" - - "IP_MULTICAST_ALL" - - "IP_UNICAST_IF" - - - "IP_DEFAULT_MULTICAST_TTL" - - "IP_DEFAULT_MULTICAST_LOOP" - - - "IP_PMTUDISC_DONT" - - "IP_PMTUDISC_WANT" - - "IP_PMTUDISC_DO" - - "IP_PMTUDISC_PROBE" - - "IP_PMTUDISC_INTERFACE" - - "IP_PMTUDISC_OMIT" - - - "IPPROTO_HOPOPTS" - - "IPPROTO_IGMP" - - "IPPROTO_IPIP" - - "IPPROTO_EGP" - - "IPPROTO_PUP" - - "IPPROTO_IDP" - - "IPPROTO_TP" - - "IPPROTO_DCCP" - - "IPPROTO_ROUTING" - - "IPPROTO_FRAGMENT" - - "IPPROTO_RSVP" - - "IPPROTO_GRE" - - "IPPROTO_ESP" - - "IPPROTO_AH" - - "IPPROTO_NONE" - - "IPPROTO_DSTOPTS" - - "IPPROTO_MTP" - - "IPPROTO_ENCAP" - - "IPPROTO_PIM" - - "IPPROTO_COMP" - - "IPPROTO_SCTP" - - "IPPROTO_MH" - - "IPPROTO_UDPLITE" - - "IPPROTO_RAW" - - "IPPROTO_BEETPH" - - "IPPROTO_MPLS" - - "IPPROTO_MPTCP" - - "IPPROTO_ETHERNET" - - - "MCAST_EXCLUDE" - - "MCAST_INCLUDE" - - "MCAST_JOIN_GROUP" - - "MCAST_BLOCK_SOURCE" - - "MCAST_UNBLOCK_SOURCE" - - "MCAST_LEAVE_GROUP" - - "MCAST_JOIN_SOURCE_GROUP" - - "MCAST_LEAVE_SOURCE_GROUP" - - "MCAST_MSFILTER" - - - "IPV6_ADDRFORM" - - "IPV6_2292PKTINFO" - - "IPV6_2292HOPOPTS" - - "IPV6_2292DSTOPTS" - - "IPV6_2292RTHDR" - - "IPV6_2292PKTOPTIONS" - - "IPV6_CHECKSUM" - - "IPV6_2292HOPLIMIT" - - "IPV6_NEXTHOP" - - "IPV6_AUTHHDR" - - "IPV6_UNICAST_HOPS" - - "IPV6_MULTICAST_IF" - - "IPV6_MULTICAST_HOPS" - - "IPV6_MULTICAST_LOOP" - - "IPV6_ADD_MEMBERSHIP" - - "IPV6_DROP_MEMBERSHIP" - - "IPV6_ROUTER_ALERT" - - "IPV6_MTU_DISCOVER" - - "IPV6_MTU" - - "IPV6_RECVERR" - - "IPV6_V6ONLY" - - "IPV6_JOIN_ANYCAST" - - "IPV6_LEAVE_ANYCAST" - - "IPV6_IPSEC_POLICY" - - "IPV6_XFRM_POLICY" - - "IPV6_HDRINCL" - - "IPV6_RECVPKTINFO" - - "IPV6_PKTINFO" - - "IPV6_RECVHOPLIMIT" - - "IPV6_HOPLIMIT" - - "IPV6_RECVHOPOPTS" - - "IPV6_HOPOPTS" - - "IPV6_RTHDRDSTOPTS" - - "IPV6_RECVRTHDR" - - "IPV6_RTHDR" - - "IPV6_RECVDSTOPTS" - - "IPV6_DSTOPTS" - - "IPV6_RECVPATHMTU" - - "IPV6_PATHMTU" - - "IPV6_DONTFRAG" - - "IPV6_RECVTCLASS" - - "IPV6_TCLASS" - - "IPV6_AUTOFLOWLABEL" - - "IPV6_ADDR_PREFERENCES" - - "IPV6_MINHOPCOUNT" - - "IPV6_ORIGDSTADDR" - - "IPV6_RECVORIGDSTADDR" - - "IPV6_TRANSPARENT" - - "IPV6_UNICAST_IF" - - "IPV6_PREFER_SRC_TMP" - - "IPV6_PREFER_SRC_PUBLIC" - - "IPV6_PREFER_SRC_PUBTMP_DEFAULT" - - "IPV6_PREFER_SRC_COA" - - "IPV6_PREFER_SRC_HOME" - - "IPV6_PREFER_SRC_CGA" - - "IPV6_PREFER_SRC_NONCGA" - - - "IPV6_PMTUDISC_DONT" - - "IPV6_PMTUDISC_WANT" - - "IPV6_PMTUDISC_DO" - - "IPV6_PMTUDISC_PROBE" - - "IPV6_PMTUDISC_INTERFACE" - - "IPV6_PMTUDISC_OMIT" - - - "TCP_NODELAY" - - "TCP_MAXSEG" - - "TCP_CORK" - - "TCP_KEEPIDLE" - - "TCP_KEEPINTVL" - - "TCP_KEEPCNT" - - "TCP_SYNCNT" - - "TCP_LINGER2" - - "TCP_DEFER_ACCEPT" - - "TCP_WINDOW_CLAMP" - - "TCP_INFO" - - "TCP_QUICKACK" - - "TCP_CONGESTION" - - "TCP_MD5SIG" - - - "TCP_THIN_LINEAR_TIMEOUTS" - - "TCP_THIN_DUPACK" - - "TCP_USER_TIMEOUT" - - "TCP_REPAIR" - - "TCP_REPAIR_QUEUE" - - "TCP_QUEUE_SEQ" - - "TCP_REPAIR_OPTIONS" - - "TCP_FASTOPEN" - - "TCP_TIMESTAMP" - - "TCP_NOTSENT_LOWAT" - - "TCP_CC_INFO" - - "TCP_SAVE_SYN" - - "TCP_SAVED_SYN" - - - "TCP_REPAIR_WINDOW" - - "TCP_FASTOPEN_CONNECT" - - "TCP_ULP" - - "TCP_MD5SIG_EXT" - - "TCP_FASTOPEN_KEY" - - "TCP_FASTOPEN_NO_COOKIE" - - "TCP_ZEROCOPY_RECEIVE" - - "TCP_INQ" - - "TCP_CM_INQ" - - "TCP_MD5SIG_MAXKEYLEN" - - - "SO_DEBUG" - - - "SHUT_RD" - - "SHUT_WR" - - "SHUT_RDWR" - - - "LOCK_SH" - - "LOCK_EX" - - "LOCK_NB" - - "LOCK_UN" - - - "SS_ONSTACK" - - "SS_DISABLE" - - - "PATH_MAX" - - - "UIO_MAXIOV" - - - "FD_SETSIZE" - - - "EPOLLIN" - - "EPOLLPRI" - - "EPOLLOUT" - - "EPOLLERR" - - "EPOLLHUP" - - "EPOLLRDNORM" - - "EPOLLRDBAND" - - "EPOLLWRNORM" - - "EPOLLWRBAND" - - "EPOLLMSG" - - "EPOLLRDHUP" - - "EPOLLEXCLUSIVE" - - "EPOLLWAKEUP" - - "EPOLLONESHOT" - - "EPOLLET" - - - "EPOLL_CTL_ADD" - - "EPOLL_CTL_MOD" - - "EPOLL_CTL_DEL" - - - "MNT_FORCE" - - "MNT_DETACH" - - "MNT_EXPIRE" - - "UMOUNT_NOFOLLOW" - - - "Q_GETFMT" - - "Q_GETINFO" - - "Q_SETINFO" - - "QIF_BLIMITS" - - "QIF_SPACE" - - "QIF_ILIMITS" - - "QIF_INODES" - - "QIF_BTIME" - - "QIF_ITIME" - - "QIF_LIMITS" - - "QIF_USAGE" - - "QIF_TIMES" - - "QIF_ALL" - - - "Q_SYNC" - - "Q_QUOTAON" - - "Q_QUOTAOFF" - - "Q_GETQUOTA" - - "Q_SETQUOTA" - - - "TCIOFF" - - "TCION" - - "TCOOFF" - - "TCOON" - - "TCIFLUSH" - - "TCOFLUSH" - - "TCIOFLUSH" - - "NL0" - - "NL1" - - "TAB0" - - "CR0" - - "FF0" - - "BS0" - - "VT0" - - "VERASE" - - "VKILL" - - "VINTR" - - "VQUIT" - - "VLNEXT" - - "IGNBRK" - - "BRKINT" - - "IGNPAR" - - "PARMRK" - - "INPCK" - - "ISTRIP" - - "INLCR" - - "IGNCR" - - "ICRNL" - - "IXANY" - - "IMAXBEL" - - "OPOST" - - "CS5" - - "CRTSCTS" - - "ECHO" - - "OCRNL" - - "ONOCR" - - "ONLRET" - - "OFILL" - - "OFDEL" - - - "CLONE_VM" - - "CLONE_FS" - - "CLONE_FILES" - - "CLONE_SIGHAND" - - "CLONE_PTRACE" - - "CLONE_VFORK" - - "CLONE_PARENT" - - "CLONE_THREAD" - - "CLONE_NEWNS" - - "CLONE_SYSVSEM" - - "CLONE_SETTLS" - - "CLONE_PARENT_SETTID" - - "CLONE_CHILD_CLEARTID" - - "CLONE_DETACHED" - - "CLONE_UNTRACED" - - "CLONE_CHILD_SETTID" - - "CLONE_NEWCGROUP" - - "CLONE_NEWUTS" - - "CLONE_NEWIPC" - - "CLONE_NEWUSER" - - "CLONE_NEWPID" - - "CLONE_NEWNET" - - "CLONE_IO" - - - "WNOHANG" - - "WUNTRACED" - - "WSTOPPED" - - "WEXITED" - - "WCONTINUED" - - "WNOWAIT" - - - "ADDR_NO_RANDOMIZE" - - "MMAP_PAGE_ZERO" - - "ADDR_COMPAT_LAYOUT" - - "READ_IMPLIES_EXEC" - - "ADDR_LIMIT_32BIT" - - "SHORT_INODE" - - "WHOLE_SECONDS" - - "STICKY_TIMEOUTS" - - "ADDR_LIMIT_3GB" - - - "PTRACE_O_TRACESYSGOOD" - - "PTRACE_O_TRACEFORK" - - "PTRACE_O_TRACEVFORK" - - "PTRACE_O_TRACECLONE" - - "PTRACE_O_TRACEEXEC" - - "PTRACE_O_TRACEVFORKDONE" - - "PTRACE_O_TRACEEXIT" - - "PTRACE_O_TRACESECCOMP" - - "PTRACE_O_SUSPEND_SECCOMP" - - "PTRACE_O_EXITKILL" - - "PTRACE_O_MASK" - - - "PTRACE_EVENT_FORK" - - "PTRACE_EVENT_VFORK" - - "PTRACE_EVENT_CLONE" - - "PTRACE_EVENT_EXEC" - - "PTRACE_EVENT_VFORK_DONE" - - "PTRACE_EVENT_EXIT" - - "PTRACE_EVENT_SECCOMP" - - - "SPLICE_F_MOVE" - - "SPLICE_F_NONBLOCK" - - "SPLICE_F_MORE" - - "SPLICE_F_GIFT" - - - "RTLD_LOCAL" - - "RTLD_LAZY" - - - "POSIX_FADV_NORMAL" - - "POSIX_FADV_RANDOM" - - "POSIX_FADV_SEQUENTIAL" - - "POSIX_FADV_WILLNEED" - - - "AT_FDCWD" - - "AT_SYMLINK_NOFOLLOW" - - "AT_REMOVEDIR" - - "AT_SYMLINK_FOLLOW" - - "AT_NO_AUTOMOUNT" - - "AT_EMPTY_PATH" - - "AT_RECURSIVE" - - - "LOG_CRON" - - "LOG_AUTHPRIV" - - "LOG_FTP" - - "LOG_PERROR" - - - "PIPE_BUF" - - - "SI_LOAD_SHIFT" - - "SI_ASYNCNL" - - "SI_USER" - - "SI_KERNEL" - - "SI_QUEUE" - - "SI_TIMER" - - "SI_MESGQ" - - "SI_ASYNCIO" - - "SI_SIGIO" - - "SI_TKILL" - - "SI_ASYNCNL" - - - "BUS_ADRALN" - - "BUS_ADRERR" - - "BUS_OBJERR" - - "BUS_MCEERR_AR" - - "BUS_MCEERR_AO" - - - "TRAP_BRKPT" - - "TRAP_TRACE" - - "TRAP_BRANCH" - - "TRAP_HWBKPT" - - "TRAP_UNK" - - - "CLD_EXITED" - - "CLD_KILLED" - - "CLD_DUMPED" - - "CLD_TRAPPED" - - "CLD_STOPPED" - - "CLD_CONTINUED" - - - "SIGEV_SIGNAL" - - "SIGEV_NONE" - - "SIGEV_THREAD" - - - "P_ALL" - - "P_PID" - - "P_PGID" - - "P_PIDFD" - - - "UTIME_OMIT" - - "UTIME_NOW" - - - "POLLIN" - - "POLLPRI" - - "POLLOUT" - - "POLLERR" - - "POLLHUP" - - "POLLNVAL" - - "POLLRDNORM" - - "POLLRDBAND" - - "POLLRDHUP" - - - "IPTOS_LOWDELAY" - - "IPTOS_THROUGHPUT" - - "IPTOS_RELIABILITY" - - "IPTOS_MINCOST" - - - "IPTOS_PREC_NETCONTROL" - - "IPTOS_PREC_INTERNETCONTROL" - - "IPTOS_PREC_CRITIC_ECP" - - "IPTOS_PREC_FLASHOVERRIDE" - - "IPTOS_PREC_FLASH" - - "IPTOS_PREC_IMMEDIATE" - - "IPTOS_PREC_PRIORITY" - - "IPTOS_PREC_ROUTINE" - - - "IPTOS_ECN_MASK" - - "IPTOS_ECN_ECT1" - - "IPTOS_ECN_ECT0" - - "IPTOS_ECN_CE" - - - "IPOPT_COPY" - - "IPOPT_CLASS_MASK" - - "IPOPT_NUMBER_MASK" - - - "IPOPT_CONTROL" - - "IPOPT_RESERVED1" - - "IPOPT_MEASUREMENT" - - "IPOPT_RESERVED2" - - "IPOPT_END" - - "IPOPT_NOOP" - - "IPOPT_SEC" - - "IPOPT_LSRR" - - "IPOPT_TIMESTAMP" - - "IPOPT_RR" - - "IPOPT_SID" - - "IPOPT_SSRR" - - "IPOPT_RA" - - "IPVERSION" - - "MAXTTL" - - "IPDEFTTL" - - "IPOPT_OPTVAL" - - "IPOPT_OLEN" - - "IPOPT_OFFSET" - - "IPOPT_MINOFF" - - "MAX_IPOPTLEN" - - "IPOPT_NOP" - - "IPOPT_EOL" - - "IPOPT_TS" - - "IPOPT_TS_TSONLY" - - "IPOPT_TS_TSANDADDR" - - "IPOPT_TS_PRESPEC" - - - "ARPOP_RREQUEST" - - "ARPOP_RREPLY" - - "ARPOP_InREQUEST" - - "ARPOP_InREPLY" - - "ARPOP_NAK" - - - "ATF_NETMASK" - - "ATF_DONTPUB" - - - "ARPHRD_NETROM" - - "ARPHRD_ETHER" - - "ARPHRD_EETHER" - - "ARPHRD_AX25" - - "ARPHRD_PRONET" - - "ARPHRD_CHAOS" - - "ARPHRD_IEEE802" - - "ARPHRD_ARCNET" - - "ARPHRD_APPLETLK" - - "ARPHRD_DLCI" - - "ARPHRD_ATM" - - "ARPHRD_METRICOM" - - "ARPHRD_IEEE1394" - - "ARPHRD_EUI64" - - "ARPHRD_INFINIBAND" - - - "ARPHRD_SLIP" - - "ARPHRD_CSLIP" - - "ARPHRD_SLIP6" - - "ARPHRD_CSLIP6" - - "ARPHRD_RSRVD" - - "ARPHRD_ADAPT" - - "ARPHRD_ROSE" - - "ARPHRD_X25" - - "ARPHRD_HWX25" - - "ARPHRD_CAN" - - "ARPHRD_PPP" - - "ARPHRD_CISCO" - - "ARPHRD_HDLC" - - "ARPHRD_LAPB" - - "ARPHRD_DDCMP" - - "ARPHRD_RAWHDLC" - - - "ARPHRD_TUNNEL" - - "ARPHRD_TUNNEL6" - - "ARPHRD_FRAD" - - "ARPHRD_SKIP" - - "ARPHRD_LOOPBACK" - - "ARPHRD_LOCALTLK" - - "ARPHRD_FDDI" - - "ARPHRD_BIF" - - "ARPHRD_SIT" - - "ARPHRD_IPDDP" - - "ARPHRD_IPGRE" - - "ARPHRD_PIMREG" - - "ARPHRD_HIPPI" - - "ARPHRD_ASH" - - "ARPHRD_ECONET" - - "ARPHRD_IRDA" - - "ARPHRD_FCPP" - - "ARPHRD_FCAL" - - "ARPHRD_FCPL" - - "ARPHRD_FCFABRIC" - - "ARPHRD_IEEE802_TR" - - "ARPHRD_IEEE80211" - - "ARPHRD_IEEE80211_PRISM" - - "ARPHRD_IEEE80211_RADIOTAP" - - "ARPHRD_IEEE802154" - - - "ARPHRD_VOID" - - "ARPHRD_NONE" - - - "ADFS_SUPER_MAGIC" - - "AFFS_SUPER_MAGIC" - - "AFS_SUPER_MAGIC" - - "AUTOFS_SUPER_MAGIC" - - "BPF_FS_MAGIC" - - "BTRFS_SUPER_MAGIC" - - "CGROUP2_SUPER_MAGIC" - - "CGROUP_SUPER_MAGIC" - - "CODA_SUPER_MAGIC" - - "CRAMFS_MAGIC" - - "DEBUGFS_MAGIC" - - "DEVPTS_SUPER_MAGIC" - - "ECRYPTFS_SUPER_MAGIC" - - "EFS_SUPER_MAGIC" - - "EXT2_SUPER_MAGIC" - - "EXT3_SUPER_MAGIC" - - "EXT4_SUPER_MAGIC" - - "F2FS_SUPER_MAGIC" - - "FUSE_SUPER_MAGIC" - - "FUTEXFS_SUPER_MAGIC" - - "HOSTFS_SUPER_MAGIC" - - "HPFS_SUPER_MAGIC" - - "HUGETLBFS_MAGIC" - - "ISOFS_SUPER_MAGIC" - - "JFFS2_SUPER_MAGIC" - - "MINIX2_SUPER_MAGIC2" - - "MINIX2_SUPER_MAGIC" - - "MINIX3_SUPER_MAGIC" - - "MINIX_SUPER_MAGIC2" - - "MINIX_SUPER_MAGIC" - - "MSDOS_SUPER_MAGIC" - - "NCP_SUPER_MAGIC" - - "NFS_SUPER_MAGIC" - - "NILFS_SUPER_MAGIC" - - "OCFS2_SUPER_MAGIC" - - "OPENPROM_SUPER_MAGIC" - - "OVERLAYFS_SUPER_MAGIC" - - "PROC_SUPER_MAGIC" - - "QNX4_SUPER_MAGIC" - - "QNX6_SUPER_MAGIC" - - "RDTGROUP_SUPER_MAGIC" - - "REISERFS_SUPER_MAGIC" - - "SECURITYFS_MAGIC" - - "SELINUX_MAGIC" - - "SMACK_MAGIC" - - "SMB_SUPER_MAGIC" - - "SYSFS_MAGIC" - - "TMPFS_MAGIC" - - "TRACEFS_MAGIC" - - "UDF_SUPER_MAGIC" - - "USBDEVICE_SUPER_MAGIC" - - "XENFS_SUPER_MAGIC" - - "NSFS_MAGIC" - - - "CMSG_ALIGN" - - "CMSG_FIRSTHDR" - - "CMSG_DATA" - - "CMSG_SPACE" - - "CMSG_LEN" - - "FD_CLR" - - "FD_ISSET" - - "FD_SET" - - "FD_ZERO" - - "SIGRTMAX" - - "SIGRTMIN" - - "WIFSTOPPED" - - "WSTOPSIG" - - "WIFCONTINUED" - - "WIFSIGNALED" - - "WTERMSIG" - - "WIFEXITED" - - "WEXITSTATUS" - - "WCOREDUMP" - - "W_EXITCODE" - - "W_STOPCODE" - - "QCMD" - - "IPOPT_COPIED" - - "IPOPT_CLASS" - - "IPOPT_NUMBER" - - "IPTOS_ECN" - - "KERNEL_VERSION" - - "EPOLLIN" - - "EPOLLPRI" - - "EPOLLOUT" - - "EPOLLERR" - - "EPOLLHUP" - - "EPOLLRDNORM" - - "EPOLLRDBAND" - - "EPOLLWRNORM" - - "EPOLLWRBAND" - - "EPOLLMSG" - - "EPOLLRDHUP" - - "EPOLLEXCLUSIVE" - - "EPOLLWAKEUP" - - "EPOLLONESHOT" - - "EPOLLET" - - "ifr_name" - - "ifr_hwaddr" - - "ifr_addr" - - "ifr_dstaddr" - - "ifr_broadaddr" - - "ifr_netmask" - - "ifr_flags" - - "ifr_metric" - - "ifr_mtu" - - "ifr_map" - - "ifr_slave" - - "ifr_data" - - "ifr_ifindex" - - "ifr_bandwidth" - - "ifr_qlen" - - "ifr_newname" - - "ifc_buf" - - "ifc_req" - - "RLIM_SAVED_MAX" - - "RLIM_SAVED_CUR" - - "RLIM_INFINITY" - - "PR_SET_PTRACER" - - "PR_SET_PTRACER_ANY" - - "MNTOPT_DEFAULTS" - - "MNTOPT_RO" - - "MNTOPT_RW" - - "MNTOPT_SUID" - - "MNTOPT_NOSUID" - - "MNTOPT_NOAUTO" forced_macros: - - "__MLIBC_THREAD_CREATE_JOINABLE" - - "__MLIBC_THREAD_CREATE_DETACHED" + - "__UT_HOSTSIZE" + - "__UT_NAMESIZE" + - "__UT_LINESIZE" - "__MLIBC_THREAD_MUTEX_DEFAULT" - "__MLIBC_THREAD_MUTEX_NORMAL" - "__MLIBC_THREAD_MUTEX_ERRORCHECK" - "__MLIBC_THREAD_MUTEX_RECURSIVE" - - "__MLIBC_THREAD_PROCESS_PRIVATE" - - "__MLIBC_THREAD_PROCESS_SHARED" - "__MLIBC_THREAD_MUTEX_STALLED" - "__MLIBC_THREAD_MUTEX_ROBUST" + - "__MLIBC_THREAD_PROCESS_PRIVATE" + - "__MLIBC_THREAD_PROCESS_SHARED" - "__MLIBC_THREAD_PRIO_NONE" - "__MLIBC_THREAD_PRIO_INHERIT" - "__MLIBC_THREAD_PRIO_PROTECT" @@ -1528,35 +604,34 @@ ignored_types: - "res_state" - "VISIT" - "epoll_data_t" - - "locale_t" - - "fd_set" - "pthread_t" - # unix/mod.rs - - "size_t" - - "pid_t" - - "ssize_t" - - "intptr_t" - - "in_addr_t" - - "in_port_t" - - "cc_t" - - "uid_t" - - "gid_t" - - "fpos_t" - - "FILE" + - "blksize_t" - "DIR" - # unix/linux_like/mod.rs - - "sa_family_t" - - "speed_t" - - "tcflag_t" - - "clockid_t" - - "timer_t" - - "key_t" - - "id_t" - -forced_types: - - "__fd_mask" - - "__sighandler" - - "__cpu_mask" + - "fpos_t" + - "nlink_t" + - "cpu_set_t" + - "pthread_once_t" + - "mbstate_t" + - "fd_mask" + - "u_int" + - "u_char" + - "u_short" + - "u_long" + - "caddr_t" + - "loff_t" + - "ulong" + - "ushort" + - "uint" + - "u_int8_t" + - "u_int16_t" + - "u_int32_t" + - "u_int64_t" + - "quad_t" + - "u_quad_t" + - "sig_atomic_t" + - "ucontext_t" + +forced_types: [] ignored_functions: - "strtold" @@ -1570,471 +645,114 @@ ignored_functions: - "twalk" - "wait3" - "fopencookie" - # unix/mod.rs - - "isalnum" - - "isalpha" - - "iscntrl" - - "isdigit" - - "isgraph" - - "islower" - - "isprint" - - "ispunct" - - "isspace" - - "isupper" - - "isxdigit" - - "isblank" - - "tolower" - - "toupper" - - "qsort" - - "bsearch" - - "fopen" - - "freopen" - - "fflush" - - "fclose" - - "remove" - - "rename" - - "tmpfile" - - "setvbuf" - - "setbuf" - - "getchar" - - "putchar" - - "fgetc" - - "fgets" - - "fputc" - - "fputs" - - "puts" - - "ungetc" - - "fread" - - "fwrite" - - "fseek" - - "ftell" - - "rewind" - - "fgetpos" - - "fsetpos" - - "feof" - - "ferror" - - "clearerr" - - "perror" - - "atof" - - "atoi" - - "atol" - - "atoll" - - "strtod" - - "strtof" - - "strtol" - - "strtoll" - - "strtoul" - - "strtoull" - - "calloc" - - "malloc" - - "realloc" - - "free" - - "abort" - - "exit" - - "_exit" - - "system" - - "getenv" - - "strcpy" - - "strncpy" - - "stpcpy" - - "stpncpy" - - "strcat" - - "strncat" - - "strcmp" - - "strcoll" - - "strncmp" - - "strchr" - - "strrchr" - - "strspn" - - "strcspn" - - "strdup" - - "strndup" - - "strpbrk" - - "strstr" - - "strcasecmp" - - "strncasecmp" - - "strlen" - - "strnlen" - - "strerror" - - "strtok" - - "strtok_r" - - "strxfrm" - - "strsignal" - - "wcslen" - - "wcstombs" - - "memchr" - - "wmemchr" - - "memcmp" - - "memcpy" - - "memmove" - - "memset" - - "memccpy" - - - "getpwnam" - - "getpwuid" - - "fprintf" - - "printf" - - "snprintf" - - "sprintf" - - "fscanf" - - "scanf" - - "sscanf" - - "getchar_unlocked" - - "putchar_unlocked" - - "socket" - - "connect" - - "listen" - - "accept" - - "getpeername" - - "getsockname" - - "getsockname" - - "setsockopt" - - "socketpair" - - "sendto" - - "shutdown" - - "chmod" - - "fchmod" - - "fstat" - - "mkdir" - - "stat" - - "pclose" - - "fdopen" - - "fileno" - - "open" - - "creat" - - "fcntl" - - "opendir" - - "readdir" - - "closedir" - - "rewinddir" - - "fchmodat" - - "fchown" - - "fchownat" - - "fstatat" - - "linkat" - - "renameat" - - "symlinkat" - - "unlinkat" - - "access" - - "alarm" - - "chdir" - - "fchdir" - - "chown" - - "lchown" - - "close" - - "dup" - - "dup2" - - "execl" - - "execle" - - "execlp" - - "execv" - - "execve" - - "execvp" - - "fork" - - "fpathconf" - - "getcwd" - - "getegid" - - "geteuid" - - "getgid" - - "getgroups" - - "getlogin" - - "getopt" - - "getpgid" - - "getpgrp" - - "getpid" - - "getppid" - - "getuid" - - "isatty" - - "link" - - "lseek" - - "lseek64" - - "pathconf" - - "pipe" - - "posix_memalign" - - "read" - - "rmdir" - - "seteuid" - - "setegid" - - "setgid" - - "setpgid" - - "setsid" - - "setuid" - - "setreuid" - - "setregid" - - "sleep" - - "nanosleep" - - "tcgetpgrp" - - "tcsetpgrp" - - "ttyname" - - "ttyname_r" - - "unlink" - - "wait" - - "waitpid" - - "write" - - "pread" - - "pwrite" - - "umask" - - "utime" - - "kill" - - "killpg" - - "mlock" - - "munlock" - - "mlockall" - - "munlockall" - - "mmap" - - "munmap" - - "if_nametoindex" - - "if_indextoname" - - "lstat" - - "fsync" - - "setenv" - - "unsetenv" - - "symlink" - - "truncate" - - "ftruncate" - - "signal" - - "getrusage" - - "realpath" - - "flock" - - "times" - - "pthread_self" - - "pthread_equal" - - "pthread_join" - - "pthread_exit" - - "pthread_attr_init" - - "pthread_attr_destroy" - - "pthread_attr_getstacksize" - - "pthread_attr_setstacksize" - - "pthread_attr_setdetachstate" - - "pthread_detach" - - "sched_yield" - - "pthread_key_create" - - "pthread_key_delete" - - "pthread_getspecific" - - "pthread_setspecific" - - "pthread_mutex_init" - - "pthread_mutex_destroy" - - "pthread_mutex_lock" - - "pthread_mutex_trylock" - - "pthread_mutex_unlock" - - "pthread_mutexattr_init" - - "pthread_mutexattr_destroy" - - "pthread_mutexattr_settype" - - "pthread_cond_init" - - "pthread_cond_wait" - - "pthread_cond_timedwait" - - "pthread_cond_signal" - - "pthread_cond_broadcast" - - "pthread_cond_destroy" - - "pthread_condattr_init" - - "pthread_condattr_destroy" - - "pthread_rwlock_init" - - "pthread_rwlock_destroy" - - "pthread_rwlock_rdlock" - - "pthread_rwlock_tryrdlock" - - "pthread_rwlock_wrlock" - - "pthread_rwlock_trywrlock" - - "pthread_rwlock_unlock" - - "pthread_rwlockattr_init" - - "pthread_rwlockattr_destroy" - - "getsockopt" - - "raise" - - "utimes" - - "dlopen" - - "dlerror" - - "dlsym" - - "dlclose" - - "getaddrinfo" - - "freeaddrinfo" - - "hstrerror" - - "gai_strerror" - - "res_init" - - "gmtime_r" - - "localtime_r" - - "mktime" - - "time" - - "gmtime" - - "localtime" - - "difftime" - - "timegm" - - "mknod" - - "gethostname" - - "endservent" - - "getservbyname" - - "getservbyport" - - "getservent" - - "setservent" - - "getprotobyname" - - "getprotobynumber" - - "chroot" - - "usleep" - - "send" - - "recv" - - "putenv" - - "poll" - - "select" - - "setlocale" - - "localeconv" - - "sem_wait" - - "sem_trywait" - - "sem_post" - - "statvfs" - - "fstatvfs" - - "sigemptyset" - - "sigaddset" - - "sigfillset" - - "sigdelset" - - "sigismember" - - "sigprocmask" - - "sigpending" - - "sysconf" - - "mkfifo" - - "fseeko" - - "ftello" - - "tcdrain" - - "cfgetispeed" - - "cfgetospeed" - - "cfsetispeed" - - "cfsetospeed" - - "tcgetattr" - - "tcsetattr" - - "tcflow" - - "tcflush" - - "tcgetsid" - - "tcsendbreak" - - "mkstemp" - - "mkdtemp" - - "tmpnam" - - "openlog" - - "closelog" - - "setlogmask" - - "syslog" - - "nice" - - "grantpt" - - "posix_openpt" - - "ptsname" - - "unlockpt" - - "strcasestr" - - "getline" - - "lockf" - - - "htonl" - - "htons" - - "ntohl" - - "ntohs" - - - "getsid" - - "pause" - - "mkdirat" - - "openat" - - "fdopendir" - - "readdir_r" - - - "readlinkat" - - "fmemopen" - - "open_memstream" - - "atexit" - - "sigaction" - - "readlink" - - "pselect" - - - "cfmakeraw" - - "cfsetspeed" - - - "confstr" - "strerror_r" - - - "aligned_alloc" - # unix/linux_like/mod.rs - - "ioctl" - - "sem_destroy" - - "sem_init" - - "fdatasync" - - "mincore" - - "clock_getres" - - "clock_gettime" - - "clock_settime" - - "clock_getcpuclockid" - - "dirfd" - - "pthread_getattr_np" - - "pthread_attr_getstack" - - "pthread_attr_setstack" - - "memalign" - - "setgroups" - - "pipe2" - - "statfs" - - "fstatfs" - - "memrchr" - - "posix_fadvise" - - "futimens" - - "utimensat" - - "duplocale" - - "freelocale" - - "newlocale" - - "uselocale" - - "mknodat" - - "pthread_condattr_getclock" - - "pthread_condattr_setclock" - - "pthread_condattr_setpshared" - - "pthread_mutexattr_setpshared" - - "pthread_rwlockattr_getpshared" - - "pthread_rwlockattr_setpshared" - - "ptsname_r" - - "clearenv" - - "waitid" - - "getresuid" - - "getresgid" - - "acct" - - "brk" - - "sbrk" - - "vfork" - - "setresgid" - - "setresuid" - - "wait4" - - "login_tty" - - "execvpe" - - "fexecve" - - "getifaddrs" - - "freeifaddrs" - - "bind" - - "writev" - - "readv" - - "sendmsg" - - "recvmsg" - - "uname" - - "strchrnul" - - "strftime" - - "strftime_l" - - "strptime" - - "mkostemp" - - "mkostemps" - - "getdomainname" - - "setdomainname" - - "fstatfs64" - - "statvfs64" - - "fstatvfs64" - - "statfs64" - - "creat64" - - "fstat64" - - "fstatat64" - - "ftruncate64" - - "lseek64" - - "lstat64" - - "mmap64" - - "open64" - - "openat64" - - "posix_fadvise64" - - "pread64" - - "pwrite64" - - "readdir64" - - "readdir64_r" - - "stat64" - - "truncate64" - - "preadv64" - - "pwritev64" - - "forkpty" - - "openpty" - - "statx" + - "getlogin_r" + - "getpass" + - "getusershell" + - "setpgrp" + - "setusershell" + - "swab" + - "get_current_dir_name" + - "clock" + - "timespec_get" + - "asctime" + - "ctime" + - "tzset" + - "timelocal" + - "sockatmark" + - "inet_addr" + - "inet_network" + - "inet_ntoa" + - "inet_aton" + - "inet_ntop" + - "inet_pton" + - "inet_makeaddr" + - "inet_netof" + - "ether_ntoa" + - "ether_ntoa_r" + - "ether_aton" + - "mblen" + - "mbtowc" + - "wctomb" + - "mbstowcs" + - "initstate" + - "setstate" + - "srandom" + - "strtod_l" + - "strtof_l" + - "getsubopt" + - "secure_getenv" + - "canonicalize_file_name" + - "dprintf" + - "vdprintf" + - "fgetln" + - "tempnam" + - "alphasort" + - "scandir" + - "versionsort" + - "backtrace_symbols" + - "backtrace_symbols_fd" + - "name_to_handle_at" + - "open_by_handle_at" + - "getopt_long_only" + - "setlinebuf" + - "setbuffer" + - "vfprintf" + - "vfscanf" + - "vprintf" + - "vscanf" + - "vsnprintf" + - "vsprintf" + - "vsscanf" + - "vasprintf" + - "gets" + - "getc" + - "putc" + - "getc_unlocked" + - "putc_unlocked" + - "getdelim" + - "asprintf" + - "flockfile" + - "funlockfile" + - "ftrylockfile" + - "clearerr_unlocked" + - "feof_unlocked" + - "ferror_unlocked" + - "fileno_unlocked" + - "fflush_unlocked" + - "fgetc_unlocked" + - "fputc_unlocked" + - "fwrite_unlocked" + - "fgets_unlocked" + - "fputs_unlocked" + - "fgetgrent" + - "basename" + - "endhostent" + - "endnetent" + - "endprotoent" + - "gethostent" + - "gethostbyname" + - "gethostbyname2" + - "gethostbyaddr" + - "gethostbyaddr_r" + - "gethostbyname_r" + - "getnetbyaddr" + - "getnetbyname" + - "getnetent" + - "getprotoent" + - "sethostent" + - "setnetent" + - "setprotoent" + - "pthread_cleanup_push" + - "pthread_cleanup_pop" + - "flock64" + - "get_nprocs" + - "get_nprocs_conf" + - "timeradd" + - "timersub" + - "timerclear" + - "timerisset" + - "msgctl" forced_functions: - "__errno_location" @@ -2052,7 +770,10 @@ force_struct_member_type: type: "sighandler_t" "siginfo_t": - name: "__si_fields" - type: "[c_char; 112]" + type: "[c_char; 116]" + - name: "__si_align" + append: true + type: "[usize; 0]" "stat": - name: "st_atim" replace: @@ -2072,31 +793,42 @@ force_struct_member_type: type: "crate::time_t" - name: "st_ctime_nsec" type: "i64" + "termios": + - name: "c_cc" + type: "[crate::cc_t; crate::NCCS]" + "utmp": + - name: "ut_line" + type: "[c_char; crate::UT_LINESIZE]" + - name: "ut_user" + type: "[c_char; crate::UT_NAMESIZE]" + - name: "ut_host" + type: "[c_char; crate::UT_HOSTSIZE]" + "lastlog": + - name: "ll_line" + type: "[c_char; crate::UT_LINESIZE]" + - name: "ll_host" + type: "[c_char; crate::UT_HOSTSIZE]" + "utmpx": + - name: "ut_line" + type: "[c_char; crate::__UT_LINESIZE]" + - name: "ut_user" + type: "[c_char; crate::__UT_NAMESIZE]" + - name: "ut_host" + type: "[c_char; crate::__UT_HOSTSIZE]" force_struct_zero_fill: - - "__mlibc_mutex" + - "__mlibc_barrier" + - "__mlibc_barrierattr_struct" - "__mlibc_cond" + - "__mlibc_condattr" - "__mlibc_fair_rwlock" + - "__mlibc_mutex" + - "__mlibc_mutexattr" + - "__mlibc_rwlockattr" + - "__mlibc_threadattr" force_macro_type: "c_ulong": - - "FIOCLEX" - - "FIONBIO" - - "FIONCLEX" - - "FIONREAD" - - "SIOCDEVPRIVATE" - - "SIOCGIFMTU" - - "SIOCSIFMTU" - - "TIOCGWINSZ" - - "TIOCSCTTY" - - "TIOCSWINSZ" - - "SA_NOCLDSTOP" - - "SA_NOCLDWAIT" - - "SA_NODEFER" - - "SA_ONSTACK" - - "SA_RESETHAND" - - "SA_RESTART" - - "SA_SIGINFO" - "ST_RDONLY" - "ST_NOSUID" - "ST_NODEV" @@ -2108,30 +840,57 @@ force_macro_type: - "ST_IMMUTABLE" - "ST_NOATIME" - "ST_NODIRATIME" - "c_uint": - - "IGNBRK" - - "BRKINT" - - "IGNPAR" - - "PARMRK" - - "INPCK" - - "ISTRIP" - - "INLCR" - - "IGNCR" - - "ICRNL" - - "IUCLC" - - "IXON" - - "IXANY" - - "IXOFF" + # sigaction(2)'s sa_flags is typed unsigned long on Linux + - "SA_NOCLDSTOP" + - "SA_NOCLDWAIT" + - "SA_SIGINFO" + - "SA_ONSTACK" + - "SA_RESTART" + - "SA_NODEFER" + - "SA_RESETHAND" + - "SA_RESTORER" "c_short": - "POLLWRNORM" - "POLLWRBAND" + - "EMPTY" + - "RUN_LVL" + - "BOOT_TIME" + - "NEW_TIME" + - "OLD_TIME" + - "INIT_PROCESS" + - "LOGIN_PROCESS" + - "USER_PROCESS" + - "DEAD_PROCESS" + - "ACCOUNTING" + "c_uchar": + - "PACKET_HOST" + "c_uint": + - "GRND_NONBLOCK" + - "GRND_RANDOM" + - "GRND_INSECURE" "usize": - "NCCS" - "PTHREAD_STACK_MIN" - "VEOF" - "VMIN" - "VTIME" + - "VSWTC" + - "VSTART" + - "VSTOP" + - "VSUSP" + - "VEOL" + - "VREPRINT" + - "VDISCARD" + - "VWERASE" + - "VEOL2" + - "MINSIGSTKSZ" - "SIGSTKSZ" + - "__UT_LINESIZE" + - "__UT_NAMESIZE" + - "__UT_HOSTSIZE" + - "UT_LINESIZE" + - "UT_NAMESIZE" + - "UT_HOSTSIZE" "crate::speed_t": - "B0" - "B50" @@ -2164,6 +923,8 @@ force_macro_type: - "B3000000" - "B3500000" - "B4000000" + - "EXTA" + - "EXTB" "crate::tcflag_t": - "BS1" - "BSDLY" @@ -2196,7 +957,10 @@ force_macro_type: - "ICANON" - "IEXTEN" - "ISIG" + - "IUCLC" - "IUTF8" + - "IXOFF" + - "IXON" - "NLDLY" - "NOFLSH" - "OLCUC" @@ -2211,4 +975,101 @@ force_macro_type: - "TOSTOP" - "VT1" - "VTDLY" + - "XCASE" - "XTABS" + "crate::Ioctl": + - "FIOCLEX" + - "FIONBIO" + - "FIONCLEX" + - "FIONREAD" + - "SIOCATMARK" + - "SIOCDEVPRIVATE" + - "SIOCGIFADDR" + - "SIOCGIFBRDADDR" + - "SIOCGIFCONF" + - "SIOCGIFFLAGS" + - "SIOCGIFHWADDR" + - "SIOCGIFINDEX" + - "SIOCGIFMTU" + - "SIOCGIFNAME" + - "SIOCGIFNETMASK" + - "SIOCGSTAMP" + - "SIOCPROTOPRIVATE" + - "SIOCSIFFLAGS" + - "SIOCSIFMTU" + - "TIOCEXCL" + - "TIOCGPGRP" + - "TIOCGWINSZ" + - "TIOCMBIC" + - "TIOCMBIS" + - "TIOCMGET" + - "TIOCNXCL" + - "TIOCSCTTY" + - "TIOCSPGRP" + - "TIOCSWINSZ" + "crate::nl_item": + - "ABDAY_1" + - "ABDAY_2" + - "ABDAY_3" + - "ABDAY_4" + - "ABDAY_5" + - "ABDAY_6" + - "ABDAY_7" + - "DAY_1" + - "DAY_2" + - "DAY_3" + - "DAY_4" + - "DAY_5" + - "DAY_6" + - "DAY_7" + - "ABMON_1" + - "ABMON_2" + - "ABMON_3" + - "ABMON_4" + - "ABMON_5" + - "ABMON_6" + - "ABMON_7" + - "ABMON_8" + - "ABMON_9" + - "ABMON_10" + - "ABMON_11" + - "ABMON_12" + - "MON_1" + - "MON_2" + - "MON_3" + - "MON_4" + - "MON_5" + - "MON_6" + - "MON_7" + - "MON_8" + - "MON_9" + - "MON_10" + - "MON_11" + - "MON_12" + - "AM_STR" + - "PM_STR" + - "D_T_FMT" + - "D_FMT" + - "T_FMT" + - "T_FMT_AMPM" + - "ERA" + - "ERA_D_FMT" + - "ALT_DIGITS" + - "ERA_D_T_FMT" + - "ERA_T_FMT" + - "CODESET" + - "CRNCYSTR" + - "RADIXCHAR" + - "DECIMAL_POINT" + - "THOUSEP" + - "THOUSANDS_SEP" + - "YESEXPR" + - "NOEXPR" + +force_struct_extra_traits: + "sigaction": + - "// FIXME(1.0): This should not implement `PartialEq`" + - "#[allow(unpredictable_function_pointer_comparisons)]" + "glob_t": + - "// FIXME(1.0): This should not implement `PartialEq`" + - "#[allow(unpredictable_function_pointer_comparisons)]" diff --git a/scripts/rust-libc.py b/scripts/rust-libc.py index 85a5b7905..bf855721f 100644 --- a/scripts/rust-libc.py +++ b/scripts/rust-libc.py @@ -29,7 +29,6 @@ from clang.cindex import Cursor, CursorKind, TokenKind, TypeKind from dataclasses import dataclass -dry_run = True errors_emitted = 0 @@ -42,11 +41,6 @@ def log_err(prefix, msg): errors_emitted += 1 -def emit(msg): - if not dry_run: - print(msg) - - def no_system_includes(cursor, level): """filter out verbose stuff from system include files""" return (level != 1) or ( @@ -106,7 +100,7 @@ def convert_ptr_type(self, c, ty, is_pointee=False): case ["struct", x, *_] if x in config["force_local_type"]: return prefix + x case ["struct", x, *_]: - return f"{prefix} crate::{x}" + return f"{prefix}crate::{x}" case ["int", *_]: return prefix + "c_int" case ["unsigned", "char", *_]: @@ -265,13 +259,17 @@ class State: structs = [] variables = [] + decorated_structs_out = [] + undecorated_structs_out = [] + functions_out = [] + types_out = [] + constants_out = [] + enums_out = [] + @dataclass class RustBindingGenerator: config: dict - in_function_block = False - in_struct_block = False - in_union_block = False def handle_macro(self, cursor, gen, state): def is_num(s): @@ -304,6 +302,7 @@ def is_num(s): i += 1 elif gen[i].kind == TokenKind.PUNCTUATION and gen[i].spelling == "-": is_unsigned = False + is_negative = True i += 1 elif gen[i].kind in ( TokenKind.LITERAL, @@ -353,7 +352,7 @@ def is_num(s): if cursor.displayname in config["force_macro_type"][name]: c_type = name break - emit( + state.constants_out.append( "pub const {}: {} = {}{};".format( cursor.displayname, c_type, @@ -363,12 +362,11 @@ def is_num(s): ) state.macros.append(cursor.displayname) - def indent(self, level=0): - if self.in_function_block or self.in_struct_block or self.in_union_block: - return "\t" * (level + 1) - return "" + def indent(self, level): + return " " * level - def handle_field_decl(self, cursor, c, inline_defs): + def handle_field_decl(self, cursor, c, inline_defs, level) -> str: + out = "" tc = Type(c) assert tc.is_valid() name = str(tc) @@ -383,28 +381,30 @@ def handle_field_decl(self, cursor, c, inline_defs): name = ( detail["rename-to"] if "rename-to" in detail else c.displayname ) - emit( - self.indent(1) - + f"pub {Type.escape_name(name)}: {detail['type']}," + out += ( + self.indent(level) + + f"pub {Type.escape_name(name)}: {detail['type']},\n" ) - if inline_defs[-1].get_usr() == c.type.get_declaration().get_usr(): + if inline_defs and inline_defs[-1].get_usr() == c.type.get_declaration().get_usr(): inline_defs.pop() - return + return out elif "replace" in detail: for member in detail["replace"]: - emit( - self.indent(1) - + "pub {}: {},".format(member["name"], member["type"]) + out += ( + self.indent(level) + + "pub {}: {},\n".format(member["name"], member["type"]) ) - return + return out else: log_err( "invalid configuration", f"missing info for override for struct '{c.displayname}'", ) - emit(self.indent(1) + f"pub {Type.escape_name(c.displayname)}: {name},") + out += (self.indent(level) + f"pub {Type.escape_name(c.displayname)}: {name},\n") + return out - def handle_data_structs(self, cursor, state, level=0): + def handle_data_structs(self, cursor, state, level=0) -> str: + out: str = "" inline_defs = [] children = [i for i in cursor.get_children()] @@ -413,74 +413,75 @@ def handle_data_structs(self, cursor, state, level=0): not children and Type.cursor_name(cursor) not in config["forced_empty_structs"] ): - return - - if self.in_struct_block and cursor.kind != CursorKind.STRUCT_DECL: - emit("}") - self.in_struct_block = False - if self.in_union_block and cursor.kind != CursorKind.UNION_DECL: - emit("}") - self.in_union_block = False + return out match cursor.kind: case CursorKind.STRUCT_DECL: - if not self.in_struct_block: - emit("s! {") - self.in_struct_block = True packed = False for m in cursor.get_children(): if CursorKind.PACKED_ATTR == m.kind: packed = True break + struct_name = Type.cursor_name(cursor) if packed: - emit(self.indent() + "#[repr(packed)]") - emit(self.indent() + f"pub struct {Type.cursor_name(cursor)} {{") - state.structs.append(Type.cursor_name(cursor)) + out += (self.indent(level) + "#[repr(packed)]\n") + if "force_struct_extra_traits" in config and struct_name in config["force_struct_extra_traits"]: + for l in config["force_struct_extra_traits"][struct_name]: + out += (self.indent(level) + l + "\n") + out += (self.indent(level) + f"pub struct {struct_name} {{\n") + state.structs.append(struct_name) case CursorKind.UNION_DECL: - if not self.in_union_block: - emit("s_no_extra_traits! {") - self.in_union_block = True - emit("#[repr(C)]") - emit(self.indent() + f"pub union {Type.cursor_name(cursor)} {{") + out += ("#[repr(C)]\n") + out += (self.indent(level) + f"pub union {Type.cursor_name(cursor)} {{\n") state.structs.append(Type.cursor_name(cursor)) case CursorKind.ENUM_DECL: if cursor.type.get_declaration().is_anonymous() and level == 1: # ignore anonymous enums in the global scope - return - emit(self.indent() + f"pub enum {Type.cursor_name(cursor)} {{") + return out + out += (self.indent(level) + f"pub enum {Type.cursor_name(cursor)} {{\n") state.structs.append(Type.cursor_name(cursor)) case _: log_err("unhandled data struct kind", f"{cursor.kind}") if Type.cursor_name(cursor) in config["force_struct_zero_fill"]: struct_size = cursor.type.get_size() - emit("\t\t#[doc(hidden)]") - emit(f"\t\tsize: [u8; {struct_size}],") + out += (self.indent(level + 1) + "#[doc(hidden)]\n") + out += (self.indent(level + 1) + f"size: [u8; {struct_size}],\n") else: for c in children: match c.kind: case CursorKind.FIELD_DECL: - self.handle_field_decl(cursor, c, inline_defs) + out += self.handle_field_decl(cursor, c, inline_defs, level + 1) case CursorKind.STRUCT_DECL | CursorKind.UNION_DECL: inline_defs.append(c) case CursorKind.ENUM_CONSTANT_DECL: - emit(f"{c.displayname} = {c.enum_value},") + out += (f"{c.displayname} = {c.enum_value},\n") case CursorKind.PACKED_ATTR: pass case _: log_err(f"unhandled {cursor.kind} member", f"kind {c.kind}") - emit(self.indent() + "}") + if Type.cursor_name(cursor) in config["force_struct_member_type"]: + for field in config["force_struct_member_type"][Type.cursor_name(cursor)]: + if not field.get("append", False): + continue + out += ( + self.indent(level + 1) + + f"pub {Type.escape_name(field["name"])}: {field['type']},\n" + ) + out += (self.indent(level) + "}\n") if cursor.kind == CursorKind.ENUM_DECL: - emit(f"impl Copy for {Type.cursor_name(cursor)} " + "{}") - emit(f"impl Clone for {Type.cursor_name(cursor)} " + "{") - emit(f"\tfn clone(&self) -> {Type.cursor_name(cursor)} {{") - emit("\t\t*self") - emit("\t}") - emit("}") + out += (self.indent(level) + f"impl Copy for {Type.cursor_name(cursor)} " + "{}\n") + out += (self.indent(level) + f"impl Clone for {Type.cursor_name(cursor)} " + "{\n") + out += (self.indent(level + 1) + f"fn clone(&self) -> {Type.cursor_name(cursor)} {{\n") + out += (self.indent(level + 2) + "*self\n") + out += (self.indent(level + 1) + "}\n") + out += (self.indent(level) + "}\n") for s in inline_defs: - self.handle_data_structs(s, state, level + 1) + out = self.handle_data_structs(s, state, level) + '\n' + out + + return out.rstrip('\n') def is_ignored(self, typename, ignorelist, name): if typename == "macros" and name.startswith("_") and name.endswith("_H"): @@ -520,16 +521,6 @@ def from_cursor(self, base_dir, header, cursor, filter_pred, level=0): if filter_pred(cursor, level): t = Type(cursor) - if self.in_struct_block and cursor.kind != CursorKind.STRUCT_DECL: - emit("}") - self.in_struct_block = False - if self.in_union_block and cursor.kind != CursorKind.STRUCT_DECL: - emit("}") - self.in_union_block = False - if self.in_function_block and cursor.kind != CursorKind.FUNCTION_DECL: - emit("}") - self.in_function_block = False - match cursor.kind: case CursorKind.MACRO_DEFINITION: if not self.is_ignored("macros", [], cursor.displayname): @@ -539,17 +530,23 @@ def from_cursor(self, base_dir, header, cursor, filter_pred, level=0): if self.is_ignored("structs", state.structs, cursor.displayname): return - self.handle_data_structs(cursor, state, level) + generated = self.handle_data_structs(cursor, state, level) + if generated: + state.decorated_structs_out.append(generated) case CursorKind.UNION_DECL: if self.is_ignored("unions", state.structs, cursor.displayname): return - self.handle_data_structs(cursor, state, level) + generated = self.handle_data_structs(cursor, state, level) + if generated: + state.undecorated_structs_out.append(generated) case CursorKind.ENUM_DECL: if self.is_ignored("enums", state.structs, cursor.displayname): return - self.handle_data_structs(cursor, state, level) + generated = self.handle_data_structs(cursor, state, level) + if generated: + state.enums_out.append(generated) case CursorKind.TYPEDEF_DECL: if not self.is_ignored("types", state.types, cursor.displayname): underlying = Type(cursor, cursor.underlying_typedef_type) @@ -561,7 +558,7 @@ def from_cursor(self, base_dir, header, cursor, filter_pred, level=0): level, ) if cursor.displayname not in state.structs: - emit(f"pub type {cursor.displayname} = {underlying};") + state.types_out.append(f"pub type {cursor.displayname} = {underlying};") state.types.append(cursor.displayname) case CursorKind.FUNCTION_DECL: if self.is_ignored("functions", state.functions, cursor.spelling): @@ -580,11 +577,9 @@ def from_cursor(self, base_dir, header, cursor, filter_pred, level=0): args.append("...") arg_str = ", ".join(args) ret_type = str(Type(cursor, cursor.type.get_result())) - if not self.in_function_block: - emit('extern "C" {') - self.in_function_block = True - emit( - f"\tpub fn {cursor.spelling}({arg_str})" + state.functions_out.append( + self.indent(level) + + f"pub fn {cursor.spelling}({arg_str})" + (f" -> {ret_type};" if ret_type != "c_void" else ";") ) state.functions.append(cursor.spelling) @@ -615,19 +610,7 @@ def from_cursor(self, base_dir, header, cursor, filter_pred, level=0): ) if t.is_valid(): - emit(f"type '{t}' canonical '{t.canonical}'") - - if level == 0 and self.in_struct_block: - emit("}") - self.in_struct_block = False - - if level == 0 and self.in_union_block: - emit("}") - self.in_union_block = False - - if level == 0 and self.in_function_block: - emit("}") - self.in_function_block = False + print(f"type '{t}' canonical '{t.canonical}'") def parse(file: pathlib.Path, base_dir: pathlib.Path): @@ -654,8 +637,6 @@ def parse(file: pathlib.Path, base_dir: pathlib.Path): exit(errors_emitted + 1) parser = RustBindingGenerator(config) - emit("") - print(f"// {tu.spelling.removeprefix(str(base_dir)).removeprefix('/')}") parser.from_cursor(base_dir, file, tu.cursor, no_system_includes) @@ -682,16 +663,24 @@ def gcc_install_path(gcc: str) -> pathlib.Path | None: argparser.add_argument("-n", dest="dry_run", action="store_true") argparser.add_argument("path") argparser.add_argument("gcc") + argparser.add_argument("-c", dest="configs", type=argparse.FileType(), nargs="+", help="Configuration files to use") argparser.add_argument("file", nargs="?") args = argparser.parse_args() - dry_run = args.dry_run - colorama.just_fix_windows_console() - with io.open(os.path.join(os.path.dirname(__file__), "rust-libc-config.yml"), "r") as f: - config = yaml.load(f, yaml.CSafeLoader) + config = yaml.load(args.configs.pop(0), yaml.CSafeLoader) + + for f in args.configs: + ignores = yaml.load(f, yaml.CSafeLoader) + + for l in ignores: + if ignores[l]: + if l in config: + config[l].extend(ignores[l]) + else: + config[l] = ignores[l] path = pathlib.Path(args.path) @@ -705,9 +694,6 @@ def gcc_install_path(gcc: str) -> pathlib.Path | None: config["includes"] = list() config["includes"].insert(0, gcc_include_path) - with io.open(os.path.join(os.path.dirname(__file__), "rust-libc-header.rs"), "r") as f: - emit(f.read()) - state = State() if not args.file: @@ -719,4 +705,17 @@ def gcc_install_path(gcc: str) -> pathlib.Path | None: if errors_emitted > 0: print(f"\n{errors_emitted} errors emitted") + if not args.dry_run: + with io.open(os.path.join(os.path.dirname(__file__), "rust-libc-bindings.rs.in"), "r") as f: + out = f.read() + out = out.replace('@BINDINGS_TYPES@', '\n'.join(state.types_out)) + out = out.replace('@BINDINGS_CONSTANTS@\n', '\n'.join(state.constants_out)) + out = out.replace('@BINDINGS_STRUCTS_UNDECORATED@\n', '\n'.join(state.undecorated_structs_out)) + out = out.replace('@BINDINGS_STRUCTS_DECORATED@', '\n'.join(state.decorated_structs_out)) + out = out.replace('@BINDINGS_FUNCTIONS@', '\n'.join(state.functions_out)) + out = out.replace('@BINDINGS_ENUMS@', '\n'.join(state.enums_out)) + print("// This file is autogenerated!") + print("// All changes made will be lost (eventually)!") + print(out) + exit(errors_emitted)