diff options
Diffstat (limited to '')
-rw-r--r-- | debian/changelog | 23 | ||||
-rw-r--r-- | debian/control | 4 | ||||
-rwxr-xr-x | debian/get-stage0.py | 4 | ||||
-rwxr-xr-x | debian/make_orig-stage0_tarball.sh | 2 | ||||
-rw-r--r-- | debian/patches/d-ignore-test_arc_condvar_poison-ppc.patch | 12 | ||||
-rw-r--r-- | debian/patches/series | 8 | ||||
-rw-r--r-- | debian/patches/u-hurd-backtrace.patch | 72 | ||||
-rw-r--r-- | debian/patches/u-hurd-getrandom.patch | 77 | ||||
-rw-r--r-- | debian/patches/u-hurd-libc.3.patch | 2295 | ||||
-rw-r--r-- | debian/patches/u-hurd-libc.4.patch | 347 | ||||
-rw-r--r-- | debian/patches/u-hurd-libloading-0.7.4.patch | 44 | ||||
-rw-r--r-- | debian/patches/u-hurd-socket2.patch | 92 | ||||
-rw-r--r-- | debian/patches/u-hurd-tests.patch | 54 |
13 files changed, 3029 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog index 1f0571af1..34a1ae933 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,26 @@ +rustc (1.75.0+dfsg1-5) unstable; urgency=medium + + [ Samuel Thibault ] + * hurd-i386 build fixes: + - d/patches/u-hurd-backtrace.patch + - d/patches/u-hurd-getrandom.patch + - d/patches/u-hurd-libc.3.patch + - d/patches/u-hurd-libc.4.patch + - d/patches/u-hurd-libloading-0.7.4.patch + - d/patches/u-hurd-socket2.patch + - d/patches/u-hurd-tests.patch + + [ Fabian Grünbichler ] + * hurd: also skip problematic run-make test + * powerpc: disable test running into timeout (Closes: #1072897) + * d/control: replace non-ASCII apostrophe (Closes: #1072926) + * stage0: drop mips64el from default list + + [ Rob Shearman ] + * fix get-stage0.py + + -- Fabian Grünbichler <debian@fabian.gruenbichler.email> Wed, 12 Jun 2024 17:33:10 +0200 + rustc (1.75.0+dfsg1-4~progress7.99u1) graograman-backports; urgency=medium * Uploading to graograman-backports, remaining changes: diff --git a/debian/control b/debian/control index 35978d88b..9e2fbe3a4 100644 --- a/debian/control +++ b/debian/control @@ -409,7 +409,7 @@ Description: Rust package manager your project. * Introduces conventions, making working with Rust projects easier. . - Cargo downloads your Rust project’s dependencies and compiles your + Cargo downloads your Rust project's dependencies and compiles your project. Package: cargo-doc @@ -429,7 +429,7 @@ Description: Rust package manager, documentation your project. * Introduces conventions, making working with Rust projects easier. . - Cargo downloads your Rust project’s dependencies and compiles your + Cargo downloads your Rust project's dependencies and compiles your project. . This package contains the documentation. diff --git a/debian/get-stage0.py b/debian/get-stage0.py index 49f8066ca..f37ef2b61 100755 --- a/debian/get-stage0.py +++ b/debian/get-stage0.py @@ -11,7 +11,7 @@ from bootstrap import RustBuild class DownloadOnlyRustBuild(RustBuild): triple = None - def build_bootstrap(self, color, verbose_count): + def build_bootstrap(self): pass def run(self, *args): pass @@ -26,7 +26,7 @@ def main(argv): triple = argv.pop(1) DownloadOnlyRustBuild.triple = triple bootstrap.RustBuild = DownloadOnlyRustBuild - args = bootstrap.parse_args() + args = bootstrap.parse_args(argv) # bootstrap.py likes to delete our .cargo directory out from under us shutil.move(".cargo", ".cargo-bak") try: diff --git a/debian/make_orig-stage0_tarball.sh b/debian/make_orig-stage0_tarball.sh index d3f6ee38f..b6010532a 100755 --- a/debian/make_orig-stage0_tarball.sh +++ b/debian/make_orig-stage0_tarball.sh @@ -7,7 +7,7 @@ set -e upstream_version="$(dpkg-parsechangelog -SVersion | sed -e 's/\(.*\)-.*/\1/g')" -upstream_bootstrap_arch="${upstream_bootstrap_arch:-amd64 arm64 armhf i386 mips64el ppc64el riscv64 s390x}" +upstream_bootstrap_arch="${upstream_bootstrap_arch:-amd64 arm64 armhf i386 ppc64el riscv64 s390x}" rm -f stage0/*/*.sha256 mkdir -p stage0 build && ln -sf ../stage0 build/cache diff --git a/debian/patches/d-ignore-test_arc_condvar_poison-ppc.patch b/debian/patches/d-ignore-test_arc_condvar_poison-ppc.patch new file mode 100644 index 000000000..c9684a26c --- /dev/null +++ b/debian/patches/d-ignore-test_arc_condvar_poison-ppc.patch @@ -0,0 +1,12 @@ +Index: rustc-1.75.0+dfsg1/library/std/src/sync/mutex/tests.rs +=================================================================== +--- rustc-1.75.0+dfsg1.orig/library/std/src/sync/mutex/tests.rs ++++ rustc-1.75.0+dfsg1/library/std/src/sync/mutex/tests.rs +@@ -145,6 +145,7 @@ fn test_mutex_arc_condvar() { + } + } + ++#[cfg(not(target_arch = "powerpc"))] + #[test] + fn test_arc_condvar_poison() { + let packet = Packet(Arc::new((Mutex::new(1), Condvar::new()))); diff --git a/debian/patches/series b/debian/patches/series index 2dfca26e8..9cf609ebd 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -13,11 +13,19 @@ u-reproducible-build.patch u-fix-get-toml-when-test.patch u-riscv-disable-unpacked-split-debuginfo.patch u-avoid-blessing-cargo-deps-s-source-code-in-ui-tests.patch +u-hurd-backtrace.patch +u-hurd-getrandom.patch +u-hurd-libc.3.patch +u-hurd-libc.4.patch +u-hurd-libloading-0.7.4.patch +u-hurd-socket2.patch # not forwarded, or forwarded but unlikely to be merged u-ignore-ppc-hangs.patch u-rustc-llvm-cross-flags.patch #u-allow-system-compiler-rt.patch +u-hurd-tests.patch +d-ignore-test_arc_condvar_poison-ppc.patch # Debian-specific patches, not suitable for upstream d-disable-download-tests.patch diff --git a/debian/patches/u-hurd-backtrace.patch b/debian/patches/u-hurd-backtrace.patch new file mode 100644 index 000000000..7ac529937 --- /dev/null +++ b/debian/patches/u-hurd-backtrace.patch @@ -0,0 +1,72 @@ +https://github.com/rust-lang/backtrace-rs/pull/567 + +commit 11e0a4bdee2714a3711b3df1607dbe979119fd34 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Sat Oct 7 01:45:09 2023 +0200 + + Add GNU/Hurd support (rust-lang/backtrace-rs#567) + +diff --git a/vendor/backtrace/src/symbolize/gimli.rs b/vendor/backtrace/src/symbolize/gimli.rs +index 5d2f627..3b28bf7 100644 +--- a/vendor/backtrace/src/symbolize/gimli.rs ++++ b/vendor/backtrace/src/symbolize/gimli.rs +@@ -35,6 +35,7 @@ cfg_if::cfg_if! { + target_os = "freebsd", + target_os = "fuchsia", + target_os = "haiku", ++ target_os = "hurd", + target_os = "ios", + target_os = "linux", + target_os = "macos", +@@ -231,6 +232,7 @@ cfg_if::cfg_if! { + target_os = "linux", + target_os = "fuchsia", + target_os = "freebsd", ++ target_os = "hurd", + target_os = "openbsd", + target_os = "netbsd", + all(target_os = "android", feature = "dl_iterate_phdr"), +diff --git a/vendor/backtrace/src/symbolize/gimli/elf.rs b/vendor/backtrace/src/symbolize/gimli/elf.rs +index b0eec07..906a300 100644 +--- a/vendor/backtrace/src/symbolize/gimli/elf.rs ++++ b/vendor/backtrace/src/symbolize/gimli/elf.rs +@@ -308,7 +308,7 @@ const DEBUG_PATH: &[u8] = b"/usr/lib/debug"; + + fn debug_path_exists() -> bool { + cfg_if::cfg_if! { +- if #[cfg(any(target_os = "freebsd", target_os = "linux"))] { ++ if #[cfg(any(target_os = "freebsd", target_os = "hurd", target_os = "linux"))] { + use core::sync::atomic::{AtomicU8, Ordering}; + static DEBUG_PATH_EXISTS: AtomicU8 = AtomicU8::new(0); + +diff --git a/vendor/backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs b/vendor/backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs +index 9f0304c..518512f 100644 +--- a/vendor/backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs ++++ b/vendor/backtrace/src/symbolize/gimli/libs_dl_iterate_phdr.rs +@@ -18,14 +18,18 @@ pub(super) fn native_libraries() -> Vec<Library> { + } + + fn infer_current_exe(base_addr: usize) -> OsString { +- if let Ok(entries) = super::parse_running_mmaps::parse_maps() { +- let opt_path = entries +- .iter() +- .find(|e| e.ip_matches(base_addr) && e.pathname().len() > 0) +- .map(|e| e.pathname()) +- .cloned(); +- if let Some(path) = opt_path { +- return path; ++ cfg_if::cfg_if! { ++ if #[cfg(not(target_os = "hurd"))] { ++ if let Ok(entries) = super::parse_running_mmaps::parse_maps() { ++ let opt_path = entries ++ .iter() ++ .find(|e| e.ip_matches(base_addr) && e.pathname().len() > 0) ++ .map(|e| e.pathname()) ++ .cloned(); ++ if let Some(path) = opt_path { ++ return path; ++ } ++ } + } + } + env::current_exe().map(|e| e.into()).unwrap_or_default() diff --git a/debian/patches/u-hurd-getrandom.patch b/debian/patches/u-hurd-getrandom.patch new file mode 100644 index 000000000..887033800 --- /dev/null +++ b/debian/patches/u-hurd-getrandom.patch @@ -0,0 +1,77 @@ +https://github.com/rust-random/getrandom/pull/370 + +commit c96bfff10ba20326fc5a89bc7f51056ce8e19e38 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Tue Aug 29 19:45:37 2023 +0000 + + Add GNU/Hurd support + + Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> + +diff --git a/vendor/getrandom/src/hurd.rs b/vendor/getrandom/src/hurd.rs +new file mode 100644 +index 0000000..842b9bc +--- /dev/null ++++ b/vendor/getrandom/src/hurd.rs +@@ -0,0 +1,18 @@ ++// Copyright 2021 Developers of the Rand project. ++// ++// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or ++// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license ++// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your ++// option. This file may not be copied, modified, or distributed ++// except according to those terms. ++ ++//! Implementation for GNU/Hurd ++use crate::util_libc::sys_fill_exact; ++use crate::Error; ++use core::mem::MaybeUninit; ++ ++pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> { ++ sys_fill_exact(dest, |buf| unsafe { ++ libc::getrandom(buf.as_mut_ptr() as *mut libc::c_void, buf.len(), 0) ++ }) ++} +diff --git a/vendor/getrandom/src/lib.rs b/vendor/getrandom/src/lib.rs +index fbfe729..6336098 100644 +--- a/vendor/getrandom/src/lib.rs ++++ b/vendor/getrandom/src/lib.rs +@@ -25,6 +25,7 @@ + //! | Redox | `*‑redox` | `/dev/urandom` + //! | Haiku | `*‑haiku` | `/dev/urandom` (identical to `/dev/random`) + //! | Hermit | `*-hermit` | [`sys_read_entropy`] ++//! | Hurd | `*-hurd-*` | [`getrandom`][17] + //! | SGX | `x86_64‑*‑sgx` | [`RDRAND`] + //! | VxWorks | `*‑wrs‑vxworks‑*` | `randABytes` after checking entropy pool initialization with `randSecure` + //! | ESP-IDF | `*‑espidf` | [`esp_fill_random`] +@@ -166,6 +167,7 @@ + //! [14]: https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/r/random.html + //! [15]: https://www.ibm.com/docs/en/aix/7.3?topic=files-random-urandom-devices + //! [16]: https://man.netbsd.org/getrandom.2 ++//! [17]: https://www.gnu.org/software/libc/manual/html_mono/libc.html#index-getrandom + //! + //! [`BCryptGenRandom`]: https://docs.microsoft.com/en-us/windows/win32/api/bcrypt/nf-bcrypt-bcryptgenrandom + //! [`Crypto.getRandomValues`]: https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues +@@ -278,6 +280,9 @@ cfg_if! { + any(target_arch = "wasm32", target_arch = "wasm64"), + target_os = "unknown"))] { + #[path = "js.rs"] mod imp; ++ } else if #[cfg(target_os = "hurd")] { ++ mod util_libc; ++ #[path = "hurd.rs"] mod imp; + } else if #[cfg(feature = "custom")] { + use custom as imp; + } else if #[cfg(all(any(target_arch = "wasm32", target_arch = "wasm64"), +diff --git a/vendor/getrandom/src/util_libc.rs b/vendor/getrandom/src/util_libc.rs +index 4b94144..99bee38 100644 +--- a/vendor/getrandom/src/util_libc.rs ++++ b/vendor/getrandom/src/util_libc.rs +@@ -19,7 +19,7 @@ use libc::c_void; + cfg_if! { + if #[cfg(any(target_os = "netbsd", target_os = "openbsd", target_os = "android"))] { + use libc::__errno as errno_location; +- } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "redox"))] { ++ } else if #[cfg(any(target_os = "linux", target_os = "emscripten", target_os = "hurd", target_os = "redox"))] { + use libc::__errno_location as errno_location; + } else if #[cfg(any(target_os = "solaris", target_os = "illumos"))] { + use libc::___errno as errno_location; diff --git a/debian/patches/u-hurd-libc.3.patch b/debian/patches/u-hurd-libc.3.patch new file mode 100644 index 000000000..ff1f1b2f9 --- /dev/null +++ b/debian/patches/u-hurd-libc.3.patch @@ -0,0 +1,2295 @@ +https://github.com/rust-lang/libc/pull/3428 + +commit c72c68c5d12e9307ee4b307384c620b0778c5240 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Thu Nov 9 03:34:21 2023 +0100 + + hurd: Complete C API interface + + This aligns it on what can be found for linux. + +diff --git a/vendor/libc/src/unix/hurd/b32.rs b/vendor/libc/src/unix/hurd/b32.rs +index 7e83ed930..7e82a91d3 100644 +--- a/vendor/libc/src/unix/hurd/b32.rs ++++ b/vendor/libc/src/unix/hurd/b32.rs +@@ -25,6 +25,8 @@ pub type __ulong32_type = ::c_ulong; + pub type __s64_type = ::__int64_t; + pub type __u64_type = ::__uint64_t; + ++pub type __ipc_pid_t = ::c_ushort; ++ + pub type Elf32_Half = u16; + pub type Elf32_Word = u32; + pub type Elf32_Off = u32; +diff --git a/vendor/libc/src/unix/hurd/b64.rs b/vendor/libc/src/unix/hurd/b64.rs +index 3b171f104..e2e502af2 100644 +--- a/vendor/libc/src/unix/hurd/b64.rs ++++ b/vendor/libc/src/unix/hurd/b64.rs +@@ -25,6 +25,8 @@ pub type __ulong32_type = ::c_uint; + pub type __s64_type = ::c_long; + pub type __u64_type = ::c_ulong; + ++pub type __ipc_pid_t = ::c_int; ++ + pub type Elf64_Half = u16; + pub type Elf64_Word = u32; + pub type Elf64_Off = u64; +diff --git a/vendor/libc/src/unix/hurd/mod.rs b/vendor/libc/src/unix/hurd/mod.rs +index 05d75851d..75a272e4d 100644 +--- a/vendor/libc/src/unix/hurd/mod.rs ++++ b/vendor/libc/src/unix/hurd/mod.rs +@@ -215,6 +215,10 @@ pub type tcp_ca_state = ::c_uint; + + pub type idtype_t = ::c_uint; + ++pub type regoff_t = ::c_int; ++ ++pub type iconv_t = *mut ::c_void; ++ + // structs + s! { + pub struct ip_mreq { +@@ -228,6 +232,12 @@ s! { + pub imr_ifindex: ::c_int, + } + ++ pub struct ip_mreq_source { ++ pub imr_multiaddr: in_addr, ++ pub imr_interface: in_addr, ++ pub imr_sourceaddr: in_addr, ++ } ++ + pub struct sockaddr { + pub sa_len: ::c_uchar, + pub sa_family: sa_family_t, +@@ -322,6 +332,12 @@ s! { + pub msg_flags: ::c_int, + } + ++ pub struct cmsghdr { ++ pub cmsg_len: ::socklen_t, ++ pub cmsg_level: ::c_int, ++ pub cmsg_type: ::c_int, ++ } ++ + pub struct dirent { + pub d_ino: __ino_t, + pub d_reclen: ::c_ushort, +@@ -343,13 +359,39 @@ s! { + } + + pub struct termios { +- pub c_iflag: tcflag_t, +- pub c_oflag: tcflag_t, +- pub c_cflag: tcflag_t, +- pub c_lflag: tcflag_t, +- pub c_cc: [cc_t; 20usize], +- pub __ispeed: speed_t, +- pub __ospeed: speed_t, ++ pub c_iflag: ::tcflag_t, ++ pub c_oflag: ::tcflag_t, ++ pub c_cflag: ::tcflag_t, ++ pub c_lflag: ::tcflag_t, ++ pub c_cc: [::cc_t; 20usize], ++ pub __ispeed: ::speed_t, ++ pub __ospeed: ::speed_t, ++ } ++ ++ pub struct mallinfo { ++ pub arena: ::c_int, ++ pub ordblks: ::c_int, ++ pub smblks: ::c_int, ++ pub hblks: ::c_int, ++ pub hblkhd: ::c_int, ++ pub usmblks: ::c_int, ++ pub fsmblks: ::c_int, ++ pub uordblks: ::c_int, ++ pub fordblks: ::c_int, ++ pub keepcost: ::c_int, ++ } ++ ++ pub struct mallinfo2 { ++ pub arena: ::size_t, ++ pub ordblks: ::size_t, ++ pub smblks: ::size_t, ++ pub hblks: ::size_t, ++ pub hblkhd: ::size_t, ++ pub usmblks: ::size_t, ++ pub fsmblks: ::size_t, ++ pub uordblks: ::size_t, ++ pub fordblks: ::size_t, ++ pub keepcost: ::size_t, + } + + pub struct sigaction { +@@ -429,6 +471,36 @@ s! { + pub st_spare: [::c_int; 8usize], + } + ++ pub struct statx { ++ pub stx_mask: u32, ++ pub stx_blksize: u32, ++ pub stx_attributes: u64, ++ pub stx_nlink: u32, ++ pub stx_uid: u32, ++ pub stx_gid: u32, ++ pub stx_mode: u16, ++ __statx_pad1: [u16; 1], ++ pub stx_ino: u64, ++ pub stx_size: u64, ++ pub stx_blocks: u64, ++ pub stx_attributes_mask: u64, ++ pub stx_atime: ::statx_timestamp, ++ pub stx_btime: ::statx_timestamp, ++ pub stx_ctime: ::statx_timestamp, ++ pub stx_mtime: ::statx_timestamp, ++ pub stx_rdev_major: u32, ++ pub stx_rdev_minor: u32, ++ pub stx_dev_major: u32, ++ pub stx_dev_minor: u32, ++ __statx_pad2: [u64; 14], ++ } ++ ++ pub struct statx_timestamp { ++ pub tv_sec: i64, ++ pub tv_nsec: u32, ++ pub __statx_timestamp_pad1: [i32; 1], ++ } ++ + pub struct statfs { + pub f_type: ::c_uint, + pub f_bsize: ::c_ulong, +@@ -493,6 +565,24 @@ s! { + pub f_spare: [::c_uint; 3usize], + } + ++ pub struct aiocb { ++ pub aio_fildes: ::c_int, ++ pub aio_lio_opcode: ::c_int, ++ pub aio_reqprio: ::c_int, ++ pub aio_buf: *mut ::c_void, ++ pub aio_nbytes: ::size_t, ++ pub aio_sigevent: ::sigevent, ++ __next_prio: *mut aiocb, ++ __abs_prio: ::c_int, ++ __policy: ::c_int, ++ __error_code: ::c_int, ++ __return_value: ::ssize_t, ++ pub aio_offset: off_t, ++ #[cfg(all(not(target_arch = "x86_64"), target_pointer_width = "32"))] ++ __unused1: [::c_char; 4], ++ __glibc_reserved: [::c_char; 32] ++ } ++ + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", +@@ -549,7 +639,7 @@ s! { + } + + pub struct __pthread_attr { +- pub __schedparam: __sched_param, ++ pub __schedparam: sched_param, + pub __stackaddr: *mut ::c_void, + pub __stacksize: size_t, + pub __guardsize: size_t, +@@ -578,12 +668,25 @@ s! { + pub __data: *mut ::c_void, + } + ++ pub struct seminfo { ++ pub semmap: ::c_int, ++ pub semmni: ::c_int, ++ pub semmns: ::c_int, ++ pub semmnu: ::c_int, ++ pub semmsl: ::c_int, ++ pub semopm: ::c_int, ++ pub semume: ::c_int, ++ pub semusz: ::c_int, ++ pub semvmx: ::c_int, ++ pub semaem: ::c_int, ++ } ++ + pub struct _IO_FILE { + _unused: [u8; 0], + } + +- pub struct __sched_param { +- pub __sched_priority: ::c_int, ++ pub struct sched_param { ++ pub sched_priority: ::c_int, + } + + pub struct iovec { +@@ -601,6 +704,23 @@ s! { + pub pw_shell: *mut ::c_char, + } + ++ pub struct spwd { ++ pub sp_namp: *mut ::c_char, ++ pub sp_pwdp: *mut ::c_char, ++ pub sp_lstchg: ::c_long, ++ pub sp_min: ::c_long, ++ pub sp_max: ::c_long, ++ pub sp_warn: ::c_long, ++ pub sp_inact: ::c_long, ++ pub sp_expire: ::c_long, ++ pub sp_flag: ::c_ulong, ++ } ++ ++ pub struct itimerspec { ++ pub it_interval: ::timespec, ++ pub it_value: ::timespec, ++ } ++ + pub struct tm { + pub tm_sec: ::c_int, + pub tm_min: ::c_int, +@@ -649,6 +769,59 @@ s! { + pub dli_saddr: *mut ::c_void, + } + ++ pub struct ifaddrs { ++ pub ifa_next: *mut ifaddrs, ++ pub ifa_name: *mut c_char, ++ pub ifa_flags: ::c_uint, ++ pub ifa_addr: *mut ::sockaddr, ++ pub ifa_netmask: *mut ::sockaddr, ++ pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union ++ pub ifa_data: *mut ::c_void ++ } ++ ++ pub struct arpreq { ++ pub arp_pa: ::sockaddr, ++ pub arp_ha: ::sockaddr, ++ pub arp_flags: ::c_int, ++ pub arp_netmask: ::sockaddr, ++ pub arp_dev: [::c_char; 16], ++ } ++ ++ pub struct arpreq_old { ++ pub arp_pa: ::sockaddr, ++ pub arp_ha: ::sockaddr, ++ pub arp_flags: ::c_int, ++ pub arp_netmask: ::sockaddr, ++ } ++ ++ pub struct arphdr { ++ pub ar_hrd: u16, ++ pub ar_pro: u16, ++ pub ar_hln: u8, ++ pub ar_pln: u8, ++ pub ar_op: u16, ++ } ++ ++ pub struct arpd_request { ++ pub req: ::c_ushort, ++ pub ip: u32, ++ pub dev: ::c_ulong, ++ pub stamp: ::c_ulong, ++ pub updated: ::c_ulong, ++ pub ha: [::c_uchar; ::MAX_ADDR_LEN], ++ } ++ ++ pub struct mmsghdr { ++ pub msg_hdr: ::msghdr, ++ pub msg_len: ::c_uint, ++ } ++ ++ pub struct ifreq { ++ /// interface name, e.g. "en0" ++ pub ifr_name: [::c_char; ::IFNAMSIZ], ++ pub ifr_ifru: ::sockaddr, ++ } ++ + pub struct __locale_struct { + pub __locales: [*mut __locale_data; 13usize], + pub __ctype_b: *const ::c_ushort, +@@ -715,6 +888,114 @@ s! { + pub l_len : __off64_t, + pub l_pid : __pid_t, + } ++ ++ pub struct glob_t { ++ pub gl_pathc: ::size_t, ++ pub gl_pathv: *mut *mut c_char, ++ pub gl_offs: ::size_t, ++ pub gl_flags: ::c_int, ++ ++ __unused1: *mut ::c_void, ++ __unused2: *mut ::c_void, ++ __unused3: *mut ::c_void, ++ __unused4: *mut ::c_void, ++ __unused5: *mut ::c_void, ++ } ++ ++ pub struct glob64_t { ++ pub gl_pathc: ::size_t, ++ pub gl_pathv: *mut *mut ::c_char, ++ pub gl_offs: ::size_t, ++ pub gl_flags: ::c_int, ++ ++ __unused1: *mut ::c_void, ++ __unused2: *mut ::c_void, ++ __unused3: *mut ::c_void, ++ __unused4: *mut ::c_void, ++ __unused5: *mut ::c_void, ++ } ++ ++ pub struct regex_t { ++ __buffer: *mut ::c_void, ++ __allocated: ::size_t, ++ __used: ::size_t, ++ __syntax: ::c_ulong, ++ __fastmap: *mut ::c_char, ++ __translate: *mut ::c_char, ++ __re_nsub: ::size_t, ++ __bitfield: u8, ++ } ++ ++ pub struct cpu_set_t { ++ #[cfg(all(target_pointer_width = "32", ++ not(target_arch = "x86_64")))] ++ bits: [u32; 32], ++ #[cfg(not(all(target_pointer_width = "32", ++ not(target_arch = "x86_64"))))] ++ bits: [u64; 16], ++ } ++ ++ pub struct if_nameindex { ++ pub if_index: ::c_uint, ++ pub if_name: *mut ::c_char, ++ } ++ ++ // System V IPC ++ pub struct msginfo { ++ pub msgpool: ::c_int, ++ pub msgmap: ::c_int, ++ pub msgmax: ::c_int, ++ pub msgmnb: ::c_int, ++ pub msgmni: ::c_int, ++ pub msgssz: ::c_int, ++ pub msgtql: ::c_int, ++ pub msgseg: ::c_ushort, ++ } ++ ++ pub struct sembuf { ++ pub sem_num: ::c_ushort, ++ pub sem_op: ::c_short, ++ pub sem_flg: ::c_short, ++ } ++ ++ pub struct mntent { ++ pub mnt_fsname: *mut ::c_char, ++ pub mnt_dir: *mut ::c_char, ++ pub mnt_type: *mut ::c_char, ++ pub mnt_opts: *mut ::c_char, ++ pub mnt_freq: ::c_int, ++ pub mnt_passno: ::c_int, ++ } ++ ++ pub struct posix_spawn_file_actions_t { ++ __allocated: ::c_int, ++ __used: ::c_int, ++ __actions: *mut ::c_int, ++ __pad: [::c_int; 16], ++ } ++ ++ pub struct posix_spawnattr_t { ++ __flags: ::c_short, ++ __pgrp: ::pid_t, ++ __sd: ::sigset_t, ++ __ss: ::sigset_t, ++ __sp: ::sched_param, ++ __policy: ::c_int, ++ __pad: [::c_int; 16], ++ } ++ ++ pub struct regmatch_t { ++ pub rm_so: regoff_t, ++ pub rm_eo: regoff_t, ++ } ++ ++ pub struct option { ++ pub name: *const ::c_char, ++ pub has_arg: ::c_int, ++ pub flag: *mut ::c_int, ++ pub val: ::c_int, ++ } ++ + } + + impl siginfo_t { +@@ -740,16 +1021,69 @@ impl siginfo_t { + } + + // const +-pub const IPOPT_COPY: u8 = 0x80; +-pub const IPOPT_NUMBER_MASK: u8 = 0x1f; +-pub const IPOPT_CLASS_MASK: u8 = 0x60; +-pub const IPTOS_ECN_MASK: u8 = 0x03; +-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; + ++// aio.h ++pub const AIO_CANCELED: ::c_int = 0; ++pub const AIO_NOTCANCELED: ::c_int = 1; ++pub const AIO_ALLDONE: ::c_int = 2; ++pub const LIO_READ: ::c_int = 0; ++pub const LIO_WRITE: ::c_int = 1; ++pub const LIO_NOP: ::c_int = 2; ++pub const LIO_WAIT: ::c_int = 0; ++pub const LIO_NOWAIT: ::c_int = 1; ++ ++// glob.h ++pub const GLOB_ERR: ::c_int = 1 << 0; ++pub const GLOB_MARK: ::c_int = 1 << 1; ++pub const GLOB_NOSORT: ::c_int = 1 << 2; ++pub const GLOB_DOOFFS: ::c_int = 1 << 3; ++pub const GLOB_NOCHECK: ::c_int = 1 << 4; ++pub const GLOB_APPEND: ::c_int = 1 << 5; ++pub const GLOB_NOESCAPE: ::c_int = 1 << 6; ++ ++pub const GLOB_NOSPACE: ::c_int = 1; ++pub const GLOB_ABORTED: ::c_int = 2; ++pub const GLOB_NOMATCH: ::c_int = 3; ++ ++pub const GLOB_PERIOD: ::c_int = 1 << 7; ++pub const GLOB_ALTDIRFUNC: ::c_int = 1 << 9; ++pub const GLOB_BRACE: ::c_int = 1 << 10; ++pub const GLOB_NOMAGIC: ::c_int = 1 << 11; ++pub const GLOB_TILDE: ::c_int = 1 << 12; ++pub const GLOB_ONLYDIR: ::c_int = 1 << 13; ++pub const GLOB_TILDE_CHECK: ::c_int = 1 << 14; ++ ++// ipc.h ++pub const IPC_PRIVATE: ::key_t = 0; ++ ++pub const IPC_CREAT: ::c_int = 0o1000; ++pub const IPC_EXCL: ::c_int = 0o2000; ++pub const IPC_NOWAIT: ::c_int = 0o4000; ++ ++pub const IPC_RMID: ::c_int = 0; ++pub const IPC_SET: ::c_int = 1; ++pub const IPC_STAT: ::c_int = 2; ++pub const IPC_INFO: ::c_int = 3; ++pub const MSG_STAT: ::c_int = 11; ++pub const MSG_INFO: ::c_int = 12; ++ ++pub const MSG_NOERROR: ::c_int = 0o10000; ++pub const MSG_EXCEPT: ::c_int = 0o20000; ++ ++// shm.h ++pub const SHM_R: ::c_int = 0o400; ++pub const SHM_W: ::c_int = 0o200; ++ ++pub const SHM_RDONLY: ::c_int = 0o10000; ++pub const SHM_RND: ::c_int = 0o20000; ++pub const SHM_REMAP: ::c_int = 0o40000; ++ ++pub const SHM_LOCK: ::c_int = 11; ++pub const SHM_UNLOCK: ::c_int = 12; + // unistd.h +-pub const STDIN_FILENO: c_long = 0; +-pub const STDOUT_FILENO: c_long = 1; +-pub const STDERR_FILENO: c_long = 2; ++pub const STDIN_FILENO: ::c_int = 0; ++pub const STDOUT_FILENO: ::c_int = 1; ++pub const STDERR_FILENO: ::c_int = 2; + pub const __FD_SETSIZE: usize = 256; + pub const R_OK: ::c_int = 4; + pub const W_OK: ::c_int = 2; +@@ -769,6 +1103,9 @@ pub const F_TLOCK: ::c_int = 2; + pub const F_TEST: ::c_int = 3; + pub const CLOSE_RANGE_CLOEXEC: ::c_int = 4; + ++// stdio.h ++pub const EOF: ::c_int = -1; ++ + // stdlib.h + pub const WNOHANG: ::c_int = 1; + pub const WUNTRACED: ::c_int = 2; +@@ -884,8 +1221,17 @@ pub const _SS_SIZE: usize = 128; + pub const CMGROUP_MAX: usize = 16; + pub const SOL_SOCKET: ::c_int = 65535; + ++// sys/time.h ++pub const ITIMER_REAL: ::c_int = 0; ++pub const ITIMER_VIRTUAL: ::c_int = 1; ++pub const ITIMER_PROF: ::c_int = 2; ++ + // netinet/in.h + pub const SOL_IP: ::c_int = 0; ++pub const SOL_TCP: ::c_int = 6; ++pub const SOL_UDP: ::c_int = 17; ++pub const SOL_IPV6: ::c_int = 41; ++pub const SOL_ICMPV6: ::c_int = 58; + pub const IP_OPTIONS: ::c_int = 1; + pub const IP_HDRINCL: ::c_int = 2; + pub const IP_TOS: ::c_int = 3; +@@ -899,8 +1245,6 @@ pub const IP_MULTICAST_TTL: ::c_int = 10; + pub const IP_MULTICAST_LOOP: ::c_int = 11; + pub const IP_ADD_MEMBERSHIP: ::c_int = 12; + pub const IP_DROP_MEMBERSHIP: ::c_int = 13; +-pub const SOL_IPV6: ::c_int = 41; +-pub const SOL_ICMPV6: ::c_int = 58; + pub const IPV6_ADDRFORM: ::c_int = 1; + pub const IPV6_2292PKTINFO: ::c_int = 2; + pub const IPV6_2292HOPOPTS: ::c_int = 3; +@@ -965,6 +1309,134 @@ pub const IN_LOOPBACKNET: u32 = 127; + pub const INET_ADDRSTRLEN: usize = 16; + pub const INET6_ADDRSTRLEN: usize = 46; + ++// netinet/ip.h ++pub const IPTOS_ECN_MASK: u8 = 0x03; ++ ++pub const IPTOS_LOWDELAY: u8 = 0x10; ++pub const IPTOS_THROUGHPUT: u8 = 0x08; ++pub const IPTOS_RELIABILITY: u8 = 0x04; ++pub const IPTOS_MINCOST: u8 = 0x02; ++ ++pub const IPTOS_PREC_NETCONTROL: u8 = 0xe0; ++pub const IPTOS_PREC_INTERNETCONTROL: u8 = 0xc0; ++pub const IPTOS_PREC_CRITIC_ECP: u8 = 0xa0; ++pub const IPTOS_PREC_FLASHOVERRIDE: u8 = 0x80; ++pub const IPTOS_PREC_FLASH: u8 = 0x60; ++pub const IPTOS_PREC_IMMEDIATE: u8 = 0x40; ++pub const IPTOS_PREC_PRIORITY: u8 = 0x20; ++pub const IPTOS_PREC_ROUTINE: u8 = 0x00; ++ ++pub const IPTOS_ECN_MASK: u8 = 0x03; ++pub const IPTOS_ECN_ECT1: u8 = 0x01; ++pub const IPTOS_ECN_ECT0: u8 = 0x02; ++pub const IPTOS_ECN_CE: u8 = 0x03; ++ ++pub const IPOPT_COPY: u8 = 0x80; ++pub const IPOPT_CLASS_MASK: u8 = 0x60; ++pub const IPOPT_NUMBER_MASK: u8 = 0x1f; ++ ++pub const IPOPT_CONTROL: u8 = 0x00; ++pub const IPOPT_RESERVED1: u8 = 0x20; ++pub const IPOPT_MEASUREMENT: u8 = 0x40; ++pub const IPOPT_RESERVED2: u8 = 0x60; ++pub const IPOPT_END: u8 = 0 | IPOPT_CONTROL; ++pub const IPOPT_NOOP: u8 = 1 | IPOPT_CONTROL; ++pub const IPOPT_SEC: u8 = 2 | IPOPT_CONTROL | IPOPT_COPY; ++pub const IPOPT_LSRR: u8 = 3 | IPOPT_CONTROL | IPOPT_COPY; ++pub const IPOPT_TIMESTAMP: u8 = 4 | IPOPT_MEASUREMENT; ++pub const IPOPT_RR: u8 = 7 | IPOPT_CONTROL; ++pub const IPOPT_SID: u8 = 8 | IPOPT_CONTROL | IPOPT_COPY; ++pub const IPOPT_SSRR: u8 = 9 | IPOPT_CONTROL | IPOPT_COPY; ++pub const IPOPT_RA: u8 = 20 | IPOPT_CONTROL | IPOPT_COPY; ++pub const IPVERSION: u8 = 4; ++pub const MAXTTL: u8 = 255; ++pub const IPDEFTTL: u8 = 64; ++pub const IPOPT_OPTVAL: u8 = 0; ++pub const IPOPT_OLEN: u8 = 1; ++pub const IPOPT_OFFSET: u8 = 2; ++pub const IPOPT_MINOFF: u8 = 4; ++pub const MAX_IPOPTLEN: u8 = 40; ++pub const IPOPT_NOP: u8 = IPOPT_NOOP; ++pub const IPOPT_EOL: u8 = IPOPT_END; ++pub const IPOPT_TS: u8 = IPOPT_TIMESTAMP; ++pub const IPOPT_TS_TSONLY: u8 = 0; ++pub const IPOPT_TS_TSANDADDR: u8 = 1; ++pub const IPOPT_TS_PRESPEC: u8 = 3; ++ ++// net/if_arp.h ++pub const ARPOP_REQUEST: u16 = 1; ++pub const ARPOP_REPLY: u16 = 2; ++pub const ARPOP_RREQUEST: u16 = 3; ++pub const ARPOP_RREPLY: u16 = 4; ++pub const ARPOP_InREQUEST: u16 = 8; ++pub const ARPOP_InREPLY: u16 = 9; ++pub const ARPOP_NAK: u16 = 10; ++ ++pub const ATF_NETMASK: ::c_int = 0x20; ++pub const ATF_DONTPUB: ::c_int = 0x40; ++ ++pub const ARPHRD_NETROM: u16 = 0; ++pub const ARPHRD_ETHER: u16 = 1; ++pub const ARPHRD_EETHER: u16 = 2; ++pub const ARPHRD_AX25: u16 = 3; ++pub const ARPHRD_PRONET: u16 = 4; ++pub const ARPHRD_CHAOS: u16 = 5; ++pub const ARPHRD_IEEE802: u16 = 6; ++pub const ARPHRD_ARCNET: u16 = 7; ++pub const ARPHRD_APPLETLK: u16 = 8; ++pub const ARPHRD_DLCI: u16 = 15; ++pub const ARPHRD_ATM: u16 = 19; ++pub const ARPHRD_METRICOM: u16 = 23; ++pub const ARPHRD_IEEE1394: u16 = 24; ++pub const ARPHRD_EUI64: u16 = 27; ++pub const ARPHRD_INFINIBAND: u16 = 32; ++ ++pub const ARPHRD_SLIP: u16 = 256; ++pub const ARPHRD_CSLIP: u16 = 257; ++pub const ARPHRD_SLIP6: u16 = 258; ++pub const ARPHRD_CSLIP6: u16 = 259; ++pub const ARPHRD_RSRVD: u16 = 260; ++pub const ARPHRD_ADAPT: u16 = 264; ++pub const ARPHRD_ROSE: u16 = 270; ++pub const ARPHRD_X25: u16 = 271; ++pub const ARPHRD_HWX25: u16 = 272; ++pub const ARPHRD_CAN: u16 = 280; ++pub const ARPHRD_PPP: u16 = 512; ++pub const ARPHRD_CISCO: u16 = 513; ++pub const ARPHRD_HDLC: u16 = ARPHRD_CISCO; ++pub const ARPHRD_LAPB: u16 = 516; ++pub const ARPHRD_DDCMP: u16 = 517; ++pub const ARPHRD_RAWHDLC: u16 = 518; ++ ++pub const ARPHRD_TUNNEL: u16 = 768; ++pub const ARPHRD_TUNNEL6: u16 = 769; ++pub const ARPHRD_FRAD: u16 = 770; ++pub const ARPHRD_SKIP: u16 = 771; ++pub const ARPHRD_LOOPBACK: u16 = 772; ++pub const ARPHRD_LOCALTLK: u16 = 773; ++pub const ARPHRD_FDDI: u16 = 774; ++pub const ARPHRD_BIF: u16 = 775; ++pub const ARPHRD_SIT: u16 = 776; ++pub const ARPHRD_IPDDP: u16 = 777; ++pub const ARPHRD_IPGRE: u16 = 778; ++pub const ARPHRD_PIMREG: u16 = 779; ++pub const ARPHRD_HIPPI: u16 = 780; ++pub const ARPHRD_ASH: u16 = 781; ++pub const ARPHRD_ECONET: u16 = 782; ++pub const ARPHRD_IRDA: u16 = 783; ++pub const ARPHRD_FCPP: u16 = 784; ++pub const ARPHRD_FCAL: u16 = 785; ++pub const ARPHRD_FCPL: u16 = 786; ++pub const ARPHRD_FCFABRIC: u16 = 787; ++pub const ARPHRD_IEEE802_TR: u16 = 800; ++pub const ARPHRD_IEEE80211: u16 = 801; ++pub const ARPHRD_IEEE80211_PRISM: u16 = 802; ++pub const ARPHRD_IEEE80211_RADIOTAP: u16 = 803; ++pub const ARPHRD_IEEE802154: u16 = 804; ++ ++pub const ARPHRD_VOID: u16 = 0xFFFF; ++pub const ARPHRD_NONE: u16 = 0xFFFE; ++ + // bits/posix1_lim.h + pub const _POSIX_AIO_LISTIO_MAX: usize = 2; + pub const _POSIX_AIO_MAX: usize = 1; +@@ -1063,13 +1535,13 @@ pub const NI_DGRAM: ::c_int = 16; + pub const NI_IDN: ::c_int = 32; + + // time.h +-pub const CLOCK_REALTIME: clockid_t = 0; +-pub const CLOCK_MONOTONIC: clockid_t = 1; +-pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2; +-pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3; +-pub const CLOCK_MONOTONIC_RAW: clockid_t = 4; +-pub const CLOCK_REALTIME_COARSE: clockid_t = 5; +-pub const CLOCK_MONOTONIC_COARSE: clockid_t = 6; ++pub const CLOCK_REALTIME: ::clockid_t = 0; ++pub const CLOCK_MONOTONIC: ::clockid_t = 1; ++pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; ++pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 3; ++pub const CLOCK_MONOTONIC_RAW: ::clockid_t = 4; ++pub const CLOCK_REALTIME_COARSE: ::clockid_t = 5; ++pub const CLOCK_MONOTONIC_COARSE: ::clockid_t = 6; + pub const TIMER_ABSTIME: ::c_int = 1; + pub const TIME_UTC: ::c_int = 1; + +@@ -1126,155 +1598,169 @@ pub const LC_MEASUREMENT_MASK: ::c_int = 2048; + pub const LC_IDENTIFICATION_MASK: ::c_int = 4096; + pub const LC_ALL_MASK: ::c_int = 8127; + ++// reboot.h ++pub const RB_AUTOBOOT: ::c_int = 0x0; ++pub const RB_ASKNAME: ::c_int = 0x1; ++pub const RB_SINGLE: ::c_int = 0x2; ++pub const RB_KBD: ::c_int = 0x4; ++pub const RB_HALT: ::c_int = 0x8; ++pub const RB_INITNAME: ::c_int = 0x10; ++pub const RB_DFLTROOT: ::c_int = 0x20; ++pub const RB_NOBOOTRC: ::c_int = 0x20; ++pub const RB_ALTBOOT: ::c_int = 0x40; ++pub const RB_UNIPROC: ::c_int = 0x80; ++pub const RB_DEBUGGER: ::c_int = 0x1000; ++ + // semaphore.h + pub const __SIZEOF_SEM_T: usize = 20; ++pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; + + // termios.h +-pub const IGNBRK: tcflag_t = 1; +-pub const BRKINT: tcflag_t = 2; +-pub const IGNPAR: tcflag_t = 4; +-pub const PARMRK: tcflag_t = 8; +-pub const INPCK: tcflag_t = 16; +-pub const ISTRIP: tcflag_t = 32; +-pub const INLCR: tcflag_t = 64; +-pub const IGNCR: tcflag_t = 128; +-pub const ICRNL: tcflag_t = 256; +-pub const IXON: tcflag_t = 512; +-pub const IXOFF: tcflag_t = 1024; +-pub const IXANY: tcflag_t = 2048; +-pub const IMAXBEL: tcflag_t = 8192; +-pub const IUCLC: tcflag_t = 16384; +-pub const OPOST: tcflag_t = 1; +-pub const ONLCR: tcflag_t = 2; +-pub const ONOEOT: tcflag_t = 8; +-pub const OCRNL: tcflag_t = 16; +-pub const ONOCR: tcflag_t = 32; +-pub const ONLRET: tcflag_t = 64; +-pub const NLDLY: tcflag_t = 768; +-pub const NL0: tcflag_t = 0; +-pub const NL1: tcflag_t = 256; +-pub const TABDLY: tcflag_t = 3076; +-pub const TAB0: tcflag_t = 0; +-pub const TAB1: tcflag_t = 1024; +-pub const TAB2: tcflag_t = 2048; +-pub const TAB3: tcflag_t = 4; +-pub const CRDLY: tcflag_t = 12288; +-pub const CR0: tcflag_t = 0; +-pub const CR1: tcflag_t = 4096; +-pub const CR2: tcflag_t = 8192; +-pub const CR3: tcflag_t = 12288; +-pub const FFDLY: tcflag_t = 16384; +-pub const FF0: tcflag_t = 0; +-pub const FF1: tcflag_t = 16384; +-pub const BSDLY: tcflag_t = 32768; +-pub const BS0: tcflag_t = 0; +-pub const BS1: tcflag_t = 32768; +-pub const VTDLY: tcflag_t = 65536; +-pub const VT0: tcflag_t = 0; +-pub const VT1: tcflag_t = 65536; +-pub const OLCUC: tcflag_t = 131072; +-pub const OFILL: tcflag_t = 262144; +-pub const OFDEL: tcflag_t = 524288; +-pub const CIGNORE: tcflag_t = 1; +-pub const CSIZE: tcflag_t = 768; +-pub const CS5: tcflag_t = 0; +-pub const CS6: tcflag_t = 256; +-pub const CS7: tcflag_t = 512; +-pub const CS8: tcflag_t = 768; +-pub const CSTOPB: tcflag_t = 1024; +-pub const CREAD: tcflag_t = 2048; +-pub const PARENB: tcflag_t = 4096; +-pub const PARODD: tcflag_t = 8192; +-pub const HUPCL: tcflag_t = 16384; +-pub const CLOCAL: tcflag_t = 32768; +-pub const CRTSCTS: tcflag_t = 65536; +-pub const CRTS_IFLOW: tcflag_t = 65536; +-pub const CCTS_OFLOW: tcflag_t = 65536; +-pub const CDTRCTS: tcflag_t = 131072; +-pub const MDMBUF: tcflag_t = 1048576; +-pub const CHWFLOW: tcflag_t = 1245184; +-pub const ECHOKE: tcflag_t = 1; +-pub const _ECHOE: tcflag_t = 2; +-pub const ECHOE: tcflag_t = 2; +-pub const _ECHOK: tcflag_t = 4; +-pub const ECHOK: tcflag_t = 4; +-pub const _ECHO: tcflag_t = 8; +-pub const ECHO: tcflag_t = 8; +-pub const _ECHONL: tcflag_t = 16; +-pub const ECHONL: tcflag_t = 16; +-pub const ECHOPRT: tcflag_t = 32; +-pub const ECHOCTL: tcflag_t = 64; +-pub const _ISIG: tcflag_t = 128; +-pub const ISIG: tcflag_t = 128; +-pub const _ICANON: tcflag_t = 256; +-pub const ICANON: tcflag_t = 256; +-pub const ALTWERASE: tcflag_t = 512; +-pub const _IEXTEN: tcflag_t = 1024; +-pub const IEXTEN: tcflag_t = 1024; +-pub const EXTPROC: tcflag_t = 2048; +-pub const _TOSTOP: tcflag_t = 4194304; +-pub const TOSTOP: tcflag_t = 4194304; +-pub const FLUSHO: tcflag_t = 8388608; +-pub const NOKERNINFO: tcflag_t = 33554432; +-pub const PENDIN: tcflag_t = 536870912; +-pub const _NOFLSH: tcflag_t = 2147483648; +-pub const NOFLSH: tcflag_t = 2147483648; +-pub const VEOF: cc_t = 0; +-pub const VEOL: cc_t = 1; +-pub const VEOL2: cc_t = 2; +-pub const VERASE: cc_t = 3; +-pub const VWERASE: cc_t = 4; +-pub const VKILL: cc_t = 5; +-pub const VREPRINT: cc_t = 6; +-pub const VINTR: cc_t = 8; +-pub const VQUIT: cc_t = 9; +-pub const VSUSP: cc_t = 10; +-pub const VDSUSP: cc_t = 11; +-pub const VSTART: cc_t = 12; +-pub const VSTOP: cc_t = 13; +-pub const VLNEXT: cc_t = 14; +-pub const VDISCARD: cc_t = 15; +-pub const VMIN: cc_t = 16; +-pub const VTIME: cc_t = 17; +-pub const VSTATUS: cc_t = 18; ++pub const IGNBRK: ::tcflag_t = 1; ++pub const BRKINT: ::tcflag_t = 2; ++pub const IGNPAR: ::tcflag_t = 4; ++pub const PARMRK: ::tcflag_t = 8; ++pub const INPCK: ::tcflag_t = 16; ++pub const ISTRIP: ::tcflag_t = 32; ++pub const INLCR: ::tcflag_t = 64; ++pub const IGNCR: ::tcflag_t = 128; ++pub const ICRNL: ::tcflag_t = 256; ++pub const IXON: ::tcflag_t = 512; ++pub const IXOFF: ::tcflag_t = 1024; ++pub const IXANY: ::tcflag_t = 2048; ++pub const IMAXBEL: ::tcflag_t = 8192; ++pub const IUCLC: ::tcflag_t = 16384; ++pub const OPOST: ::tcflag_t = 1; ++pub const ONLCR: ::tcflag_t = 2; ++pub const ONOEOT: ::tcflag_t = 8; ++pub const OCRNL: ::tcflag_t = 16; ++pub const ONOCR: ::tcflag_t = 32; ++pub const ONLRET: ::tcflag_t = 64; ++pub const NLDLY: ::tcflag_t = 768; ++pub const NL0: ::tcflag_t = 0; ++pub const NL1: ::tcflag_t = 256; ++pub const TABDLY: ::tcflag_t = 3076; ++pub const TAB0: ::tcflag_t = 0; ++pub const TAB1: ::tcflag_t = 1024; ++pub const TAB2: ::tcflag_t = 2048; ++pub const TAB3: ::tcflag_t = 4; ++pub const CRDLY: ::tcflag_t = 12288; ++pub const CR0: ::tcflag_t = 0; ++pub const CR1: ::tcflag_t = 4096; ++pub const CR2: ::tcflag_t = 8192; ++pub const CR3: ::tcflag_t = 12288; ++pub const FFDLY: ::tcflag_t = 16384; ++pub const FF0: ::tcflag_t = 0; ++pub const FF1: ::tcflag_t = 16384; ++pub const BSDLY: ::tcflag_t = 32768; ++pub const BS0: ::tcflag_t = 0; ++pub const BS1: ::tcflag_t = 32768; ++pub const VTDLY: ::tcflag_t = 65536; ++pub const VT0: ::tcflag_t = 0; ++pub const VT1: ::tcflag_t = 65536; ++pub const OLCUC: ::tcflag_t = 131072; ++pub const OFILL: ::tcflag_t = 262144; ++pub const OFDEL: ::tcflag_t = 524288; ++pub const CIGNORE: ::tcflag_t = 1; ++pub const CSIZE: ::tcflag_t = 768; ++pub const CS5: ::tcflag_t = 0; ++pub const CS6: ::tcflag_t = 256; ++pub const CS7: ::tcflag_t = 512; ++pub const CS8: ::tcflag_t = 768; ++pub const CSTOPB: ::tcflag_t = 1024; ++pub const CREAD: ::tcflag_t = 2048; ++pub const PARENB: ::tcflag_t = 4096; ++pub const PARODD: ::tcflag_t = 8192; ++pub const HUPCL: ::tcflag_t = 16384; ++pub const CLOCAL: ::tcflag_t = 32768; ++pub const CRTSCTS: ::tcflag_t = 65536; ++pub const CRTS_IFLOW: ::tcflag_t = 65536; ++pub const CCTS_OFLOW: ::tcflag_t = 65536; ++pub const CDTRCTS: ::tcflag_t = 131072; ++pub const MDMBUF: ::tcflag_t = 1048576; ++pub const CHWFLOW: ::tcflag_t = 1245184; ++pub const ECHOKE: ::tcflag_t = 1; ++pub const _ECHOE: ::tcflag_t = 2; ++pub const ECHOE: ::tcflag_t = 2; ++pub const _ECHOK: ::tcflag_t = 4; ++pub const ECHOK: ::tcflag_t = 4; ++pub const _ECHO: ::tcflag_t = 8; ++pub const ECHO: ::tcflag_t = 8; ++pub const _ECHONL: ::tcflag_t = 16; ++pub const ECHONL: ::tcflag_t = 16; ++pub const ECHOPRT: ::tcflag_t = 32; ++pub const ECHOCTL: ::tcflag_t = 64; ++pub const _ISIG: ::tcflag_t = 128; ++pub const ISIG: ::tcflag_t = 128; ++pub const _ICANON: ::tcflag_t = 256; ++pub const ICANON: ::tcflag_t = 256; ++pub const ALTWERASE: ::tcflag_t = 512; ++pub const _IEXTEN: ::tcflag_t = 1024; ++pub const IEXTEN: ::tcflag_t = 1024; ++pub const EXTPROC: ::tcflag_t = 2048; ++pub const _TOSTOP: ::tcflag_t = 4194304; ++pub const TOSTOP: ::tcflag_t = 4194304; ++pub const FLUSHO: ::tcflag_t = 8388608; ++pub const NOKERNINFO: ::tcflag_t = 33554432; ++pub const PENDIN: ::tcflag_t = 536870912; ++pub const _NOFLSH: ::tcflag_t = 2147483648; ++pub const NOFLSH: ::tcflag_t = 2147483648; ++pub const VEOF: usize = 0; ++pub const VEOL: usize = 1; ++pub const VEOL2: usize = 2; ++pub const VERASE: usize = 3; ++pub const VWERASE: usize = 4; ++pub const VKILL: usize = 5; ++pub const VREPRINT: usize = 6; ++pub const VINTR: usize = 8; ++pub const VQUIT: usize = 9; ++pub const VSUSP: usize = 10; ++pub const VDSUSP: usize = 11; ++pub const VSTART: usize = 12; ++pub const VSTOP: usize = 13; ++pub const VLNEXT: usize = 14; ++pub const VDISCARD: usize = 15; ++pub const VMIN: usize = 16; ++pub const VTIME: usize = 17; ++pub const VSTATUS: usize = 18; + pub const NCCS: usize = 20; +-pub const B0: speed_t = 0; +-pub const B50: speed_t = 50; +-pub const B75: speed_t = 75; +-pub const B110: speed_t = 110; +-pub const B134: speed_t = 134; +-pub const B150: speed_t = 150; +-pub const B200: speed_t = 200; +-pub const B300: speed_t = 300; +-pub const B600: speed_t = 600; +-pub const B1200: speed_t = 1200; +-pub const B1800: speed_t = 1800; +-pub const B2400: speed_t = 2400; +-pub const B4800: speed_t = 4800; +-pub const B9600: speed_t = 9600; +-pub const B7200: speed_t = 7200; +-pub const B14400: speed_t = 14400; +-pub const B19200: speed_t = 19200; +-pub const B28800: speed_t = 28800; +-pub const B38400: speed_t = 38400; +-pub const EXTA: speed_t = 19200; +-pub const EXTB: speed_t = 38400; +-pub const B57600: speed_t = 57600; +-pub const B76800: speed_t = 76800; +-pub const B115200: speed_t = 115200; +-pub const B230400: speed_t = 230400; +-pub const B460800: speed_t = 460800; +-pub const B500000: speed_t = 500000; +-pub const B576000: speed_t = 576000; +-pub const B921600: speed_t = 921600; +-pub const B1000000: speed_t = 1000000; +-pub const B1152000: speed_t = 1152000; +-pub const B1500000: speed_t = 1500000; +-pub const B2000000: speed_t = 2000000; +-pub const B2500000: speed_t = 2500000; +-pub const B3000000: speed_t = 3000000; +-pub const B3500000: speed_t = 3500000; +-pub const B4000000: speed_t = 4000000; ++pub const B0: ::speed_t = 0; ++pub const B50: ::speed_t = 50; ++pub const B75: ::speed_t = 75; ++pub const B110: ::speed_t = 110; ++pub const B134: ::speed_t = 134; ++pub const B150: ::speed_t = 150; ++pub const B200: ::speed_t = 200; ++pub const B300: ::speed_t = 300; ++pub const B600: ::speed_t = 600; ++pub const B1200: ::speed_t = 1200; ++pub const B1800: ::speed_t = 1800; ++pub const B2400: ::speed_t = 2400; ++pub const B4800: ::speed_t = 4800; ++pub const B9600: ::speed_t = 9600; ++pub const B7200: ::speed_t = 7200; ++pub const B14400: ::speed_t = 14400; ++pub const B19200: ::speed_t = 19200; ++pub const B28800: ::speed_t = 28800; ++pub const B38400: ::speed_t = 38400; ++pub const EXTA: ::speed_t = B19200; ++pub const EXTB: ::speed_t = B38400; ++pub const B57600: ::speed_t = 57600; ++pub const B76800: ::speed_t = 76800; ++pub const B115200: ::speed_t = 115200; ++pub const B230400: ::speed_t = 230400; ++pub const B460800: ::speed_t = 460800; ++pub const B500000: ::speed_t = 500000; ++pub const B576000: ::speed_t = 576000; ++pub const B921600: ::speed_t = 921600; ++pub const B1000000: ::speed_t = 1000000; ++pub const B1152000: ::speed_t = 1152000; ++pub const B1500000: ::speed_t = 1500000; ++pub const B2000000: ::speed_t = 2000000; ++pub const B2500000: ::speed_t = 2500000; ++pub const B3000000: ::speed_t = 3000000; ++pub const B3500000: ::speed_t = 3500000; ++pub const B4000000: ::speed_t = 4000000; + pub const TCSANOW: ::c_int = 0; + pub const TCSADRAIN: ::c_int = 1; + pub const TCSAFLUSH: ::c_int = 2; +@@ -1286,10 +1772,10 @@ pub const TCOOFF: ::c_int = 1; + pub const TCOON: ::c_int = 2; + pub const TCIOFF: ::c_int = 3; + pub const TCION: ::c_int = 4; +-pub const TTYDEF_IFLAG: tcflag_t = 11042; +-pub const TTYDEF_LFLAG: tcflag_t = 1483; +-pub const TTYDEF_CFLAG: tcflag_t = 23040; +-pub const TTYDEF_SPEED: tcflag_t = 9600; ++pub const TTYDEF_IFLAG: ::tcflag_t = 11042; ++pub const TTYDEF_LFLAG: ::tcflag_t = 1483; ++pub const TTYDEF_CFLAG: ::tcflag_t = 23040; ++pub const TTYDEF_SPEED: ::tcflag_t = 9600; + pub const CEOL: u8 = 0u8; + pub const CERASE: u8 = 127; + pub const CMIN: u8 = 1; +@@ -1467,35 +1953,35 @@ pub const SF_NOUNLINK: ::c_uint = 1048576; + pub const SF_SNAPSHOT: ::c_uint = 2097152; + pub const UTIME_NOW: ::c_long = -1; + pub const UTIME_OMIT: ::c_long = -2; +-pub const S_IFMT: mode_t = 61440; +-pub const S_IFDIR: mode_t = 16384; +-pub const S_IFCHR: mode_t = 8192; +-pub const S_IFBLK: mode_t = 24576; +-pub const S_IFREG: mode_t = 32768; +-pub const S_IFIFO: mode_t = 4096; +-pub const S_IFLNK: mode_t = 40960; +-pub const S_IFSOCK: mode_t = 49152; +-pub const S_ISUID: mode_t = 2048; +-pub const S_ISGID: mode_t = 1024; +-pub const S_ISVTX: mode_t = 512; +-pub const S_IRUSR: mode_t = 256; +-pub const S_IWUSR: mode_t = 128; +-pub const S_IXUSR: mode_t = 64; +-pub const S_IRWXU: mode_t = 448; +-pub const S_IREAD: mode_t = 256; +-pub const S_IWRITE: mode_t = 128; +-pub const S_IEXEC: mode_t = 64; +-pub const S_IRGRP: mode_t = 32; +-pub const S_IWGRP: mode_t = 16; +-pub const S_IXGRP: mode_t = 8; +-pub const S_IRWXG: mode_t = 56; +-pub const S_IROTH: mode_t = 4; +-pub const S_IWOTH: mode_t = 2; +-pub const S_IXOTH: mode_t = 1; +-pub const S_IRWXO: mode_t = 7; +-pub const ACCESSPERMS: mode_t = 511; +-pub const ALLPERMS: mode_t = 4095; +-pub const DEFFILEMODE: mode_t = 438; ++pub const S_IFMT: ::mode_t = 61440; ++pub const S_IFDIR: ::mode_t = 16384; ++pub const S_IFCHR: ::mode_t = 8192; ++pub const S_IFBLK: ::mode_t = 24576; ++pub const S_IFREG: ::mode_t = 32768; ++pub const S_IFIFO: ::mode_t = 4096; ++pub const S_IFLNK: ::mode_t = 40960; ++pub const S_IFSOCK: ::mode_t = 49152; ++pub const S_ISUID: ::mode_t = 2048; ++pub const S_ISGID: ::mode_t = 1024; ++pub const S_ISVTX: ::mode_t = 512; ++pub const S_IRUSR: ::mode_t = 256; ++pub const S_IWUSR: ::mode_t = 128; ++pub const S_IXUSR: ::mode_t = 64; ++pub const S_IRWXU: ::mode_t = 448; ++pub const S_IREAD: ::mode_t = 256; ++pub const S_IWRITE: ::mode_t = 128; ++pub const S_IEXEC: ::mode_t = 64; ++pub const S_IRGRP: ::mode_t = 32; ++pub const S_IWGRP: ::mode_t = 16; ++pub const S_IXGRP: ::mode_t = 8; ++pub const S_IRWXG: ::mode_t = 56; ++pub const S_IROTH: ::mode_t = 4; ++pub const S_IWOTH: ::mode_t = 2; ++pub const S_IXOTH: ::mode_t = 1; ++pub const S_IRWXO: ::mode_t = 7; ++pub const ACCESSPERMS: ::mode_t = 511; ++pub const ALLPERMS: ::mode_t = 4095; ++pub const DEFFILEMODE: ::mode_t = 438; + pub const S_BLKSIZE: usize = 512; + pub const STATX_TYPE: ::c_uint = 1; + pub const STATX_MODE: ::c_uint = 2; +@@ -1547,34 +2033,34 @@ pub const TIOCPKT_IOCTL: ::c_int = 64; + pub const TTYDISC: ::c_int = 0; + pub const TABLDISC: ::c_int = 3; + pub const SLIPDISC: ::c_int = 4; +-pub const TANDEM: tcflag_t = 1; +-pub const CBREAK: tcflag_t = 2; +-pub const LCASE: tcflag_t = 4; +-pub const CRMOD: tcflag_t = 16; +-pub const RAW: tcflag_t = 32; +-pub const ODDP: tcflag_t = 64; +-pub const EVENP: tcflag_t = 128; +-pub const ANYP: tcflag_t = 192; +-pub const NLDELAY: tcflag_t = 768; +-pub const NL2: tcflag_t = 512; +-pub const NL3: tcflag_t = 768; +-pub const TBDELAY: tcflag_t = 3072; +-pub const XTABS: tcflag_t = 3072; +-pub const CRDELAY: tcflag_t = 12288; +-pub const VTDELAY: tcflag_t = 16384; +-pub const BSDELAY: tcflag_t = 32768; +-pub const ALLDELAY: tcflag_t = 65280; +-pub const CRTBS: tcflag_t = 65536; +-pub const PRTERA: tcflag_t = 131072; +-pub const CRTERA: tcflag_t = 262144; +-pub const TILDE: tcflag_t = 524288; +-pub const LITOUT: tcflag_t = 2097152; +-pub const NOHANG: tcflag_t = 16777216; +-pub const L001000: tcflag_t = 33554432; +-pub const CRTKIL: tcflag_t = 67108864; +-pub const PASS8: tcflag_t = 134217728; +-pub const CTLECH: tcflag_t = 268435456; +-pub const DECCTQ: tcflag_t = 1073741824; ++pub const TANDEM: ::tcflag_t = 1; ++pub const CBREAK: ::tcflag_t = 2; ++pub const LCASE: ::tcflag_t = 4; ++pub const CRMOD: ::tcflag_t = 16; ++pub const RAW: ::tcflag_t = 32; ++pub const ODDP: ::tcflag_t = 64; ++pub const EVENP: ::tcflag_t = 128; ++pub const ANYP: ::tcflag_t = 192; ++pub const NLDELAY: ::tcflag_t = 768; ++pub const NL2: ::tcflag_t = 512; ++pub const NL3: ::tcflag_t = 768; ++pub const TBDELAY: ::tcflag_t = 3072; ++pub const XTABS: ::tcflag_t = 3072; ++pub const CRDELAY: ::tcflag_t = 12288; ++pub const VTDELAY: ::tcflag_t = 16384; ++pub const BSDELAY: ::tcflag_t = 32768; ++pub const ALLDELAY: ::tcflag_t = 65280; ++pub const CRTBS: ::tcflag_t = 65536; ++pub const PRTERA: ::tcflag_t = 131072; ++pub const CRTERA: ::tcflag_t = 262144; ++pub const TILDE: ::tcflag_t = 524288; ++pub const LITOUT: ::tcflag_t = 2097152; ++pub const NOHANG: ::tcflag_t = 16777216; ++pub const L001000: ::tcflag_t = 33554432; ++pub const CRTKIL: ::tcflag_t = 67108864; ++pub const PASS8: ::tcflag_t = 134217728; ++pub const CTLECH: ::tcflag_t = 268435456; ++pub const DECCTQ: ::tcflag_t = 1073741824; + + pub const FIONBIO: ::c_ulong = 0xa008007e; + pub const FIONREAD: ::c_ulong = 0x6008007f; +@@ -2007,7 +2493,6 @@ pub const TCPOPT_TSTAMP_HDR: u32 = 16844810; + pub const TCP_MSS: usize = 512; + pub const TCP_MAXWIN: usize = 65535; + pub const TCP_MAX_WINSHIFT: usize = 14; +-pub const SOL_TCP: ::c_int = 6; + pub const TCPI_OPT_TIMESTAMPS: u8 = 1; + pub const TCPI_OPT_SACK: u8 = 2; + pub const TCPI_OPT_WSCALE: u8 = 4; +@@ -2042,21 +2527,64 @@ pub const PROT_NONE: ::c_int = 0; + pub const PROT_READ: ::c_int = 4; + pub const PROT_WRITE: ::c_int = 2; + pub const PROT_EXEC: ::c_int = 1; +-pub const MAP_PRIVATE: ::c_int = 0; + pub const MAP_FILE: ::c_int = 1; + pub const MAP_ANON: ::c_int = 2; +-pub const MAP_SHARED: ::c_int = 16; ++pub const MAP_ANONYMOUS: ::c_int = MAP_ANON; ++pub const MAP_TYPE: ::c_int = 15; + pub const MAP_COPY: ::c_int = 32; ++pub const MAP_SHARED: ::c_int = 16; ++pub const MAP_PRIVATE: ::c_int = 0; + pub const MAP_FIXED: ::c_int = 256; ++pub const MAP_NOEXTEND: ::c_int = 512; ++pub const MAP_HASSEMPHORE: ::c_int = 1024; ++pub const MAP_INHERIT: ::c_int = 2048; + pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; +-pub const MS_SYNC: ::c_int = 0; +-pub const MS_ASYNC: ::c_int = 1; +-pub const MS_INVALIDATE: ::c_int = 2; + pub const MADV_NORMAL: ::c_int = 0; + pub const MADV_RANDOM: ::c_int = 1; + pub const MADV_SEQUENTIAL: ::c_int = 2; + pub const MADV_WILLNEED: ::c_int = 3; + pub const MADV_DONTNEED: ::c_int = 4; ++pub const POSIX_MADV_NORMAL: ::c_int = 0; ++pub const POSIX_MADV_RANDOM: ::c_int = 1; ++pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; ++pub const POSIX_MADV_WILLNEED: ::c_int = 3; ++pub const POSIX_MADV_WONTNEED: ::c_int = 4; ++ ++pub const MS_ASYNC: ::c_int = 1; ++pub const MS_SYNC: ::c_int = 0; ++pub const MS_INVALIDATE: ::c_int = 2; ++pub const MREMAP_MAYMOVE: ::c_int = 1; ++pub const MREMAP_FIXED: ::c_int = 2; ++pub const MCL_CURRENT: ::c_int = 0x0001; ++pub const MCL_FUTURE: ::c_int = 0x0002; ++ ++// spawn.h ++pub const POSIX_SPAWN_USEVFORK: ::c_int = 64; ++pub const POSIX_SPAWN_SETSID: ::c_int = 128; ++ ++// sys/syslog.h ++pub const LOG_CRON: ::c_int = 9 << 3; ++pub const LOG_AUTHPRIV: ::c_int = 10 << 3; ++pub const LOG_FTP: ::c_int = 11 << 3; ++pub const LOG_PERROR: ::c_int = 0x20; ++ ++// net/if.h ++pub const IFF_UP: ::c_int = 0x1; ++pub const IFF_BROADCAST: ::c_int = 0x2; ++pub const IFF_DEBUG: ::c_int = 0x4; ++pub const IFF_LOOPBACK: ::c_int = 0x8; ++pub const IFF_POINTOPOINT: ::c_int = 0x10; ++pub const IFF_NOTRAILERS: ::c_int = 0x20; ++pub const IFF_RUNNING: ::c_int = 0x40; ++pub const IFF_NOARP: ::c_int = 0x80; ++pub const IFF_PROMISC: ::c_int = 0x100; ++pub const IFF_ALLMULTI: ::c_int = 0x200; ++pub const IFF_MASTER: ::c_int = 0x400; ++pub const IFF_SLAVE: ::c_int = 0x800; ++pub const IFF_MULTICAST: ::c_int = 0x1000; ++pub const IFF_PORTSEL: ::c_int = 0x2000; ++pub const IFF_AUTOMEDIA: ::c_int = 0x4000; ++pub const IFF_DYNAMIC: ::c_int = 0x8000; + + // random.h + pub const GRND_NONBLOCK: ::c_uint = 1; +@@ -2391,21 +2919,21 @@ pub const PTHREAD_MUTEX_RECURSIVE: __pthread_mutex_type = 2; + pub const PTHREAD_MUTEX_STALLED: __pthread_mutex_robustness = 0; + pub const PTHREAD_MUTEX_ROBUST: __pthread_mutex_robustness = 256; + +-pub const RLIMIT_CPU: __rlimit_resource = 0; +-pub const RLIMIT_FSIZE: __rlimit_resource = 1; +-pub const RLIMIT_DATA: __rlimit_resource = 2; +-pub const RLIMIT_STACK: __rlimit_resource = 3; +-pub const RLIMIT_CORE: __rlimit_resource = 4; +-pub const RLIMIT_RSS: __rlimit_resource = 5; +-pub const RLIMIT_MEMLOCK: __rlimit_resource = 6; +-pub const RLIMIT_NPROC: __rlimit_resource = 7; +-pub const RLIMIT_OFILE: __rlimit_resource = 8; +-pub const RLIMIT_NOFILE: __rlimit_resource = 8; +-pub const RLIMIT_SBSIZE: __rlimit_resource = 9; +-pub const RLIMIT_AS: __rlimit_resource = 10; +-pub const RLIMIT_VMEM: __rlimit_resource = 10; +-pub const RLIMIT_NLIMITS: __rlimit_resource = 11; +-pub const RLIM_NLIMITS: __rlimit_resource = 11; ++pub const RLIMIT_CPU: ::__rlimit_resource_t = 0; ++pub const RLIMIT_FSIZE: ::__rlimit_resource_t = 1; ++pub const RLIMIT_DATA: ::__rlimit_resource_t = 2; ++pub const RLIMIT_STACK: ::__rlimit_resource_t = 3; ++pub const RLIMIT_CORE: ::__rlimit_resource_t = 4; ++pub const RLIMIT_RSS: ::__rlimit_resource_t = 5; ++pub const RLIMIT_MEMLOCK: ::__rlimit_resource_t = 6; ++pub const RLIMIT_NPROC: ::__rlimit_resource_t = 7; ++pub const RLIMIT_OFILE: ::__rlimit_resource_t = 8; ++pub const RLIMIT_NOFILE: ::__rlimit_resource_t = 8; ++pub const RLIMIT_SBSIZE: ::__rlimit_resource_t = 9; ++pub const RLIMIT_AS: ::__rlimit_resource_t = 10; ++pub const RLIMIT_VMEM: ::__rlimit_resource_t = 10; ++pub const RLIMIT_NLIMITS: ::__rlimit_resource_t = 11; ++pub const RLIM_NLIMITS: ::__rlimit_resource_t = 11; + + pub const RUSAGE_SELF: __rusage_who = 0; + pub const RUSAGE_CHILDREN: __rusage_who = -1; +@@ -2431,6 +2959,7 @@ pub const MSG_CTRUNC: ::c_int = 32; + pub const MSG_WAITALL: ::c_int = 64; + pub const MSG_DONTWAIT: ::c_int = 128; + pub const MSG_NOSIGNAL: ::c_int = 1024; ++pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; + + pub const SCM_RIGHTS: ::c_int = 1; + pub const SCM_TIMESTAMP: ::c_int = 2; +@@ -2550,6 +3079,11 @@ pub const RTLD_DI_TLS_DATA: ::c_int = 10; + pub const RTLD_DI_PHDR: ::c_int = 11; + pub const RTLD_DI_MAX: ::c_int = 11; + ++pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; ++pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; ++pub const RTLD_NODELETE: ::c_int = 0x1000; ++pub const RTLD_NOW: ::c_int = 0x2; ++ + pub const SI_ASYNCIO: ::c_int = -4; + pub const SI_MESGQ: ::c_int = -3; + pub const SI_TIMER: ::c_int = -2; +@@ -2693,8 +3227,105 @@ pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { + }; + pub const PTHREAD_STACK_MIN: ::size_t = 0; + ++const_fn! { ++ {const} fn CMSG_ALIGN(len: usize) -> usize { ++ len + ::mem::size_of::<usize>() - 1 & !(::mem::size_of::<usize>() - 1) ++ } ++} ++ + // functions + f! { ++ pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { ++ if (*mhdr).msg_controllen as usize >= ::mem::size_of::<cmsghdr>() { ++ (*mhdr).msg_control as *mut cmsghdr ++ } else { ++ 0 as *mut cmsghdr ++ } ++ } ++ ++ pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut ::c_uchar { ++ cmsg.offset(1) as *mut ::c_uchar ++ } ++ ++ pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { ++ (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::<cmsghdr>())) ++ as ::c_uint ++ } ++ ++ pub {const} fn CMSG_LEN(length: ::c_uint) -> ::c_uint { ++ CMSG_ALIGN(::mem::size_of::<cmsghdr>()) as ::c_uint + length ++ } ++ ++ pub fn CMSG_NXTHDR(mhdr: *const msghdr, ++ cmsg: *const cmsghdr) -> *mut cmsghdr { ++ if ((*cmsg).cmsg_len as usize) < ::mem::size_of::<cmsghdr>() { ++ 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 fn CPU_ALLOC_SIZE(count: ::c_int) -> ::size_t { ++ let _dummy: cpu_set_t = ::mem::zeroed(); ++ let size_in_bits = 8 * ::mem::size_of_val(&_dummy.bits[0]); ++ ((count as ::size_t + size_in_bits - 1) / 8) as ::size_t ++ } ++ ++ pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { ++ for slot in cpuset.bits.iter_mut() { ++ *slot = 0; ++ } ++ } ++ ++ pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { ++ let size_in_bits ++ = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc ++ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); ++ cpuset.bits[idx] |= 1 << offset; ++ () ++ } ++ ++ pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { ++ let size_in_bits ++ = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc ++ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); ++ cpuset.bits[idx] &= !(1 << offset); ++ () ++ } ++ ++ pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { ++ let size_in_bits = 8 * ::mem::size_of_val(&cpuset.bits[0]); ++ let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); ++ 0 != (cpuset.bits[idx] & (1 << offset)) ++ } ++ ++ pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> ::c_int { ++ let mut s: u32 = 0; ++ let size_of_mask = ::mem::size_of_val(&cpuset.bits[0]); ++ for i in cpuset.bits[..(size / size_of_mask)].iter() { ++ s += i.count_ones(); ++ }; ++ s as ::c_int ++ } ++ ++ pub fn CPU_COUNT(cpuset: &cpu_set_t) -> ::c_int { ++ CPU_COUNT_S(::mem::size_of::<cpu_set_t>(), cpuset) ++ } ++ ++ pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { ++ set1.bits == set2.bits ++ } ++ + pub fn major(dev: ::dev_t) -> ::c_uint { + ((dev >> 8) & 0xff) as ::c_uint + } +@@ -2703,6 +3334,14 @@ f! { + (dev & 0xffff00ff) as ::c_uint + } + ++ pub fn IPTOS_TOS(tos: u8) -> u8 { ++ tos & IPTOS_TOS_MASK ++ } ++ ++ pub fn IPTOS_PREC(tos: u8) -> u8 { ++ tos & IPTOS_PREC_MASK ++ } ++ + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { + let fd = fd as usize; + let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; +@@ -2756,11 +3395,26 @@ extern "C" { + + pub fn __libc_current_sigrtmax() -> ::c_int; + ++ pub fn wait4( ++ pid: ::pid_t, ++ status: *mut ::c_int, ++ options: ::c_int, ++ rusage: *mut ::rusage, ++ ) -> ::pid_t; ++ + pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t, options: ::c_int) + -> ::c_int; + + pub fn sigwait(__set: *const sigset_t, __sig: *mut ::c_int) -> ::c_int; + ++ pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int; ++ pub fn sigtimedwait( ++ set: *const sigset_t, ++ info: *mut siginfo_t, ++ timeout: *const ::timespec, ++ ) -> ::c_int; ++ pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; ++ + pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; + + pub fn ioctl(__fd: ::c_int, __request: ::c_ulong, ...) -> ::c_int; +@@ -2806,10 +3460,72 @@ extern "C" { + offset: ::off64_t, + ) -> ::ssize_t; + ++ pub fn fread_unlocked( ++ buf: *mut ::c_void, ++ size: ::size_t, ++ nobj: ::size_t, ++ stream: *mut ::FILE, ++ ) -> ::size_t; ++ ++ pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; ++ pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; ++ pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; ++ pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; ++ pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; ++ pub fn aio_suspend( ++ aiocb_list: *const *const aiocb, ++ nitems: ::c_int, ++ timeout: *const ::timespec, ++ ) -> ::c_int; ++ pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; ++ pub fn lio_listio( ++ mode: ::c_int, ++ aiocb_list: *const *mut aiocb, ++ nitems: ::c_int, ++ sevp: *mut ::sigevent, ++ ) -> ::c_int; ++ ++ pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; ++ pub fn mq_close(mqd: ::mqd_t) -> ::c_int; ++ pub fn mq_unlink(name: *const ::c_char) -> ::c_int; ++ pub fn mq_receive( ++ mqd: ::mqd_t, ++ msg_ptr: *mut ::c_char, ++ msg_len: ::size_t, ++ msg_prio: *mut ::c_uint, ++ ) -> ::ssize_t; ++ pub fn mq_timedreceive( ++ mqd: ::mqd_t, ++ msg_ptr: *mut ::c_char, ++ msg_len: ::size_t, ++ msg_prio: *mut ::c_uint, ++ abs_timeout: *const ::timespec, ++ ) -> ::ssize_t; ++ pub fn mq_send( ++ mqd: ::mqd_t, ++ msg_ptr: *const ::c_char, ++ msg_len: ::size_t, ++ msg_prio: ::c_uint, ++ ) -> ::c_int; ++ pub fn mq_timedsend( ++ mqd: ::mqd_t, ++ msg_ptr: *const ::c_char, ++ msg_len: ::size_t, ++ msg_prio: ::c_uint, ++ abs_timeout: *const ::timespec, ++ ) -> ::c_int; ++ pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; ++ pub fn mq_setattr(mqd: ::mqd_t, newattr: *const ::mq_attr, oldattr: *mut ::mq_attr) -> ::c_int; ++ + pub fn lseek64(__fd: ::c_int, __offset: __off64_t, __whence: ::c_int) -> __off64_t; + + pub fn lseek(__fd: ::c_int, __offset: __off_t, __whence: ::c_int) -> __off_t; + ++ pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; ++ pub fn fseeko64(stream: *mut ::FILE, offset: ::off64_t, whence: ::c_int) -> ::c_int; ++ pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; ++ pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; ++ + pub fn bind(__fd: ::c_int, __addr: *const sockaddr, __len: socklen_t) -> ::c_int; + + pub fn accept4( +@@ -2819,6 +3535,13 @@ extern "C" { + flg: ::c_int, + ) -> ::c_int; + ++ pub fn ppoll( ++ fds: *mut ::pollfd, ++ nfds: nfds_t, ++ timeout: *const ::timespec, ++ sigmask: *const sigset_t, ++ ) -> ::c_int; ++ + pub fn recvmsg(__fd: ::c_int, __message: *mut msghdr, __flags: ::c_int) -> ::ssize_t; + + pub fn sendmsg(__fd: ::c_int, __message: *const msghdr, __flags: ::c_int) -> ssize_t; +@@ -2832,12 +3555,95 @@ extern "C" { + addrlen: *mut ::socklen_t, + ) -> ::ssize_t; + ++ pub fn sendfile( ++ out_fd: ::c_int, ++ in_fd: ::c_int, ++ offset: *mut off_t, ++ count: ::size_t, ++ ) -> ::ssize_t; ++ pub fn sendfile64( ++ out_fd: ::c_int, ++ in_fd: ::c_int, ++ offset: *mut off64_t, ++ count: ::size_t, ++ ) -> ::ssize_t; ++ + pub fn shutdown(__fd: ::c_int, __how: ::c_int) -> ::c_int; + + pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; ++ pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; ++ pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int; ++ pub fn if_nameindex() -> *mut if_nameindex; ++ pub fn if_freenameindex(ptr: *mut if_nameindex); ++ ++ pub fn getnameinfo( ++ sa: *const ::sockaddr, ++ salen: ::socklen_t, ++ host: *mut ::c_char, ++ hostlen: ::socklen_t, ++ serv: *mut ::c_char, ++ sevlen: ::socklen_t, ++ flags: ::c_int, ++ ) -> ::c_int; ++ ++ pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; ++ pub fn freeifaddrs(ifa: *mut ::ifaddrs); + + pub fn uname(buf: *mut ::utsname) -> ::c_int; + ++ pub fn gethostid() -> ::c_long; ++ pub fn sethostid(hostid: ::c_long) -> ::c_int; ++ ++ pub fn setpwent(); ++ pub fn endpwent(); ++ pub fn getpwent() -> *mut passwd; ++ pub fn setgrent(); ++ pub fn endgrent(); ++ pub fn getgrent() -> *mut ::group; ++ pub fn setspent(); ++ pub fn endspent(); ++ pub fn getspent() -> *mut spwd; ++ ++ pub fn getspnam(name: *const ::c_char) -> *mut spwd; ++ ++ pub fn getpwent_r( ++ pwd: *mut ::passwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::passwd, ++ ) -> ::c_int; ++ pub fn getgrent_r( ++ grp: *mut ::group, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::group, ++ ) -> ::c_int; ++ pub fn fgetpwent_r( ++ stream: *mut ::FILE, ++ pwd: *mut ::passwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::passwd, ++ ) -> ::c_int; ++ pub fn fgetgrent_r( ++ stream: *mut ::FILE, ++ grp: *mut ::group, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::group, ++ ) -> ::c_int; ++ ++ pub fn putpwent(p: *const ::passwd, stream: *mut ::FILE) -> ::c_int; ++ pub fn putgrent(grp: *const ::group, stream: *mut ::FILE) -> ::c_int; ++ ++ pub fn getpwnam_r( ++ name: *const ::c_char, ++ pwd: *mut passwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut passwd, ++ ) -> ::c_int; ++ + pub fn getpwuid_r( + uid: ::uid_t, + pwd: *mut passwd, +@@ -2846,18 +3652,105 @@ extern "C" { + result: *mut *mut passwd, + ) -> ::c_int; + ++ pub fn fgetspent_r( ++ fp: *mut ::FILE, ++ spbuf: *mut ::spwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ spbufp: *mut *mut ::spwd, ++ ) -> ::c_int; ++ pub fn sgetspent_r( ++ s: *const ::c_char, ++ spbuf: *mut ::spwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ spbufp: *mut *mut ::spwd, ++ ) -> ::c_int; ++ pub fn getspent_r( ++ spbuf: *mut ::spwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ spbufp: *mut *mut ::spwd, ++ ) -> ::c_int; ++ ++ pub fn getspnam_r( ++ name: *const ::c_char, ++ spbuf: *mut spwd, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ spbufp: *mut *mut spwd, ++ ) -> ::c_int; ++ ++ // mntent.h ++ pub fn getmntent_r( ++ stream: *mut ::FILE, ++ mntbuf: *mut ::mntent, ++ buf: *mut ::c_char, ++ buflen: ::c_int, ++ ) -> *mut ::mntent; ++ ++ pub fn utmpname(file: *const ::c_char) -> ::c_int; ++ pub fn utmpxname(file: *const ::c_char) -> ::c_int; ++ pub fn getutxent() -> *mut utmpx; ++ pub fn getutxid(ut: *const utmpx) -> *mut utmpx; ++ pub fn getutxline(ut: *const utmpx) -> *mut utmpx; ++ pub fn pututxline(ut: *const utmpx) -> *mut utmpx; ++ pub fn setutxent(); ++ pub fn endutxent(); ++ ++ pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t, suid: *mut ::uid_t) -> ::c_int; ++ pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t, sgid: *mut ::gid_t) -> ::c_int; ++ pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int; ++ pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int; ++ ++ pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; ++ ++ pub fn getgrgid(gid: ::gid_t) -> *mut ::group; ++ pub fn getgrgid_r( ++ gid: ::gid_t, ++ grp: *mut ::group, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::group, ++ ) -> ::c_int; ++ ++ pub fn getgrnam(name: *const ::c_char) -> *mut ::group; ++ pub fn getgrnam_r( ++ name: *const ::c_char, ++ grp: *mut ::group, ++ buf: *mut ::c_char, ++ buflen: ::size_t, ++ result: *mut *mut ::group, ++ ) -> ::c_int; ++ ++ pub fn getgrouplist( ++ user: *const ::c_char, ++ group: ::gid_t, ++ groups: *mut ::gid_t, ++ ngroups: *mut ::c_int, ++ ) -> ::c_int; ++ + pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; + ++ pub fn acct(filename: *const ::c_char) -> ::c_int; ++ ++ pub fn setmntent(filename: *const ::c_char, ty: *const ::c_char) -> *mut ::FILE; ++ pub fn getmntent(stream: *mut ::FILE) -> *mut ::mntent; ++ pub fn addmntent(stream: *mut ::FILE, mnt: *const ::mntent) -> ::c_int; ++ pub fn endmntent(streamp: *mut ::FILE) -> ::c_int; ++ pub fn hasmntopt(mnt: *const ::mntent, opt: *const ::c_char) -> *mut ::c_char; ++ + pub fn pthread_create( + native: *mut ::pthread_t, + attr: *const ::pthread_attr_t, + f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, + value: *mut ::c_void, + ) -> ::c_int; +- pub fn pthread_kill(__threadid: pthread_t, __signo: ::c_int) -> ::c_int; ++ pub fn pthread_kill(__threadid: ::pthread_t, __signo: ::c_int) -> ::c_int; ++ pub fn pthread_cancel(thread: ::pthread_t) -> ::c_int; + pub fn __pthread_equal(__t1: __pthread_t, __t2: __pthread_t) -> ::c_int; + +- pub fn pthread_getattr_np(__thr: pthread_t, __attr: *mut pthread_attr_t) -> ::c_int; ++ pub fn pthread_getattr_np(__thr: ::pthread_t, __attr: *mut pthread_attr_t) -> ::c_int; + + pub fn pthread_attr_getguardsize( + __attr: *const pthread_attr_t, +@@ -2870,11 +3763,70 @@ extern "C" { + __stacksize: *mut ::size_t, + ) -> ::c_int; + ++ pub fn pthread_attr_getguardsize( ++ attr: *const ::pthread_attr_t, ++ guardsize: *mut ::size_t, ++ ) -> ::c_int; ++ pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; ++ ++ pub fn pthread_mutexattr_getpshared( ++ attr: *const pthread_mutexattr_t, ++ pshared: *mut ::c_int, ++ ) -> ::c_int; ++ pub fn pthread_mutexattr_setpshared( ++ attr: *mut pthread_mutexattr_t, ++ pshared: ::c_int, ++ ) -> ::c_int; ++ ++ pub fn pthread_mutex_timedlock( ++ lock: *mut pthread_mutex_t, ++ abstime: *const ::timespec, ++ ) -> ::c_int; ++ ++ pub fn pthread_rwlockattr_getpshared( ++ attr: *const pthread_rwlockattr_t, ++ val: *mut ::c_int, ++ ) -> ::c_int; ++ pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: ::c_int) -> ::c_int; ++ ++ pub fn pthread_condattr_getclock( ++ attr: *const pthread_condattr_t, ++ clock_id: *mut clockid_t, ++ ) -> ::c_int; + pub fn pthread_condattr_setclock( + __attr: *mut pthread_condattr_t, + __clock_id: __clockid_t, + ) -> ::c_int; ++ pub fn pthread_condattr_getpshared( ++ attr: *const pthread_condattr_t, ++ pshared: *mut ::c_int, ++ ) -> ::c_int; ++ pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: ::c_int) -> ::c_int; ++ ++ pub fn pthread_once(control: *mut pthread_once_t, routine: extern "C" fn()) -> ::c_int; + ++ pub fn pthread_barrierattr_init(attr: *mut ::pthread_barrierattr_t) -> ::c_int; ++ pub fn pthread_barrierattr_destroy(attr: *mut ::pthread_barrierattr_t) -> ::c_int; ++ pub fn pthread_barrierattr_getpshared( ++ attr: *const ::pthread_barrierattr_t, ++ shared: *mut ::c_int, ++ ) -> ::c_int; ++ pub fn pthread_barrierattr_setpshared( ++ attr: *mut ::pthread_barrierattr_t, ++ shared: ::c_int, ++ ) -> ::c_int; ++ pub fn pthread_barrier_init( ++ barrier: *mut pthread_barrier_t, ++ attr: *const ::pthread_barrierattr_t, ++ count: ::c_uint, ++ ) -> ::c_int; ++ pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> ::c_int; ++ pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> ::c_int; ++ pub fn pthread_spin_init(lock: *mut ::pthread_spinlock_t, pshared: ::c_int) -> ::c_int; ++ pub fn pthread_spin_destroy(lock: *mut ::pthread_spinlock_t) -> ::c_int; ++ pub fn pthread_spin_lock(lock: *mut ::pthread_spinlock_t) -> ::c_int; ++ pub fn pthread_spin_trylock(lock: *mut ::pthread_spinlock_t) -> ::c_int; ++ pub fn pthread_spin_unlock(lock: *mut ::pthread_spinlock_t) -> ::c_int; + pub fn pthread_atfork( + prepare: ::Option<unsafe extern "C" fn()>, + parent: ::Option<unsafe extern "C" fn()>, +@@ -2887,9 +3839,72 @@ extern "C" { + __oldmask: *mut __sigset_t, + ) -> ::c_int; + ++ pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int; ++ pub fn sched_setparam(pid: ::pid_t, param: *const ::sched_param) -> ::c_int; ++ pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; ++ pub fn sched_setscheduler( ++ pid: ::pid_t, ++ policy: ::c_int, ++ param: *const ::sched_param, ++ ) -> ::c_int; ++ pub fn pthread_getschedparam( ++ native: ::pthread_t, ++ policy: *mut ::c_int, ++ param: *mut ::sched_param, ++ ) -> ::c_int; ++ pub fn pthread_setschedparam( ++ native: ::pthread_t, ++ policy: ::c_int, ++ param: *const ::sched_param, ++ ) -> ::c_int; ++ ++ pub fn pthread_getcpuclockid(thread: ::pthread_t, clk_id: *mut ::clockid_t) -> ::c_int; ++ ++ pub fn sem_init(sem: *mut sem_t, pshared: ::c_int, value: ::c_uint) -> ::c_int; ++ pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; ++ pub fn sem_timedwait(sem: *mut sem_t, abstime: *const ::timespec) -> ::c_int; ++ pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; ++ + pub fn clock_getres(__clock_id: clockid_t, __res: *mut ::timespec) -> ::c_int; + pub fn clock_gettime(__clock_id: clockid_t, __tp: *mut ::timespec) -> ::c_int; + pub fn clock_settime(__clock_id: clockid_t, __tp: *const ::timespec) -> ::c_int; ++ pub fn clock_getcpuclockid(pid: ::pid_t, clk_id: *mut ::clockid_t) -> ::c_int; ++ ++ pub fn clock_nanosleep( ++ clk_id: ::clockid_t, ++ flags: ::c_int, ++ rqtp: *const ::timespec, ++ rmtp: *mut ::timespec, ++ ) -> ::c_int; ++ ++ pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; ++ pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int; ++ ++ pub fn asctime_r(tm: *const ::tm, buf: *mut ::c_char) -> *mut ::c_char; ++ pub fn ctime_r(timep: *const time_t, buf: *mut ::c_char) -> *mut ::c_char; ++ ++ pub fn strftime( ++ s: *mut ::c_char, ++ max: ::size_t, ++ format: *const ::c_char, ++ tm: *const ::tm, ++ ) -> ::size_t; ++ pub fn strptime(s: *const ::c_char, format: *const ::c_char, tm: *mut ::tm) -> *mut ::c_char; ++ ++ pub fn timer_create( ++ clockid: ::clockid_t, ++ sevp: *mut ::sigevent, ++ timerid: *mut ::timer_t, ++ ) -> ::c_int; ++ pub fn timer_delete(timerid: ::timer_t) -> ::c_int; ++ pub fn timer_getoverrun(timerid: ::timer_t) -> ::c_int; ++ pub fn timer_gettime(timerid: ::timer_t, curr_value: *mut ::itimerspec) -> ::c_int; ++ pub fn timer_settime( ++ timerid: ::timer_t, ++ flags: ::c_int, ++ new_value: *const ::itimerspec, ++ old_value: *mut ::itimerspec, ++ ) -> ::c_int; + + pub fn fstat(__fd: ::c_int, __buf: *mut stat) -> ::c_int; + pub fn fstat64(__fd: ::c_int, __buf: *mut stat64) -> ::c_int; +@@ -2907,6 +3922,14 @@ extern "C" { + __flag: ::c_int, + ) -> ::c_int; + ++ pub fn statx( ++ dirfd: ::c_int, ++ pathname: *const c_char, ++ flags: ::c_int, ++ mask: ::c_uint, ++ statxbuf: *mut statx, ++ ) -> ::c_int; ++ + pub fn ftruncate(__fd: ::c_int, __length: __off_t) -> ::c_int; + pub fn ftruncate64(__fd: ::c_int, __length: __off64_t) -> ::c_int; + pub fn truncate64(__file: *const ::c_char, __length: __off64_t) -> ::c_int; +@@ -2930,6 +3953,175 @@ extern "C" { + pub fn openat(__fd: ::c_int, __file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; + pub fn openat64(__fd: ::c_int, __file: *const ::c_char, __oflag: ::c_int, ...) -> ::c_int; + ++ pub fn fopen64(filename: *const c_char, mode: *const c_char) -> *mut ::FILE; ++ pub fn freopen64( ++ filename: *const c_char, ++ mode: *const c_char, ++ file: *mut ::FILE, ++ ) -> *mut ::FILE; ++ ++ pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; ++ ++ pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int; ++ pub fn mkostemps(template: *mut ::c_char, suffixlen: ::c_int, flags: ::c_int) -> ::c_int; ++ pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; ++ pub fn tmpfile64() -> *mut ::FILE; ++ ++ pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; ++ ++ pub fn getdtablesize() -> ::c_int; ++ ++ // Added in `glibc` 2.34 ++ pub fn close_range(first: ::c_uint, last: ::c_uint, flags: ::c_int) -> ::c_int; ++ ++ pub fn openpty( ++ __amaster: *mut ::c_int, ++ __aslave: *mut ::c_int, ++ __name: *mut ::c_char, ++ __termp: *const termios, ++ __winp: *const ::winsize, ++ ) -> ::c_int; ++ ++ pub fn forkpty( ++ __amaster: *mut ::c_int, ++ __name: *mut ::c_char, ++ __termp: *const termios, ++ __winp: *const ::winsize, ++ ) -> ::pid_t; ++ ++ pub fn getpt() -> ::c_int; ++ pub fn ptsname_r(fd: ::c_int, buf: *mut ::c_char, buflen: ::size_t) -> ::c_int; ++ pub fn login_tty(fd: ::c_int) -> ::c_int; ++ ++ pub fn ctermid(s: *mut ::c_char) -> *mut ::c_char; ++ ++ pub fn clearenv() -> ::c_int; ++ ++ pub fn execveat( ++ dirfd: ::c_int, ++ pathname: *const ::c_char, ++ argv: *const *mut c_char, ++ envp: *const *mut c_char, ++ flags: ::c_int, ++ ) -> ::c_int; ++ pub fn execvpe( ++ file: *const ::c_char, ++ argv: *const *const ::c_char, ++ envp: *const *const ::c_char, ++ ) -> ::c_int; ++ pub fn fexecve( ++ fd: ::c_int, ++ argv: *const *const ::c_char, ++ envp: *const *const ::c_char, ++ ) -> ::c_int; ++ ++ pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; ++ ++ // posix/spawn.h ++ pub fn posix_spawn( ++ pid: *mut ::pid_t, ++ path: *const ::c_char, ++ file_actions: *const ::posix_spawn_file_actions_t, ++ attrp: *const ::posix_spawnattr_t, ++ argv: *const *mut ::c_char, ++ envp: *const *mut ::c_char, ++ ) -> ::c_int; ++ pub fn posix_spawnp( ++ pid: *mut ::pid_t, ++ file: *const ::c_char, ++ file_actions: *const ::posix_spawn_file_actions_t, ++ attrp: *const ::posix_spawnattr_t, ++ argv: *const *mut ::c_char, ++ envp: *const *mut ::c_char, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_init(attr: *mut posix_spawnattr_t) -> ::c_int; ++ pub fn posix_spawnattr_destroy(attr: *mut posix_spawnattr_t) -> ::c_int; ++ pub fn posix_spawnattr_getsigdefault( ++ attr: *const posix_spawnattr_t, ++ default: *mut ::sigset_t, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setsigdefault( ++ attr: *mut posix_spawnattr_t, ++ default: *const ::sigset_t, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_getsigmask( ++ attr: *const posix_spawnattr_t, ++ default: *mut ::sigset_t, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setsigmask( ++ attr: *mut posix_spawnattr_t, ++ default: *const ::sigset_t, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_getflags( ++ attr: *const posix_spawnattr_t, ++ flags: *mut ::c_short, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setflags(attr: *mut posix_spawnattr_t, flags: ::c_short) -> ::c_int; ++ pub fn posix_spawnattr_getpgroup( ++ attr: *const posix_spawnattr_t, ++ flags: *mut ::pid_t, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setpgroup(attr: *mut posix_spawnattr_t, flags: ::pid_t) -> ::c_int; ++ pub fn posix_spawnattr_getschedpolicy( ++ attr: *const posix_spawnattr_t, ++ flags: *mut ::c_int, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setschedpolicy(attr: *mut posix_spawnattr_t, flags: ::c_int) -> ::c_int; ++ pub fn posix_spawnattr_getschedparam( ++ attr: *const posix_spawnattr_t, ++ param: *mut ::sched_param, ++ ) -> ::c_int; ++ pub fn posix_spawnattr_setschedparam( ++ attr: *mut posix_spawnattr_t, ++ param: *const ::sched_param, ++ ) -> ::c_int; ++ ++ pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> ::c_int; ++ pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> ::c_int; ++ pub fn posix_spawn_file_actions_addopen( ++ actions: *mut posix_spawn_file_actions_t, ++ fd: ::c_int, ++ path: *const ::c_char, ++ oflag: ::c_int, ++ mode: ::mode_t, ++ ) -> ::c_int; ++ pub fn posix_spawn_file_actions_addclose( ++ actions: *mut posix_spawn_file_actions_t, ++ fd: ::c_int, ++ ) -> ::c_int; ++ pub fn posix_spawn_file_actions_adddup2( ++ actions: *mut posix_spawn_file_actions_t, ++ fd: ::c_int, ++ newfd: ::c_int, ++ ) -> ::c_int; ++ ++ // Added in `glibc` 2.29 ++ pub fn posix_spawn_file_actions_addchdir_np( ++ actions: *mut ::posix_spawn_file_actions_t, ++ path: *const ::c_char, ++ ) -> ::c_int; ++ // Added in `glibc` 2.29 ++ pub fn posix_spawn_file_actions_addfchdir_np( ++ actions: *mut ::posix_spawn_file_actions_t, ++ fd: ::c_int, ++ ) -> ::c_int; ++ // Added in `glibc` 2.34 ++ pub fn posix_spawn_file_actions_addclosefrom_np( ++ actions: *mut ::posix_spawn_file_actions_t, ++ from: ::c_int, ++ ) -> ::c_int; ++ // Added in `glibc` 2.35 ++ pub fn posix_spawn_file_actions_addtcsetpgrp_np( ++ actions: *mut ::posix_spawn_file_actions_t, ++ tcfd: ::c_int, ++ ) -> ::c_int; ++ ++ pub fn shm_open(name: *const c_char, oflag: ::c_int, mode: mode_t) -> ::c_int; ++ pub fn shm_unlink(name: *const ::c_char) -> ::c_int; ++ ++ pub fn euidaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; ++ pub fn eaccess(pathname: *const ::c_char, mode: ::c_int) -> ::c_int; ++ + pub fn faccessat( + dirfd: ::c_int, + pathname: *const ::c_char, +@@ -2944,6 +4136,13 @@ extern "C" { + pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; + pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent, result: *mut *mut ::dirent) + -> ::c_int; ++ pub fn readdir64_r( ++ dirp: *mut ::DIR, ++ entry: *mut ::dirent64, ++ result: *mut *mut ::dirent64, ++ ) -> ::c_int; ++ pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); ++ pub fn telldir(dirp: *mut ::DIR) -> ::c_long; + + pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; + +@@ -2961,6 +4160,14 @@ extern "C" { + __offset: __off64_t, + ) -> *mut ::c_void; + ++ pub fn mremap( ++ addr: *mut ::c_void, ++ len: ::size_t, ++ new_len: ::size_t, ++ flags: ::c_int, ++ ... ++ ) -> *mut ::c_void; ++ + pub fn mprotect(__addr: *mut ::c_void, __len: ::size_t, __prot: ::c_int) -> ::c_int; + + pub fn msync(__addr: *mut ::c_void, __len: ::size_t, __flags: ::c_int) -> ::c_int; +@@ -2983,10 +4190,12 @@ extern "C" { + + pub fn madvise(__addr: *mut ::c_void, __len: ::size_t, __advice: ::c_int) -> ::c_int; + +- pub fn getrlimit(resource: ::__rlimit_resource, rlim: *mut ::rlimit) -> ::c_int; +- pub fn getrlimit64(resource: ::__rlimit_resource, rlim: *mut ::rlimit64) -> ::c_int; +- pub fn setrlimit(resource: ::__rlimit_resource, rlim: *const ::rlimit) -> ::c_int; +- pub fn setrlimit64(resource: ::__rlimit_resource, rlim: *const ::rlimit64) -> ::c_int; ++ pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int) -> ::c_int; ++ ++ pub fn getrlimit(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit) -> ::c_int; ++ pub fn getrlimit64(resource: ::__rlimit_resource_t, rlim: *mut ::rlimit64) -> ::c_int; ++ pub fn setrlimit(resource: ::__rlimit_resource_t, rlim: *const ::rlimit) -> ::c_int; ++ pub fn setrlimit64(resource: ::__rlimit_resource_t, rlim: *const ::rlimit64) -> ::c_int; + + pub fn getpriority(which: ::__priority_which, who: ::id_t) -> ::c_int; + pub fn setpriority(which: ::__priority_which, who: ::id_t, prio: ::c_int) -> ::c_int; +@@ -2994,7 +4203,179 @@ extern "C" { + pub fn getrandom(__buffer: *mut ::c_void, __length: ::size_t, __flags: ::c_uint) -> ::ssize_t; + pub fn getentropy(__buffer: *mut ::c_void, __length: ::size_t) -> ::c_int; + ++ pub fn memrchr(cx: *const ::c_void, c: ::c_int, n: ::size_t) -> *mut ::c_void; ++ pub fn memmem( ++ haystack: *const ::c_void, ++ haystacklen: ::size_t, ++ needle: *const ::c_void, ++ needlelen: ::size_t, ++ ) -> *mut ::c_void; ++ pub fn strchrnul(s: *const ::c_char, c: ::c_int) -> *mut ::c_char; ++ ++ pub fn abs(i: ::c_int) -> ::c_int; ++ pub fn labs(i: ::c_long) -> ::c_long; ++ pub fn rand() -> ::c_int; ++ pub fn srand(seed: ::c_uint); ++ ++ pub fn drand48() -> ::c_double; ++ pub fn erand48(xseed: *mut ::c_ushort) -> ::c_double; ++ pub fn lrand48() -> ::c_long; ++ pub fn nrand48(xseed: *mut ::c_ushort) -> ::c_long; ++ pub fn mrand48() -> ::c_long; ++ pub fn jrand48(xseed: *mut ::c_ushort) -> ::c_long; ++ pub fn srand48(seed: ::c_long); ++ pub fn seed48(xseed: *mut ::c_ushort) -> *mut ::c_ushort; ++ pub fn lcong48(p: *mut ::c_ushort); ++ ++ pub fn qsort_r( ++ base: *mut ::c_void, ++ num: ::size_t, ++ size: ::size_t, ++ compar: ::Option< ++ unsafe extern "C" fn(*const ::c_void, *const ::c_void, *mut ::c_void) -> ::c_int, ++ >, ++ arg: *mut ::c_void, ++ ); ++ ++ pub fn brk(addr: *mut ::c_void) -> ::c_int; ++ pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void; ++ ++ pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; ++ pub fn mallopt(param: ::c_int, value: ::c_int) -> ::c_int; ++ ++ pub fn mallinfo() -> ::mallinfo; ++ pub fn mallinfo2() -> ::mallinfo2; ++ pub fn malloc_info(options: ::c_int, stream: *mut ::FILE) -> ::c_int; ++ pub fn malloc_usable_size(ptr: *mut ::c_void) -> ::size_t; ++ pub fn malloc_trim(__pad: ::size_t) -> ::c_int; ++ ++ pub fn iconv_open(tocode: *const ::c_char, fromcode: *const ::c_char) -> iconv_t; ++ pub fn iconv( ++ cd: iconv_t, ++ inbuf: *mut *mut ::c_char, ++ inbytesleft: *mut ::size_t, ++ outbuf: *mut *mut ::c_char, ++ outbytesleft: *mut ::size_t, ++ ) -> ::size_t; ++ pub fn iconv_close(cd: iconv_t) -> ::c_int; ++ ++ pub fn getopt_long( ++ argc: ::c_int, ++ argv: *const *mut c_char, ++ optstring: *const c_char, ++ longopts: *const option, ++ longindex: *mut ::c_int, ++ ) -> ::c_int; ++ + pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; ++ ++ pub fn reboot(how_to: ::c_int) -> ::c_int; ++ ++ pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; ++ ++ pub fn regexec( ++ preg: *const ::regex_t, ++ input: *const ::c_char, ++ nmatch: ::size_t, ++ pmatch: *mut regmatch_t, ++ eflags: ::c_int, ++ ) -> ::c_int; ++ ++ pub fn regerror( ++ errcode: ::c_int, ++ preg: *const ::regex_t, ++ errbuf: *mut ::c_char, ++ errbuf_size: ::size_t, ++ ) -> ::size_t; ++ ++ pub fn regfree(preg: *mut ::regex_t); ++ ++ pub fn glob( ++ pattern: *const c_char, ++ flags: ::c_int, ++ errfunc: ::Option<extern "C" fn(epath: *const c_char, errno: ::c_int) -> ::c_int>, ++ pglob: *mut ::glob_t, ++ ) -> ::c_int; ++ pub fn globfree(pglob: *mut ::glob_t); ++ ++ pub fn glob64( ++ pattern: *const ::c_char, ++ flags: ::c_int, ++ errfunc: ::Option<extern "C" fn(epath: *const ::c_char, errno: ::c_int) -> ::c_int>, ++ pglob: *mut glob64_t, ++ ) -> ::c_int; ++ pub fn globfree64(pglob: *mut glob64_t); ++ ++ pub fn getxattr( ++ path: *const c_char, ++ name: *const c_char, ++ value: *mut ::c_void, ++ size: ::size_t, ++ ) -> ::ssize_t; ++ pub fn lgetxattr( ++ path: *const c_char, ++ name: *const c_char, ++ value: *mut ::c_void, ++ size: ::size_t, ++ ) -> ::ssize_t; ++ pub fn fgetxattr( ++ filedes: ::c_int, ++ name: *const c_char, ++ value: *mut ::c_void, ++ size: ::size_t, ++ ) -> ::ssize_t; ++ pub fn setxattr( ++ path: *const c_char, ++ name: *const c_char, ++ value: *const ::c_void, ++ size: ::size_t, ++ flags: ::c_int, ++ ) -> ::c_int; ++ pub fn lsetxattr( ++ path: *const c_char, ++ name: *const c_char, ++ value: *const ::c_void, ++ size: ::size_t, ++ flags: ::c_int, ++ ) -> ::c_int; ++ pub fn fsetxattr( ++ filedes: ::c_int, ++ name: *const c_char, ++ value: *const ::c_void, ++ size: ::size_t, ++ flags: ::c_int, ++ ) -> ::c_int; ++ pub fn listxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; ++ pub fn llistxattr(path: *const c_char, list: *mut c_char, size: ::size_t) -> ::ssize_t; ++ pub fn flistxattr(filedes: ::c_int, list: *mut c_char, size: ::size_t) -> ::ssize_t; ++ pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; ++ pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; ++ pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; ++ ++ pub fn dirname(path: *mut ::c_char) -> *mut ::c_char; ++ /// POSIX version of `basename(3)`, defined in `libgen.h`. ++ #[link_name = "__xpg_basename"] ++ pub fn posix_basename(path: *mut ::c_char) -> *mut ::c_char; ++ /// GNU version of `basename(3)`, defined in `string.h`. ++ #[link_name = "basename"] ++ pub fn gnu_basename(path: *const ::c_char) -> *mut ::c_char; ++ ++ pub fn dlmopen(lmid: Lmid_t, filename: *const ::c_char, flag: ::c_int) -> *mut ::c_void; ++ pub fn dlinfo(handle: *mut ::c_void, request: ::c_int, info: *mut ::c_void) -> ::c_int; ++ pub fn dladdr1( ++ addr: *const ::c_void, ++ info: *mut ::Dl_info, ++ extra_info: *mut *mut ::c_void, ++ flags: ::c_int, ++ ) -> ::c_int; ++ ++ pub fn duplocale(base: ::locale_t) -> ::locale_t; ++ pub fn freelocale(loc: ::locale_t); ++ pub fn newlocale(mask: ::c_int, locale: *const ::c_char, base: ::locale_t) -> ::locale_t; ++ pub fn uselocale(loc: ::locale_t) -> ::locale_t; ++ pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; ++ pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char; ++ + pub fn dl_iterate_phdr( + callback: ::Option< + unsafe extern "C" fn( +@@ -3005,6 +4386,9 @@ extern "C" { + >, + data: *mut ::c_void, + ) -> ::c_int; ++ ++ pub fn gnu_get_libc_release() -> *const ::c_char; ++ pub fn gnu_get_libc_version() -> *const ::c_char; + } + + safe_f! { diff --git a/debian/patches/u-hurd-libc.4.patch b/debian/patches/u-hurd-libc.4.patch new file mode 100644 index 000000000..9868f2c68 --- /dev/null +++ b/debian/patches/u-hurd-libc.4.patch @@ -0,0 +1,347 @@ +https://github.com/rust-lang/libc/pull/3430 + +commit 07e57b2b2a383d942ee546dc4d69bf28280a1549 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Fri Nov 10 20:14:11 2023 +0100 + + hurd: Fix C API interface completion + + c72c68c5d12e ("hurd: Complete C API interface") was actually missing a few + fixes. + +diff --git a/vendor/libc/src/unix/hurd/mod.rs b/vendor/libc/src/unix/hurd/mod.rs +index 75a272e4d..2e9f69e66 100644 +--- a/vendor/libc/src/unix/hurd/mod.rs ++++ b/vendor/libc/src/unix/hurd/mod.rs +@@ -164,6 +164,7 @@ pub type pthread_key_t = __pthread_key; + pub type pthread_once_t = __pthread_once; + + pub type __rlimit_resource = ::c_uint; ++pub type __rlimit_resource_t = __rlimit_resource; + pub type rlim_t = __rlim_t; + pub type rlim64_t = __rlim64_t; + +@@ -215,10 +216,34 @@ pub type tcp_ca_state = ::c_uint; + + pub type idtype_t = ::c_uint; + ++pub type mqd_t = ::c_int; ++ ++pub type Lmid_t = ::c_long; ++ + pub type regoff_t = ::c_int; + ++pub type nl_item = ::c_int; ++ + pub type iconv_t = *mut ::c_void; + ++#[cfg_attr(feature = "extra_traits", derive(Debug))] ++pub enum fpos64_t {} // FIXME: fill this out with a struct ++impl ::Copy for fpos64_t {} ++impl ::Clone for fpos64_t { ++ fn clone(&self) -> fpos64_t { ++ *self ++ } ++} ++ ++#[cfg_attr(feature = "extra_traits", derive(Debug))] ++pub enum timezone {} ++impl ::Copy for timezone {} ++impl ::Clone for timezone { ++ fn clone(&self) -> timezone { ++ *self ++ } ++} ++ + // structs + s! { + pub struct ip_mreq { +@@ -431,7 +456,7 @@ s! { + + pub struct stat { + pub st_fstype: ::c_int, +- pub st_fsid: __fsid_t, ++ pub st_dev: __fsid_t, /* Actually st_fsid */ + pub st_ino: __ino_t, + pub st_gen: ::c_uint, + pub st_rdev: __dev_t, +@@ -583,6 +608,18 @@ s! { + __glibc_reserved: [::c_char; 32] + } + ++ pub struct mq_attr { ++ pub mq_flags: ::c_long, ++ pub mq_maxmsg: ::c_long, ++ pub mq_msgsize: ::c_long, ++ pub mq_curmsgs: ::c_long, ++ } ++ ++ pub struct __exit_status { ++ pub e_termination: ::c_short, ++ pub e_exit: ::c_short, ++ } ++ + #[cfg_attr(target_pointer_width = "32", + repr(align(4)))] + #[cfg_attr(target_pointer_width = "64", +@@ -998,6 +1035,96 @@ s! { + + } + ++s_no_extra_traits! { ++ pub struct utmpx { ++ pub ut_type: ::c_short, ++ pub ut_pid: ::pid_t, ++ pub ut_line: [::c_char; __UT_LINESIZE], ++ pub ut_id: [::c_char; 4], ++ ++ pub ut_user: [::c_char; __UT_NAMESIZE], ++ pub ut_host: [::c_char; __UT_HOSTSIZE], ++ pub ut_exit: __exit_status, ++ ++ #[cfg(any( all(target_pointer_width = "32", ++ not(target_arch = "x86_64"))))] ++ pub ut_session: ::c_long, ++ #[cfg(any(all(target_pointer_width = "32", ++ not(target_arch = "x86_64"))))] ++ pub ut_tv: ::timeval, ++ ++ #[cfg(not(any(all(target_pointer_width = "32", ++ not(target_arch = "x86_64")))))] ++ pub ut_session: i32, ++ #[cfg(not(any(all(target_pointer_width = "32", ++ not(target_arch = "x86_64")))))] ++ pub ut_tv: __timeval, ++ ++ pub ut_addr_v6: [i32; 4], ++ __glibc_reserved: [::c_char; 20], ++ } ++} ++ ++cfg_if! { ++ if #[cfg(feature = "extra_traits")] { ++ impl PartialEq for utmpx { ++ fn eq(&self, other: &utmpx) -> bool { ++ self.ut_type == other.ut_type ++ && self.ut_pid == other.ut_pid ++ && self.ut_line == other.ut_line ++ && self.ut_id == other.ut_id ++ && self.ut_user == other.ut_user ++ && self ++ .ut_host ++ .iter() ++ .zip(other.ut_host.iter()) ++ .all(|(a,b)| a == b) ++ && self.ut_exit == other.ut_exit ++ && self.ut_session == other.ut_session ++ && self.ut_tv == other.ut_tv ++ && self.ut_addr_v6 == other.ut_addr_v6 ++ && self.__glibc_reserved == other.__glibc_reserved ++ } ++ } ++ ++ impl Eq for utmpx {} ++ ++ impl ::fmt::Debug for utmpx { ++ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { ++ f.debug_struct("utmpx") ++ .field("ut_type", &self.ut_type) ++ .field("ut_pid", &self.ut_pid) ++ .field("ut_line", &self.ut_line) ++ .field("ut_id", &self.ut_id) ++ .field("ut_user", &self.ut_user) ++ // FIXME: .field("ut_host", &self.ut_host) ++ .field("ut_exit", &self.ut_exit) ++ .field("ut_session", &self.ut_session) ++ .field("ut_tv", &self.ut_tv) ++ .field("ut_addr_v6", &self.ut_addr_v6) ++ .field("__glibc_reserved", &self.__glibc_reserved) ++ .finish() ++ } ++ } ++ ++ impl ::hash::Hash for utmpx { ++ fn hash<H: ::hash::Hasher>(&self, state: &mut H) { ++ self.ut_type.hash(state); ++ self.ut_pid.hash(state); ++ self.ut_line.hash(state); ++ self.ut_id.hash(state); ++ self.ut_user.hash(state); ++ self.ut_host.hash(state); ++ self.ut_exit.hash(state); ++ self.ut_session.hash(state); ++ self.ut_tv.hash(state); ++ self.ut_addr_v6.hash(state); ++ self.__glibc_reserved.hash(state); ++ } ++ } ++ } ++} ++ + impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + self.si_addr +@@ -1310,7 +1437,10 @@ pub const INET_ADDRSTRLEN: usize = 16; + pub const INET6_ADDRSTRLEN: usize = 46; + + // netinet/ip.h +-pub const IPTOS_ECN_MASK: u8 = 0x03; ++pub const IPTOS_TOS_MASK: u8 = 0x1E; ++pub const IPTOS_PREC_MASK: u8 = 0xE0; ++ ++pub const IPTOS_ECN_NOT_ECT: u8 = 0x00; + + pub const IPTOS_LOWDELAY: u8 = 0x10; + pub const IPTOS_THROUGHPUT: u8 = 0x08; +@@ -1372,6 +1502,12 @@ pub const ARPOP_InREQUEST: u16 = 8; + pub const ARPOP_InREPLY: u16 = 9; + pub const ARPOP_NAK: u16 = 10; + ++pub const MAX_ADDR_LEN: usize = 7; ++pub const ARPD_UPDATE: ::c_ushort = 0x01; ++pub const ARPD_LOOKUP: ::c_ushort = 0x02; ++pub const ARPD_FLUSH: ::c_ushort = 0x03; ++pub const ATF_MAGIC: ::c_int = 0x80; ++ + pub const ATF_NETMASK: ::c_int = 0x20; + pub const ATF_DONTPUB: ::c_int = 0x40; + +@@ -1598,6 +1734,71 @@ pub const LC_MEASUREMENT_MASK: ::c_int = 2048; + pub const LC_IDENTIFICATION_MASK: ::c_int = 4096; + pub const LC_ALL_MASK: ::c_int = 8127; + ++pub const ABDAY_1: ::nl_item = 0x20000; ++pub const ABDAY_2: ::nl_item = 0x20001; ++pub const ABDAY_3: ::nl_item = 0x20002; ++pub const ABDAY_4: ::nl_item = 0x20003; ++pub const ABDAY_5: ::nl_item = 0x20004; ++pub const ABDAY_6: ::nl_item = 0x20005; ++pub const ABDAY_7: ::nl_item = 0x20006; ++ ++pub const DAY_1: ::nl_item = 0x20007; ++pub const DAY_2: ::nl_item = 0x20008; ++pub const DAY_3: ::nl_item = 0x20009; ++pub const DAY_4: ::nl_item = 0x2000A; ++pub const DAY_5: ::nl_item = 0x2000B; ++pub const DAY_6: ::nl_item = 0x2000C; ++pub const DAY_7: ::nl_item = 0x2000D; ++ ++pub const ABMON_1: ::nl_item = 0x2000E; ++pub const ABMON_2: ::nl_item = 0x2000F; ++pub const ABMON_3: ::nl_item = 0x20010; ++pub const ABMON_4: ::nl_item = 0x20011; ++pub const ABMON_5: ::nl_item = 0x20012; ++pub const ABMON_6: ::nl_item = 0x20013; ++pub const ABMON_7: ::nl_item = 0x20014; ++pub const ABMON_8: ::nl_item = 0x20015; ++pub const ABMON_9: ::nl_item = 0x20016; ++pub const ABMON_10: ::nl_item = 0x20017; ++pub const ABMON_11: ::nl_item = 0x20018; ++pub const ABMON_12: ::nl_item = 0x20019; ++ ++pub const MON_1: ::nl_item = 0x2001A; ++pub const MON_2: ::nl_item = 0x2001B; ++pub const MON_3: ::nl_item = 0x2001C; ++pub const MON_4: ::nl_item = 0x2001D; ++pub const MON_5: ::nl_item = 0x2001E; ++pub const MON_6: ::nl_item = 0x2001F; ++pub const MON_7: ::nl_item = 0x20020; ++pub const MON_8: ::nl_item = 0x20021; ++pub const MON_9: ::nl_item = 0x20022; ++pub const MON_10: ::nl_item = 0x20023; ++pub const MON_11: ::nl_item = 0x20024; ++pub const MON_12: ::nl_item = 0x20025; ++ ++pub const AM_STR: ::nl_item = 0x20026; ++pub const PM_STR: ::nl_item = 0x20027; ++ ++pub const D_T_FMT: ::nl_item = 0x20028; ++pub const D_FMT: ::nl_item = 0x20029; ++pub const T_FMT: ::nl_item = 0x2002A; ++pub const T_FMT_AMPM: ::nl_item = 0x2002B; ++ ++pub const ERA: ::nl_item = 0x2002C; ++pub const ERA_D_FMT: ::nl_item = 0x2002E; ++pub const ALT_DIGITS: ::nl_item = 0x2002F; ++pub const ERA_D_T_FMT: ::nl_item = 0x20030; ++pub const ERA_T_FMT: ::nl_item = 0x20031; ++ ++pub const CODESET: ::nl_item = 14; ++pub const CRNCYSTR: ::nl_item = 0x4000F; ++pub const RADIXCHAR: ::nl_item = 0x10000; ++pub const THOUSEP: ::nl_item = 0x10001; ++pub const YESEXPR: ::nl_item = 0x50000; ++pub const NOEXPR: ::nl_item = 0x50001; ++pub const YESSTR: ::nl_item = 0x50002; ++pub const NOSTR: ::nl_item = 0x50003; ++ + // reboot.h + pub const RB_AUTOBOOT: ::c_int = 0x0; + pub const RB_ASKNAME: ::c_int = 0x1; +@@ -1785,6 +1986,7 @@ pub const CBRK: u8 = 0u8; + + // dlfcn.h + pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; ++pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; + pub const RTLD_LAZY: ::c_int = 1; + pub const RTLD_NOW: ::c_int = 2; + pub const RTLD_BINDING_MASK: ::c_int = 3; +@@ -2942,6 +3144,10 @@ pub const PRIO_PROCESS: __priority_which = 0; + pub const PRIO_PGRP: __priority_which = 1; + pub const PRIO_USER: __priority_which = 2; + ++pub const __UT_LINESIZE: usize = 32; ++pub const __UT_NAMESIZE: usize = 32; ++pub const __UT_HOSTSIZE: usize = 256; ++ + pub const SOCK_STREAM: ::c_int = 1; + pub const SOCK_DGRAM: ::c_int = 2; + pub const SOCK_RAW: ::c_int = 3; +@@ -3079,11 +3285,6 @@ pub const RTLD_DI_TLS_DATA: ::c_int = 10; + pub const RTLD_DI_PHDR: ::c_int = 11; + pub const RTLD_DI_MAX: ::c_int = 11; + +-pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; +-pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; +-pub const RTLD_NODELETE: ::c_int = 0x1000; +-pub const RTLD_NOW: ::c_int = 0x2; +- + pub const SI_ASYNCIO: ::c_int = -4; + pub const SI_MESGQ: ::c_int = -3; + pub const SI_TIMER: ::c_int = -2; +@@ -3262,12 +3463,12 @@ f! { + return 0 as *mut cmsghdr; + }; + let next = (cmsg as usize + +- super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) ++ 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 ++ next as usize + CMSG_ALIGN((*next).cmsg_len as usize) > max + { + 0 as *mut cmsghdr + } else { +@@ -3756,6 +3957,7 @@ extern "C" { + __attr: *const pthread_attr_t, + __guardsize: *mut ::size_t, + ) -> ::c_int; ++ pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; + + pub fn pthread_attr_getstack( + __attr: *const pthread_attr_t, +@@ -3763,12 +3965,6 @@ extern "C" { + __stacksize: *mut ::size_t, + ) -> ::c_int; + +- pub fn pthread_attr_getguardsize( +- attr: *const ::pthread_attr_t, +- guardsize: *mut ::size_t, +- ) -> ::c_int; +- pub fn pthread_attr_setguardsize(attr: *mut ::pthread_attr_t, guardsize: ::size_t) -> ::c_int; +- + pub fn pthread_mutexattr_getpshared( + attr: *const pthread_mutexattr_t, + pshared: *mut ::c_int, diff --git a/debian/patches/u-hurd-libloading-0.7.4.patch b/debian/patches/u-hurd-libloading-0.7.4.patch new file mode 100644 index 000000000..3b4ce6ba9 --- /dev/null +++ b/debian/patches/u-hurd-libloading-0.7.4.patch @@ -0,0 +1,44 @@ +https://github.com/nagisa/rust_libloading/pull/129 + +commit 2e3104a30c4d14aa48871036b779f968a9472ff6 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Tue Aug 29 19:55:29 2023 +0000 + + Add GNU/Hurd support + +diff --git a/vendor/libloading-0.7.4/src/os/unix/consts.rs b/vendor/libloading-0.7.4/src/os/unix/consts.rs +index ea7a6a1..5794ade 100644 +--- a/vendor/libloading-0.7.4/src/os/unix/consts.rs ++++ b/vendor/libloading-0.7.4/src/os/unix/consts.rs +@@ -82,6 +82,7 @@ mod posix { + + target_os = "fuchsia", + target_os = "redox", ++ target_os = "hurd", + ))] { + pub(super) const RTLD_LAZY: c_int = 1; + } else { +@@ -115,6 +116,7 @@ mod posix { + + target_os = "fuchsia", + target_os = "redox", ++ target_os = "hurd", + ))] { + pub(super) const RTLD_NOW: c_int = 2; + } else if #[cfg(all(target_os = "android",target_pointer_width = "32"))] { +@@ -162,6 +164,7 @@ mod posix { + + target_os = "fuchsia", + target_os = "redox", ++ target_os = "hurd", + ))] { + pub(super) const RTLD_GLOBAL: c_int = 0x100; + } else { +@@ -200,6 +203,7 @@ mod posix { + + target_os = "fuchsia", + target_os = "redox", ++ target_os = "hurd", + ))] { + pub(super) const RTLD_LOCAL: c_int = 0; + } else { diff --git a/debian/patches/u-hurd-socket2.patch b/debian/patches/u-hurd-socket2.patch new file mode 100644 index 000000000..8257bfc61 --- /dev/null +++ b/debian/patches/u-hurd-socket2.patch @@ -0,0 +1,92 @@ +https://github.com/rust-lang/socket2/pull/474 + +commit c19d481701f01f77cf8346fc0f6e69886e44b097 +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Tue Aug 29 20:03:20 2023 +0000 + + Add GNU/Hurd support + +diff --git a/vendor/socket2/src/sockaddr.rs b/vendor/socket2/src/sockaddr.rs +index 9ce638e..649a6dc 100644 +--- a/vendor/socket2/src/sockaddr.rs ++++ b/vendor/socket2/src/sockaddr.rs +@@ -231,6 +231,7 @@ impl From<SocketAddrV4> for SockAddr { + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", ++ target_os = "hurd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", +@@ -270,6 +271,7 @@ impl From<SocketAddrV6> for SockAddr { + target_os = "dragonfly", + target_os = "freebsd", + target_os = "haiku", ++ target_os = "hurd", + target_os = "ios", + target_os = "macos", + target_os = "netbsd", +diff --git a/vendor/socket2/src/socket.rs b/vendor/socket2/src/socket.rs +index 69d0478..eedcff0 100644 +--- a/vendor/socket2/src/socket.rs ++++ b/vendor/socket2/src/socket.rs +@@ -1223,6 +1223,7 @@ impl Socket { + #[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", ++ target_os = "hurd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", +@@ -1258,6 +1259,7 @@ impl Socket { + #[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", ++ target_os = "hurd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", +@@ -1432,6 +1434,7 @@ impl Socket { + #[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", ++ target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", +@@ -1461,6 +1464,7 @@ impl Socket { + #[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", ++ target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", +diff --git a/vendor/socket2/src/sys/unix.rs b/vendor/socket2/src/sys/unix.rs +index 74da8cc..9d3d6cd 100644 +--- a/vendor/socket2/src/sys/unix.rs ++++ b/vendor/socket2/src/sys/unix.rs +@@ -82,6 +82,7 @@ pub(crate) use libc::IP_HDRINCL; + #[cfg(not(any( + target_os = "dragonfly", + target_os = "fuchsia", ++ target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", +@@ -112,6 +113,7 @@ pub(crate) use libc::{ + #[cfg(not(any( + target_os = "dragonfly", + target_os = "haiku", ++ target_os = "hurd", + target_os = "netbsd", + target_os = "openbsd", + target_os = "redox", +@@ -226,6 +228,7 @@ type IovLen = usize; + target_os = "freebsd", + target_os = "fuchsia", + target_os = "haiku", ++ target_os = "hurd", + target_os = "illumos", + target_os = "netbsd", + target_os = "openbsd", diff --git a/debian/patches/u-hurd-tests.patch b/debian/patches/u-hurd-tests.patch new file mode 100644 index 000000000..15eacdcf2 --- /dev/null +++ b/debian/patches/u-hurd-tests.patch @@ -0,0 +1,54 @@ +These tests hang or make the box OOM + +Index: rust/tests/ui/associated-consts/issue-93775.rs +=================================================================== +--- rust.orig/tests/ui/associated-consts/issue-93775.rs ++++ rust/tests/ui/associated-consts/issue-93775.rs +@@ -1,5 +1,6 @@ + // build-pass + // ignore-tidy-linelength ++// ignore-hurd + + // Regression for #93775, needs build-pass to test it. + +Index: rust/tests/ui/issues/issue-74564-if-expr-stack-overflow.rs +=================================================================== +--- rust.orig/tests/ui/issues/issue-74564-if-expr-stack-overflow.rs ++++ rust/tests/ui/issues/issue-74564-if-expr-stack-overflow.rs +@@ -1,5 +1,6 @@ + // build-pass + // ignore-tidy-filelength ++// ignore-hurd + #![crate_type = "rlib"] + + fn banana(v: &str) -> u32 { +Index: rust/tests/ui/threads-sendsync/mpsc_stress.rs +=================================================================== +--- rust.orig/tests/ui/threads-sendsync/mpsc_stress.rs ++++ rust/tests/ui/threads-sendsync/mpsc_stress.rs +@@ -1,6 +1,7 @@ + // run-pass + // compile-flags:--test + // ignore-emscripten ++// ignore-hurd + + use std::sync::mpsc::channel; + use std::sync::mpsc::TryRecvError; +Index: rust/tests/run-make/long-linker-command-lines/foo.rs +=================================================================== +--- rust.orig/tests/run-make/long-linker-command-lines/foo.rs ++++ rust/tests/run-make/long-linker-command-lines/foo.rs +@@ -44,6 +44,13 @@ fn read_linker_args(path: &Path) -> Stri + } + } + ++#[cfg(target_os = "hurd")] ++// Debian: test causes build to fail on hurd ++fn main() { ++ return; ++} ++ ++#[cfg(not(target_os = "hurd"))] + fn main() { + let tmpdir = PathBuf::from(env::var_os("TMPDIR").unwrap()); + let ok = tmpdir.join("ok"); |