summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/issue_template.md24
-rw-r--r--.travis.yml29
-rw-r--r--Cargo.toml8
-rw-r--r--README.md4
-rw-r--r--build.rs7
-rw-r--r--ci/android-install-ndk.sh31
-rw-r--r--ci/android-install-sdk.sh43
-rw-r--r--ci/build.sh22
-rw-r--r--ci/docker/aarch64-linux-android/Dockerfile4
-rw-r--r--ci/docker/aarch64-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/aarch64-unknown-linux-musl/Dockerfile8
-rw-r--r--ci/docker/arm-linux-androideabi/Dockerfile4
-rw-r--r--ci/docker/arm-unknown-linux-gnueabihf/Dockerfile2
-rw-r--r--ci/docker/arm-unknown-linux-musleabihf/Dockerfile6
-rw-r--r--ci/docker/asmjs-unknown-emscripten/Dockerfile2
-rw-r--r--ci/docker/i686-linux-android/Dockerfile4
-rw-r--r--ci/docker/i686-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/i686-unknown-linux-musl/Dockerfile8
-rw-r--r--ci/docker/mips-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/mips-unknown-linux-musl/Dockerfile2
-rw-r--r--ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile2
-rw-r--r--ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile2
-rw-r--r--ci/docker/mipsel-unknown-linux-musl/Dockerfile2
-rw-r--r--ci/docker/powerpc-unknown-linux-gnu/Dockerfile3
-rw-r--r--ci/docker/powerpc64-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/s390x-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/sparc64-unknown-linux-gnu/Dockerfile7
-rw-r--r--ci/docker/wasm32-unknown-emscripten/Dockerfile2
-rw-r--r--ci/docker/wasm32-wasi/Dockerfile93
-rwxr-xr-xci/docker/wasm32-wasi/clang.sh2
-rw-r--r--ci/docker/x86_64-linux-android/Dockerfile2
-rw-r--r--ci/docker/x86_64-unknown-linux-gnu/Dockerfile2
-rw-r--r--ci/docker/x86_64-unknown-linux-gnux32/Dockerfile2
-rw-r--r--ci/docker/x86_64-unknown-linux-musl/Dockerfile8
-rw-r--r--ci/linux-s390x.sh4
-rw-r--r--ci/linux-sparc64.sh8
-rw-r--r--ci/style.rs3
-rw-r--r--ci/switch.json37
-rwxr-xr-xci/test-runner-linux9
-rw-r--r--libc-test/Cargo.toml4
-rw-r--r--libc-test/build.rs2390
-rw-r--r--src/fuchsia/mod.rs11
-rw-r--r--src/lib.rs11
-rw-r--r--src/redox/align.rs6
-rw-r--r--src/redox/mod.rs416
-rw-r--r--src/redox/net.rs117
-rw-r--r--src/redox/no_align.rs6
-rw-r--r--src/unix/bsd/apple/mod.rs3
-rw-r--r--src/unix/bsd/freebsdlike/dragonfly/mod.rs1
-rw-r--r--src/unix/bsd/freebsdlike/freebsd/mod.rs2
-rw-r--r--src/unix/bsd/freebsdlike/mod.rs5
-rw-r--r--src/unix/bsd/mod.rs7
-rw-r--r--src/unix/bsd/netbsdlike/mod.rs7
-rw-r--r--src/unix/bsd/netbsdlike/netbsd/mod.rs3
-rw-r--r--src/unix/bsd/netbsdlike/openbsd/aarch64.rs (renamed from src/unix/bsd/netbsdlike/openbsdlike/openbsd/aarch64.rs)0
-rw-r--r--src/unix/bsd/netbsdlike/openbsd/mod.rs (renamed from src/unix/bsd/netbsdlike/openbsdlike/mod.rs)502
-rw-r--r--src/unix/bsd/netbsdlike/openbsd/x86.rs (renamed from src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86.rs)0
-rw-r--r--src/unix/bsd/netbsdlike/openbsd/x86_64.rs (renamed from src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86_64.rs)0
-rw-r--r--src/unix/bsd/netbsdlike/openbsdlike/bitrig/mod.rs129
-rw-r--r--src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86.rs2
-rw-r--r--src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86_64.rs10
-rw-r--r--src/unix/bsd/netbsdlike/openbsdlike/openbsd/mod.rs497
-rw-r--r--src/unix/haiku/mod.rs8
-rw-r--r--src/unix/hermit/mod.rs5
-rw-r--r--src/unix/mod.rs49
-rw-r--r--src/unix/newlib/mod.rs76
-rw-r--r--src/unix/notbsd/android/b32/mod.rs26
-rw-r--r--src/unix/notbsd/android/b64/aarch64.rs14
-rw-r--r--src/unix/notbsd/android/b64/mod.rs2
-rw-r--r--src/unix/notbsd/android/b64/x86_64.rs24
-rw-r--r--src/unix/notbsd/android/mod.rs123
-rw-r--r--src/unix/notbsd/emscripten/mod.rs10
-rw-r--r--src/unix/notbsd/linux/align.rs6
-rw-r--r--src/unix/notbsd/linux/mips/mips32.rs8
-rw-r--r--src/unix/notbsd/linux/mips/mips64.rs2
-rw-r--r--src/unix/notbsd/linux/mips/mod.rs12
-rw-r--r--src/unix/notbsd/linux/mod.rs240
-rw-r--r--src/unix/notbsd/linux/musl/b32/mips.rs8
-rw-r--r--src/unix/notbsd/linux/musl/mod.rs5
-rw-r--r--src/unix/notbsd/linux/other/b32/arm.rs3
-rw-r--r--src/unix/notbsd/linux/other/b32/x86.rs1
-rw-r--r--src/unix/notbsd/linux/other/b64/aarch64.rs2
-rw-r--r--src/unix/notbsd/linux/other/b64/sparc64.rs2
-rw-r--r--src/unix/notbsd/linux/other/b64/x86_64.rs1
-rw-r--r--src/unix/notbsd/linux/other/mod.rs88
-rw-r--r--src/unix/notbsd/linux/s390x/mod.rs6
-rw-r--r--src/unix/notbsd/mod.rs70
-rw-r--r--src/unix/redox/mod.rs593
-rw-r--r--src/unix/solarish/mod.rs7
-rw-r--r--src/unix/uclibc/align.rs61
-rw-r--r--src/unix/uclibc/mips/mips32/mod.rs8
-rw-r--r--src/unix/uclibc/mod.rs93
-rw-r--r--src/unix/uclibc/x86_64/align.rs43
-rw-r--r--src/unix/uclibc/x86_64/l4re.rs1
-rw-r--r--src/unix/uclibc/x86_64/mod.rs35
-rw-r--r--src/wasi.rs1336
97 files changed, 5085 insertions, 2420 deletions
diff --git a/.github/issue_template.md b/.github/issue_template.md
new file mode 100644
index 0000000000..435bf35c66
--- /dev/null
+++ b/.github/issue_template.md
@@ -0,0 +1,24 @@
+<!--
+**Help us help you.**
+
+If you are reporting a bug, include:
+
+* a Minimum Working Example without any dependencies (except libc) that shows
+ the issue and ideally reproduces in the Rust playground
+* the target triple - libc supports many targets and many APIs
+* instructions to reproduce, logs (e.g. build logs, links to Travis-CI logs,
+ uploads to github gists, etc.).
+
+If you are requesting a new API, include:
+
+* the target triple
+* link to the documentation of the API showing the type signatures, how to use
+ it, etc.
+
+In general, just please consider that the people who can help you are all very
+busy, they will be helping you in their free time, there are a lot of people in
+need of help so they need to prioritize to which issues they devote their free
+time, etc. So try to give most of the information upfront, be concise, show
+small self-contained examples (nobody has time to create a new cargo project,
+set up dependencies,...), etc. Help us help you.
+-->
diff --git a/.travis.yml b/.travis.yml
index d56112a338..3c6cc9429e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -174,6 +174,8 @@ matrix:
stage: tier2
- env: TARGET=asmjs-unknown-emscripten
stage: tier2
+ - env: TARGET=i686-linux-android
+ stage: tier2
- env: TARGET=i686-unknown-linux-musl
stage: tier2
- env: TARGET=mips-unknown-linux-gnu
@@ -204,11 +206,32 @@ matrix:
stage: tier2
- env: TARGET=x86_64-unknown-linux-musl
stage: tier2
+ - env: TARGET=wasm32-wasi
+ rust: nightly
+ stage: tier2
+ - name: "Nintendo Switch - build libcore only"
+ rust: nightly
+ stage: tier2
+ install:
+ - rustup component add rust-src
+ - (test -x $HOME/.cargo/bin/cargo-xbuild || cargo install cargo-xbuild)
+ script:
+ - mkdir -p target
+ - cd target
+ - wget https://github.com/devkitPro/pacman/releases/download/devkitpro-pacman-1.0.1/devkitpro-pacman.deb
+ - sudo dpkg -i devkitpro-pacman.deb
+ - sudo dkp-pacman -Sy
+ - sudo dkp-pacman -Syu
+ - sudo dkp-pacman -S -v --noconfirm switch-dev devkitA64
+ - export PATH="$PATH:/opt/devkitpro/devkitA64/bin"
+ - export PATH="$PATH:/opt/devkitpro/tools/bin"
+ - cd ..
+ # Pull the target spec up into the current directory and then build
+ - mv ci/switch.json switch.json
+ - cargo xbuild --target switch.json
+
allow_failures:
- # FIXME: android build bots time out irregularly
- - env: TARGET=aarch64-linux-android
- - env: TARGET=arm-linux-androideabi
# FIXME: https://github.com/rust-lang/libc/issues/1226
- env: TARGET=asmjs-unknown-emscripten
- env: TARGET=wasm32-unknown-emscripten
diff --git a/Cargo.toml b/Cargo.toml
index 56a0181cb4..b40aff9ed2 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "libc"
-version = "0.2.49"
+version = "0.2.55"
authors = ["The Rust Project Developers"]
license = "MIT OR Apache-2.0"
readme = "README.md"
@@ -23,11 +23,13 @@ appveyor = { repository = "rust-lang/libc", project_name = "rust-lang-libs/libc"
rustc-std-workspace-core = { version = "1.0.0", optional = true }
[features]
-default = ["use_std"]
-use_std = []
+default = ["std"]
+std = []
align = []
rustc-dep-of-std = ['align', 'rustc-std-workspace-core']
extra_traits = []
+# use_std is deprecated, use `std` instead
+use_std = [ 'std' ]
[workspace]
members = ["libc-test"]
diff --git a/README.md b/README.md
index a974ccd414..7bde17da6d 100644
--- a/README.md
+++ b/README.md
@@ -28,13 +28,15 @@ libc = "0.2"
## Features
-* `use_std`: by default `libc` links to the standard library. Disable this
+* `std`: by default `libc` links to the standard library. Disable this
feature remove this dependency and be able to use `libc` in `#![no_std]`
crates.
* `extra_traits`: all `struct`s implemented in `libc` are `Copy` and `Clone`.
This feature derives `Debug`, `Eq`, `Hash`, and `PartialEq`.
+* **deprecated**: `use_std` is deprecated, and is equivalent to `std`.
+
## Rust version support
The minimum supported Rust toolchain version is **Rust 1.13.0** . APIs requiring
diff --git a/build.rs b/build.rs
index 9b13376779..be96e83b68 100644
--- a/build.rs
+++ b/build.rs
@@ -9,6 +9,13 @@ fn main() {
std::env::var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok();
let align_cargo_feature = std::env::var("CARGO_FEATURE_ALIGN").is_ok();
+ if std::env::var("CARGO_FEATURE_USE_STD").is_ok() {
+ println!(
+ "cargo:warning=\"libc's use_std cargo feature is deprecated since libc 0.2.55; \
+ please consider using the `std` cargo feature instead\""
+ );
+ }
+
// Rust >= 1.15 supports private module use:
if rustc_minor_ver >= 15 || rustc_dep_of_std {
println!("cargo:rustc-cfg=libc_priv_mod_use");
diff --git a/ci/android-install-ndk.sh b/ci/android-install-ndk.sh
index 54f7b2efd9..723e719054 100644
--- a/ci/android-install-ndk.sh
+++ b/ci/android-install-ndk.sh
@@ -11,27 +11,40 @@
set -ex
-curl --retry 10 -O https://dl.google.com/android/repository/android-ndk-r15b-linux-x86_64.zip
-unzip -q android-ndk-r15b-linux-x86_64.zip
+NDK=android-ndk-r19c
+curl --retry 20 -O https://dl.google.com/android/repository/${NDK}-linux-x86_64.zip
+unzip -q ${NDK}-linux-x86_64.zip
case "$1" in
+ arm)
+ arch=arm
+ api=24
+ ;;
+ armv7)
+ arch=arm
+ api=24
+ ;;
aarch64)
arch=arm64
+ api=24
;;
-
i686)
arch=x86
+ api=28
+ ;;
+ x86_64)
+ arch=x86_64
+ api=28
;;
-
*)
- arch=$1
+ echo "invalid arch: $1"
+ exit 1
;;
esac;
-android-ndk-r15b/build/tools/make_standalone_toolchain.py \
- --unified-headers \
+${NDK}/build/tools/make_standalone_toolchain.py \
--install-dir "/android/ndk-${1}" \
--arch "${arch}" \
- --api 24
+ --api ${api}
-rm -rf ./android-ndk-r15b-linux-x86_64.zip ./android-ndk-r15b
+rm -rf ./${NDK}-linux-x86_64.zip ./${NDK}
diff --git a/ci/android-install-sdk.sh b/ci/android-install-sdk.sh
index 64cfbf1170..7f2104000f 100644
--- a/ci/android-install-sdk.sh
+++ b/ci/android-install-sdk.sh
@@ -18,43 +18,56 @@ set -ex
# located in https://github.com/appunite/docker by just wrapping it in a script
# which apparently magically accepts the licenses.
+SDK=4333796
mkdir sdk
-curl --retry 10 https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip -O
-unzip -d sdk sdk-tools-linux-3859397.zip
+curl --retry 20 https://dl.google.com/android/repository/sdk-tools-linux-${SDK}.zip -O
+unzip -q -d sdk sdk-tools-linux-${SDK}.zip
case "$1" in
arm | armv7)
- abi=armeabi-v7a
+ api=24
+ image="system-images;android-${api};google_apis;armeabi-v7a"
;;
-
aarch64)
- abi=arm64-v8a
+ api=24
+ image="system-images;android-${api};google_apis;arm64-v8a"
;;
-
i686)
- abi=x86
+ api=28
+ image="system-images;android-${api};default;x86"
;;
-
x86_64)
- abi=x86_64
+ api=28
+ image="system-images;android-${api};default;x86_64"
;;
-
*)
echo "invalid arch: $1"
exit 1
;;
esac;
+# Try to fix warning about missing file.
+# See https://askubuntu.com/a/1078784
+mkdir -p /root/.android/
+echo '### User Sources for Android SDK Manager' >> /root/.android/repositories.cfg
+echo '#Fri Nov 03 10:11:27 CET 2017 count=0' >> /root/.android/repositories.cfg
+
+# Print all available packages
+# yes | ./sdk/tools/bin/sdkmanager --list --verbose
+
# --no_https avoids
- # javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
-yes | ./sdk/tools/bin/sdkmanager --licenses --no_https
+# javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
+#
+# | grep -v = || true removes the progress bar output from the sdkmanager
+# which produces an insane amount of output.
+yes | ./sdk/tools/bin/sdkmanager --licenses --no_https | grep -v = || true
yes | ./sdk/tools/bin/sdkmanager --no_https \
"emulator" \
"platform-tools" \
- "platforms;android-24" \
- "system-images;android-24;default;$abi"
+ "platforms;android-${api}" \
+ "${image}" | grep -v = || true
echo "no" |
./sdk/tools/bin/avdmanager create avd \
--name "${1}" \
- --package "system-images;android-24;default;$abi"
+ --package "${image}" | grep -v = || true
diff --git a/ci/build.sh b/ci/build.sh
index b830ceb0f2..77da36c933 100644
--- a/ci/build.sh
+++ b/ci/build.sh
@@ -23,6 +23,11 @@ test_target() {
# See https://github.com/rust-lang/rust/issues/45417
opt="--release"
fi
+ # FIXME: https://github.com/rust-lang/rust/issues/61174
+ if [ "${TARGET}" = "sparcv9-sun-solaris" ] ||
+ [ "${TARGET}" = "x86_64-sun-solaris" ]; then
+ return 0
+ fi
# If there is a std component, fetch it:
if [ "${NO_STD}" != "1" ]; then
@@ -115,6 +120,7 @@ aarch64-fuchsia \
armv5te-unknown-linux-gnueabi \
armv5te-unknown-linux-musleabi \
i686-pc-windows-gnu \
+wasm32-wasi \
x86_64-fortanix-unknown-sgx \
x86_64-fuchsia \
x86_64-pc-windows-gnu \
@@ -167,11 +173,11 @@ done
# FIXME: https://github.com/rust-lang/rust/issues/58564
# sparc-unknown-linux-gnu
RUST_LINUX_NO_CORE_TARGETS="\
-x86_64-unknown-hermit \
-x86_64-unknown-dragonfly \
-aarch64-unknown-hermit \
aarch64-pc-windows-msvc \
aarch64-unknown-cloudabi \
+aarch64-unknown-hermit \
+aarch64-unknown-netbsd \
+aarch64-unknown-openbsd \
armebv7r-none-eabi \
armebv7r-none-eabihf \
armv7-unknown-cloudabi-eabihf \
@@ -182,8 +188,12 @@ i686-pc-windows-msvc \
i686-unknown-cloudabi \
i686-unknown-haiku \
i686-unknown-netbsd \
+i686-unknown-openbsd \
+mips-unknown-linux-uclibc \
+mipsel-unknown-linux-uclibc \
nvptx64-nvidia-cuda \
powerpc-unknown-linux-gnuspe \
+powerpc-unknown-netbsd \
riscv32imac-unknown-none-elf \
riscv32imc-unknown-none-elf \
sparc64-unknown-netbsd \
@@ -195,9 +205,11 @@ thumbv7neon-linux-androideabi \
thumbv7neon-unknown-linux-gnueabihf \
thumbv8m.main-none-eabi \
x86_64-pc-windows-msvc
-x86_64-unknown-bitrig \
+x86_64-unknown-dragonfly \
x86_64-unknown-haiku \
-x86_64-unknown-openbsd
+x86_64-unknown-hermit \
+x86_64-unknown-l4re-uclibc \
+x86_64-unknown-openbsd \
"
if [ "${RUST}" = "nightly" ] && [ "${OS}" = "linux" ]; then
diff --git a/ci/docker/aarch64-linux-android/Dockerfile b/ci/docker/aarch64-linux-android/Dockerfile
index 5fc83aadb3..6751dd9376 100644
--- a/ci/docker/aarch64-linux-android/Dockerfile
+++ b/ci/docker/aarch64-linux-android/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN dpkg --add-architecture i386 && \
apt-get update && \
@@ -9,7 +9,7 @@ RUN dpkg --add-architecture i386 && \
python \
unzip \
expect \
- openjdk-9-jre \
+ openjdk-8-jre \
libstdc++6:i386 \
libpulse0 \
gcc \
diff --git a/ci/docker/aarch64-unknown-linux-gnu/Dockerfile b/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
index 18214a3e64..716a445d34 100644
--- a/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev ca-certificates \
gcc-aarch64-linux-gnu libc6-dev-arm64-cross qemu-user
diff --git a/ci/docker/aarch64-unknown-linux-musl/Dockerfile b/ci/docker/aarch64-unknown-linux-musl/Dockerfile
index fbc47d9fef..ea73657429 100644
--- a/ci/docker/aarch64-unknown-linux-musl/Dockerfile
+++ b/ci/docker/aarch64-unknown-linux-musl/Dockerfile
@@ -1,16 +1,16 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc make libc6-dev git curl ca-certificates \
gcc-aarch64-linux-gnu qemu-user
-RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.19.tar.gz | \
+RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.22.tar.gz | \
tar xzf - && \
- cd musl-1.1.19 && \
+ cd musl-1.1.22 && \
CC=aarch64-linux-gnu-gcc \
./configure --prefix=/musl-aarch64 --enable-wrapper=yes && \
make install -j4 && \
cd .. && \
- rm -rf musl-1.1.19
+ rm -rf musl-1.1.22
# Install linux kernel headers sanitized for use with musl
RUN curl --retry 5 -L https://github.com/sabotage-linux/kernel-headers/archive/v3.12.6-6.tar.gz | \
tar xzf - && \
diff --git a/ci/docker/arm-linux-androideabi/Dockerfile b/ci/docker/arm-linux-androideabi/Dockerfile
index a3fc64bfd5..544d1676e1 100644
--- a/ci/docker/arm-linux-androideabi/Dockerfile
+++ b/ci/docker/arm-linux-androideabi/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN dpkg --add-architecture i386 && \
apt-get update && \
@@ -9,7 +9,7 @@ RUN dpkg --add-architecture i386 && \
python \
unzip \
expect \
- openjdk-9-jre \
+ openjdk-8-jre \
libstdc++6:i386 \
libpulse0 \
gcc \
diff --git a/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile b/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
index 9fe71dcf87..bcdbb227f2 100644
--- a/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
+++ b/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev ca-certificates \
gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user
diff --git a/ci/docker/arm-unknown-linux-musleabihf/Dockerfile b/ci/docker/arm-unknown-linux-musleabihf/Dockerfile
index 0d493ca39b..b001fd2c36 100644
--- a/ci/docker/arm-unknown-linux-musleabihf/Dockerfile
+++ b/ci/docker/arm-unknown-linux-musleabihf/Dockerfile
@@ -1,11 +1,11 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc make libc6-dev git curl ca-certificates \
gcc-arm-linux-gnueabihf qemu-user
-RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.19.tar.gz | tar xzf -
-WORKDIR /musl-1.1.19
+RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.22.tar.gz | tar xzf -
+WORKDIR /musl-1.1.22
RUN CC=arm-linux-gnueabihf-gcc \
CFLAGS="-march=armv6 -marm -mfpu=vfp" \
./configure --prefix=/musl-arm --enable-wrapper=yes
diff --git a/ci/docker/asmjs-unknown-emscripten/Dockerfile b/ci/docker/asmjs-unknown-emscripten/Dockerfile
index 3088fc53c4..6c08340eb9 100644
--- a/ci/docker/asmjs-unknown-emscripten/Dockerfile
+++ b/ci/docker/asmjs-unknown-emscripten/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN apt-get update && \
apt-get install -y --no-install-recommends \
diff --git a/ci/docker/i686-linux-android/Dockerfile b/ci/docker/i686-linux-android/Dockerfile
index f0836c3853..540322055e 100644
--- a/ci/docker/i686-linux-android/Dockerfile
+++ b/ci/docker/i686-linux-android/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN dpkg --add-architecture i386 && \
apt-get update && \
@@ -9,7 +9,7 @@ RUN dpkg --add-architecture i386 && \
python \
unzip \
expect \
- openjdk-9-jre \
+ openjdk-8-jre \
libstdc++6:i386 \
libpulse0 \
gcc \
diff --git a/ci/docker/i686-unknown-linux-gnu/Dockerfile b/ci/docker/i686-unknown-linux-gnu/Dockerfile
index 03f3e8e690..5563a7b96b 100644
--- a/ci/docker/i686-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/i686-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:18.04
+FROM ubuntu:19.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
gcc-multilib libc6-dev ca-certificates
diff --git a/ci/docker/i686-unknown-linux-musl/Dockerfile b/ci/docker/i686-unknown-linux-musl/Dockerfile
index b726e4d41c..9dd44e0836 100644
--- a/ci/docker/i686-unknown-linux-musl/Dockerfile
+++ b/ci/docker/i686-unknown-linux-musl/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN dpkg --add-architecture i386
RUN apt-get update
@@ -12,13 +12,13 @@ RUN apt-get install -y --no-install-recommends \
# since otherwise the script will fail to find a compiler.
# * We manually unset CROSS_COMPILE when running make; otherwise the makefile
# will call the non-existent binary 'i686-ar'.
-RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.19.tar.gz | \
+RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.22.tar.gz | \
tar xzf - && \
- cd musl-1.1.19 && \
+ cd musl-1.1.22 && \
CC=gcc CFLAGS=-m32 ./configure --prefix=/musl-i686 --disable-shared --target=i686 && \
make CROSS_COMPILE= install -j4 && \
cd .. && \
- rm -rf musl-1.1.19
+ rm -rf musl-1.1.22
# Install linux kernel headers sanitized for use with musl
RUN curl --retry 5 -L https://github.com/sabotage-linux/kernel-headers/archive/v3.12.6-6.tar.gz | \
tar xzf - && \
diff --git a/ci/docker/mips-unknown-linux-gnu/Dockerfile b/ci/docker/mips-unknown-linux-gnu/Dockerfile
index c66abd471b..9f1bcaf7a3 100644
--- a/ci/docker/mips-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/mips-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
diff --git a/ci/docker/mips-unknown-linux-musl/Dockerfile b/ci/docker/mips-unknown-linux-musl/Dockerfile
index dde22fd17e..7f2764cf78 100644
--- a/ci/docker/mips-unknown-linux-musl/Dockerfile
+++ b/ci/docker/mips-unknown-linux-musl/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \
diff --git a/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile b/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
index b9921fcc50..b97cdb4ce4 100644
--- a/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
+++ b/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
diff --git a/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile b/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
index 434c90819e..7f794525d9 100644
--- a/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
+++ b/ci/docker/mips64el-unknown-linux-gnuabi64/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
diff --git a/ci/docker/mipsel-unknown-linux-musl/Dockerfile b/ci/docker/mipsel-unknown-linux-musl/Dockerfile
index 037bf6493e..03e83578ea 100644
--- a/ci/docker/mipsel-unknown-linux-musl/Dockerfile
+++ b/ci/docker/mipsel-unknown-linux-musl/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \
diff --git a/ci/docker/powerpc-unknown-linux-gnu/Dockerfile b/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
index 106ada444a..9fa05af12e 100644
--- a/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
@@ -7,4 +7,5 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \
CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_RUNNER="qemu-ppc -L /usr/powerpc-linux-gnu" \
+ CC=powerpc-linux-gnu-gcc \
PATH=$PATH:/rust/bin
diff --git a/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile b/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
index a6ab66a9a6..ab40789755 100644
--- a/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
diff --git a/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile b/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
index 627123e9a1..4dcd632edd 100644
--- a/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/powerpc64le-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc libc6-dev qemu-user ca-certificates \
diff --git a/ci/docker/s390x-unknown-linux-gnu/Dockerfile b/ci/docker/s390x-unknown-linux-gnu/Dockerfile
index 861f4f9b00..75c11c11dc 100644
--- a/ci/docker/s390x-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/s390x-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
curl ca-certificates \
diff --git a/ci/docker/sparc64-unknown-linux-gnu/Dockerfile b/ci/docker/sparc64-unknown-linux-gnu/Dockerfile
index d9edaab426..d1f4503d52 100644
--- a/ci/docker/sparc64-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/sparc64-unknown-linux-gnu/Dockerfile
@@ -1,14 +1,11 @@
-FROM debian:stretch
+FROM ubuntu:19.04
RUN apt-get update && apt-get install -y --no-install-recommends \
curl ca-certificates \
gcc libc6-dev \
gcc-sparc64-linux-gnu libc6-dev-sparc64-cross \
qemu-system-sparc64 openbios-sparc seabios ipxe-qemu \
- p7zip-full cpio linux-libc-dev-sparc64-cross linux-headers-4.9.0-3-common
-
-# Put linux/module.h into the right spot as it is not shipped by debian
-RUN cp /usr/src/linux-headers-4.9.0-3-common/include/uapi/linux/module.h /usr/sparc64-linux-gnu/include/linux/
+ p7zip-full cpio linux-libc-dev-sparc64-cross
COPY linux-sparc64.sh /
RUN bash /linux-sparc64.sh
diff --git a/ci/docker/wasm32-unknown-emscripten/Dockerfile b/ci/docker/wasm32-unknown-emscripten/Dockerfile
index 59bf7d9a23..de8e35353b 100644
--- a/ci/docker/wasm32-unknown-emscripten/Dockerfile
+++ b/ci/docker/wasm32-unknown-emscripten/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN apt-get update && \
apt-get install -y --no-install-recommends \
diff --git a/ci/docker/wasm32-wasi/Dockerfile b/ci/docker/wasm32-wasi/Dockerfile
new file mode 100644
index 0000000000..d963a442c8
--- /dev/null
+++ b/ci/docker/wasm32-wasi/Dockerfile
@@ -0,0 +1,93 @@
+# In the first container we want to assemble the `wasi-sysroot` by compiling it
+# from source. This requires a clang 8.0+ compiler with enough wasm support and
+# then we're just running a standard `make` inside of what we clone.
+FROM ubuntu:18.04 as wasi-sysroot
+
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ ca-certificates \
+ clang \
+ cmake \
+ curl \
+ g++ \
+ git \
+ libc6-dev \
+ libclang-dev \
+ make \
+ ssh \
+ xz-utils
+
+# Fetch clang 8.0+ which is used to compile the wasi target and link our
+# programs together.
+RUN curl http://releases.llvm.org/8.0.0/clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz | tar xJf -
+RUN mv /clang+llvm-8.0.0-x86_64-linux-gnu-ubuntu-18.04 /wasmcc
+
+# Note that we're using `git reset --hard` to pin to a specific commit for
+# verification for now. The sysroot is currently in somewhat of a state of flux
+# and is expected to have breaking changes, so this is an attempt to mitigate
+# those breaking changes on `libc`'s own CI
+RUN git clone https://github.com/CraneStation/wasi-sysroot && \
+ cd wasi-sysroot && \
+ git reset --hard eee6ee7566e26f2535eb6088c8494a112ff423b9
+RUN make -C wasi-sysroot install -j $(nproc) WASM_CC=/wasmcc/bin/clang INSTALL_DIR=/wasi-sysroot
+
+# This is a small wrapper script which executes the actual clang binary in
+# `/wasmcc` and then is sure to pass the right `--sysroot` argument which we
+# just built above.
+COPY docker/wasm32-wasi/clang.sh /wasi-sysroot/bin/clang
+
+# In the second container we're going to build the `wasmtime` binary which is
+# used to execute wasi executables. This is a standard Rust project so we're
+# just checking out a known revision (which pairs with the sysroot one we
+# downlaoded above) and then we're building it with Cargo
+FROM ubuntu:18.04 as wasmtime
+
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ ca-certificates \
+ clang \
+ cmake \
+ curl \
+ g++ \
+ git \
+ libclang-dev \
+ make \
+ ssh
+
+RUN curl -sSf https://sh.rustup.rs | sh -s -- -y
+ENV PATH=/root/.cargo/bin:$PATH
+
+RUN apt-get install -y --no-install-recommends python
+RUN git clone --recursive https://github.com/CraneStation/wasmtime wasmtime && \
+ cd wasmtime && \
+ git reset --hard 67edb00f29b62864b00179fe4bfa99bc29973285
+RUN cargo build --release --manifest-path wasmtime/Cargo.toml
+
+# And finally in the last image we're going to assemble everything together.
+# We'll install things needed at runtime for now and then copy over the
+# sysroot/wasmtime artifacts into their final location.
+FROM ubuntu:18.04
+
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends \
+ gcc \
+ libc6-dev \
+ libxml2 \
+ ca-certificates
+
+# Copy over clang we downloaded to link executables ...
+COPY --from=wasi-sysroot /wasmcc /wasmcc/
+# ... and the sysroot we built to link executables against ...
+COPY --from=wasi-sysroot /wasi-sysroot/ /wasi-sysroot/
+# ... and finally wasmtime to actually execute binaries
+COPY --from=wasmtime /wasmtime/target/release/wasmtime /usr/bin/
+
+# Of note here is our clang wrapper which just executes a normal clang
+# executable with the right sysroot, and then we're sure to turn off the
+# crt-static feature to ensure that the CRT that we're specifying with `clang`
+# is used.
+ENV CARGO_TARGET_WASM32_WASI_RUNNER=wasmtime \
+ CARGO_TARGET_WASM32_WASI_LINKER=/wasi-sysroot/bin/clang \
+ CC_wasm32_wasi=/wasi-sysroot/bin/clang \
+ PATH=$PATH:/rust/bin \
+ RUSTFLAGS=-Ctarget-feature=-crt-static
diff --git a/ci/docker/wasm32-wasi/clang.sh b/ci/docker/wasm32-wasi/clang.sh
new file mode 100755
index 0000000000..6f298128ab
--- /dev/null
+++ b/ci/docker/wasm32-wasi/clang.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+exec /wasmcc/bin/clang --target=wasm32-wasi --sysroot /wasi-sysroot "$@"
diff --git a/ci/docker/x86_64-linux-android/Dockerfile b/ci/docker/x86_64-linux-android/Dockerfile
index 0cfbc48209..b0984c0458 100644
--- a/ci/docker/x86_64-linux-android/Dockerfile
+++ b/ci/docker/x86_64-linux-android/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:16.04
+FROM ubuntu:19.04
RUN apt-get update && \
apt-get install -y --no-install-recommends \
diff --git a/ci/docker/x86_64-unknown-linux-gnu/Dockerfile b/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
index 6ab9c92319..0dbb191fbd 100644
--- a/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
+++ b/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:18.04
+FROM ubuntu:19.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
gcc libc6-dev ca-certificates
diff --git a/ci/docker/x86_64-unknown-linux-gnux32/Dockerfile b/ci/docker/x86_64-unknown-linux-gnux32/Dockerfile
index 03f3e8e690..5563a7b96b 100644
--- a/ci/docker/x86_64-unknown-linux-gnux32/Dockerfile
+++ b/ci/docker/x86_64-unknown-linux-gnux32/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:18.04
+FROM ubuntu:19.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
gcc-multilib libc6-dev ca-certificates
diff --git a/ci/docker/x86_64-unknown-linux-musl/Dockerfile b/ci/docker/x86_64-unknown-linux-musl/Dockerfile
index 0a27709271..e99764fdf7 100644
--- a/ci/docker/x86_64-unknown-linux-musl/Dockerfile
+++ b/ci/docker/x86_64-unknown-linux-musl/Dockerfile
@@ -1,15 +1,15 @@
-FROM ubuntu:17.10
+FROM ubuntu:19.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends \
gcc make libc6-dev git curl ca-certificates
-RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.19.tar.gz | \
+RUN curl --retry 5 https://www.musl-libc.org/releases/musl-1.1.22.tar.gz | \
tar xzf - && \
- cd musl-1.1.19 && \
+ cd musl-1.1.22 && \
./configure --prefix=/musl-x86_64 && \
make install -j4 && \
cd .. && \
- rm -rf musl-1.1.19
+ rm -rf musl-1.1.22
# Install linux kernel headers sanitized for use with musl
RUN curl --retry 5 -L https://github.com/sabotage-linux/kernel-headers/archive/v3.12.6-6.tar.gz | \
tar xzf - && \
diff --git a/ci/linux-s390x.sh b/ci/linux-s390x.sh
index a230cfe12f..00a7f88180 100644
--- a/ci/linux-s390x.sh
+++ b/ci/linux-s390x.sh
@@ -6,8 +6,8 @@ mkdir -m 777 /qemu
cd /qemu
curl --retry 5 -LO https://github.com/qemu/qemu/raw/master/pc-bios/s390-ccw.img
-curl --retry 5 -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/kernel.debian
-curl --retry 5 -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20170828/images/generic/initrd.debian
+curl --retry 5 -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20190410/images/generic/kernel.debian
+curl --retry 5 -LO http://ftp.debian.org/debian/dists/testing/main/installer-s390x/20190410/images/generic/initrd.debian
mv kernel.debian kernel
mv initrd.debian initrd.gz
diff --git a/ci/linux-sparc64.sh b/ci/linux-sparc64.sh
index 7fb28d9e14..5580a0e3c3 100644
--- a/ci/linux-sparc64.sh
+++ b/ci/linux-sparc64.sh
@@ -5,11 +5,11 @@ set -ex
mkdir -m 777 /qemu
cd /qemu
-curl --retry 5 -LO https://cdimage.debian.org/cdimage/ports/9.0/sparc64/iso-cd/debian-9.0-sparc64-NETINST-1.iso
-7z e debian-9.0-sparc64-NETINST-1.iso boot/initrd.gz
-7z e debian-9.0-sparc64-NETINST-1.iso boot/sparc64
+curl --retry 5 -LO https://cdimage.debian.org/cdimage/ports/10.0/sparc64/iso-cd/debian-10.0-sparc64-NETINST-1.iso
+7z e debian-10.0-sparc64-NETINST-1.iso boot/initrd.gz
+7z e debian-10.0-sparc64-NETINST-1.iso boot/sparc64
mv sparc64 kernel
-rm debian-9.0-sparc64-NETINST-1.iso
+rm debian-10.0-sparc64-NETINST-1.iso
mkdir init
cd init
diff --git a/ci/style.rs b/ci/style.rs
index 747e26c0a0..481f57f74d 100644
--- a/ci/style.rs
+++ b/ci/style.rs
@@ -144,6 +144,9 @@ fn check_style(file: &str, path: &Path, err: &mut Errors) {
let line = if is_pub {&line[4..]} else {line};
let line_state = if line.starts_with("use ") {
+ if line.contains("c_void") {
+ continue;
+ }
if is_pub {
State::Modules
} else {
diff --git a/ci/switch.json b/ci/switch.json
new file mode 100644
index 0000000000..bc1894879d
--- /dev/null
+++ b/ci/switch.json
@@ -0,0 +1,37 @@
+{
+ "family": "unix",
+ "env": "newlib",
+ "target-env": "newlib",
+ "target-family": "unix",
+ "target-c-int-width": "32",
+ "target-endian": "little",
+ "target-pointer-width": "64",
+ "os": "horizon",
+ "arch": "aarch64",
+ "panic-strategy": "unwind",
+ "abi-blacklist": [
+ "stdcall",
+ "fastcall",
+ "vectorcall",
+ "thiscall",
+ "win64",
+ "sysv64"
+ ],
+ "dynamic-linking" : false,
+ "features": "+a53,+strict-align",
+ "data-layout": "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128",
+ "executables": true,
+ "position-independent-executables" : true,
+ "linker-flavor": "gcc",
+ "llvm-target": "aarch64-unknown-none",
+ "has-elf-tls" : false,
+ "linker-is-gnu" : true,
+ "disable-redzone" : true,
+ "relocation-model" : "pic",
+ "max-atomic-width": 128,
+ "exe-suffix": ".elf",
+ "staticlib-suffix" : ".a",
+ "trap-unreachable" : true,
+ "emit-debug-gdb-scripts" : true,
+ "requires-uwtable" : true
+} \ No newline at end of file
diff --git a/ci/test-runner-linux b/ci/test-runner-linux
index 569fa00770..cad31ec4c0 100755
--- a/ci/test-runner-linux
+++ b/ci/test-runner-linux
@@ -5,15 +5,6 @@ set -e
arch=$1
prog=$2
-# Skip cmsg test on linux-s390x
-# https://github.com/rust-lang/libc/issues/1240
-if [ "$arch" = "s390x" ]; then
- progbasename=`basename $prog`
- if [ "${progbasename%%-*}" = "cmsg" ]; then
- exit 0
- fi
-fi
-
cd /qemu/init
echo "#!/bin/sh\n/prog --color=never" > run_prog.sh
chmod +x run_prog.sh
diff --git a/libc-test/Cargo.toml b/libc-test/Cargo.toml
index 9862d3a569..0d2eee1a91 100644
--- a/libc-test/Cargo.toml
+++ b/libc-test/Cargo.toml
@@ -13,8 +13,8 @@ cc = "1.0"
ctest = "0.2"
[features]
-default = [ "use_std" ]
-use_std = [ "libc/use_std" ]
+default = [ "std" ]
+std = [ "libc/std" ]
align = [ "libc/align" ]
extra_traits = [ "libc/extra_traits" ]
diff --git a/libc-test/build.rs b/libc-test/build.rs
index d3d35614e7..d8e52084cf 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -5,754 +5,30 @@ extern crate ctest;
use std::env;
-#[cfg(unix)]
fn do_cc() {
- cc::Build::new().file("src/cmsg.c").compile("cmsg");
+ let target = env::var("TARGET").unwrap();
+ if cfg!(unix) && !target.contains("wasi") {
+ cc::Build::new().file("src/cmsg.c").compile("cmsg");
+ }
}
-#[cfg(not(unix))]
-fn do_cc() {}
fn do_ctest() {
- let target = env::var("TARGET").unwrap();
- let aarch64 = target.contains("aarch64");
- let i686 = target.contains("i686");
- let x86_64 = target.contains("x86_64");
- let x32 = target.ends_with("gnux32");
- let linux = target.contains("unknown-linux");
- let android = target.contains("android");
- let emscripten = target.contains("asm");
- let musl = target.contains("musl") || emscripten;
- let uclibc = target.contains("uclibc");
- let freebsd = target.contains("freebsd");
- let mips = target.contains("mips");
- let openbsd = target.contains("openbsd");
- let bsdlike = freebsd || openbsd;
- let mut cfg = ctest::TestGenerator::new();
-
- match &target {
+ match &env::var("TARGET").unwrap() {
+ t if t.contains("android") => return test_android(t),
t if t.contains("apple") => return test_apple(t),
+ t if t.contains("cloudabi") => return test_cloudabi(t),
+ t if t.contains("dragonfly") => return test_dragonflybsd(t),
+ t if t.contains("emscripten") => return test_emscripten(t),
+ t if t.contains("freebsd") => return test_freebsd(t),
+ t if t.contains("linux") => return test_linux(t),
+ t if t.contains("netbsd") => return test_netbsd(t),
t if t.contains("openbsd") => return test_openbsd(t),
- t if t.contains("windows") => return test_windows(t),
t if t.contains("redox") => return test_redox(t),
- t if t.contains("cloudabi") => return test_cloudabi(t),
t if t.contains("solaris") => return test_solaris(t),
- t if t.contains("netbsd") => return test_netbsd(t),
- t if t.contains("dragonfly") => return test_dragonflybsd(t),
- _ => (),
- }
-
- // Pull in extra goodies
- if linux || android || emscripten {
- cfg.define("_GNU_SOURCE", None);
- } else if freebsd {
- cfg.define("_WITH_GETLINE", None);
- }
-
- // Android doesn't actually have in_port_t but it's much easier if we
- // provide one for us to test against
- if android {
- cfg.define("in_port_t", Some("uint16_t"));
- }
-
- cfg.header("errno.h")
- .header("fcntl.h")
- .header("limits.h")
- .header("locale.h")
- .header("stddef.h")
- .header("stdint.h")
- .header("stdio.h")
- .header("stdlib.h")
- .header("sys/stat.h")
- .header("sys/types.h")
- .header("time.h")
- .header("wchar.h");
-
- cfg.flag("-Wno-deprecated-declarations");
-
- cfg.header("ctype.h");
- cfg.header("dirent.h");
- cfg.header("net/if.h");
- cfg.header("net/route.h");
- cfg.header("net/if_arp.h");
- if linux || android {
- cfg.header("linux/if_alg.h");
- }
- cfg.header("netdb.h");
- cfg.header("netinet/in.h");
- cfg.header("netinet/ip.h");
- cfg.header("netinet/tcp.h");
- cfg.header("netinet/udp.h");
- cfg.header("resolv.h");
- cfg.header("pthread.h");
- cfg.header("dlfcn.h");
- cfg.header("signal.h");
- cfg.header("string.h");
- cfg.header("sys/file.h");
- cfg.header("sys/ioctl.h");
- cfg.header("sys/mman.h");
- cfg.header("sys/resource.h");
- cfg.header("sys/socket.h");
- if linux && !musl {
- cfg.header("linux/if.h");
- cfg.header("sys/auxv.h");
- }
- cfg.header("sys/time.h");
- cfg.header("sys/un.h");
- cfg.header("sys/wait.h");
- cfg.header("unistd.h");
- cfg.header("utime.h");
- cfg.header("pwd.h");
- cfg.header("grp.h");
- cfg.header("sys/utsname.h");
- cfg.header("sys/ptrace.h");
- cfg.header("sys/mount.h");
- cfg.header("sys/uio.h");
- cfg.header("sched.h");
- cfg.header("termios.h");
- cfg.header("poll.h");
- cfg.header("syslog.h");
- cfg.header("semaphore.h");
- cfg.header("sys/statvfs.h");
- cfg.header("sys/times.h");
-
- if android {
- if !aarch64 && !x86_64 {
- // time64_t is not define for aarch64 and x86_64
- // If included it will generate the error 'Your time_t is already 64-bit'
- cfg.header("time64.h");
- }
- cfg.header("arpa/inet.h");
- cfg.header("xlocale.h");
- cfg.header("utmp.h");
- cfg.header("ifaddrs.h");
- if i686 || x86_64 {
- cfg.header("sys/reg.h");
- }
- } else {
- cfg.header("glob.h");
- cfg.header("ifaddrs.h");
- cfg.header("langinfo.h");
-
- if !openbsd && !freebsd {
- cfg.header("sys/quota.h");
- }
-
- if !musl && !x32 {
- cfg.header("sys/sysctl.h");
- }
-
- if !musl && !uclibc {
- if !openbsd && !uclibc {
- cfg.header("execinfo.h");
- }
-
- if openbsd {
- cfg.header("utmp.h");
- } else {
- cfg.header("utmpx.h");
- }
- }
- }
-
- if bsdlike {
- cfg.header("sys/event.h");
- cfg.header("net/if_dl.h");
- if freebsd {
- cfg.header("net/bpf.h");
- cfg.header("libutil.h");
- } else {
- cfg.header("util.h");
- }
- }
-
- if linux || emscripten {
- cfg.header("mntent.h");
- cfg.header("mqueue.h");
- cfg.header("ucontext.h");
- if !uclibc {
- // optionally included in uclibc
- cfg.header("sys/xattr.h");
- }
- cfg.header("sys/ipc.h");
- cfg.header("sys/sem.h");
- cfg.header("sys/msg.h");
- cfg.header("sys/shm.h");
- cfg.header("sys/user.h");
- cfg.header("sys/timerfd.h");
- cfg.header("shadow.h");
- if !emscripten {
- cfg.header("linux/input.h");
- cfg.header("linux/falloc.h");
- }
- if x86_64 {
- cfg.header("sys/io.h");
- }
- if i686 || x86_64 {
- cfg.header("sys/reg.h");
- }
- }
-
- if linux || android || emscripten {
- cfg.header("malloc.h");
- cfg.header("net/ethernet.h");
- cfg.header("netpacket/packet.h");
- cfg.header("sched.h");
- cfg.header("sys/epoll.h");
- cfg.header("sys/eventfd.h");
- cfg.header("sys/prctl.h");
- cfg.header("sys/sendfile.h");
- cfg.header("sys/signalfd.h");
- cfg.header("sys/vfs.h");
- cfg.header("sys/syscall.h");
- cfg.header("sys/personality.h");
- cfg.header("sys/swap.h");
- cfg.header("pty.h");
- if !uclibc {
- cfg.header("sys/sysinfo.h");
- }
- cfg.header("sys/reboot.h");
- if !emscripten {
- cfg.header("linux/sockios.h");
- cfg.header("linux/netlink.h");
- cfg.header("linux/genetlink.h");
- cfg.header("linux/netfilter_ipv4.h");
- cfg.header("linux/netfilter_ipv6.h");
- cfg.header("linux/fs.h");
- }
- if !musl {
- cfg.header("asm/mman.h");
- cfg.header("linux/magic.h");
- cfg.header("linux/reboot.h");
- cfg.header("linux/netfilter/nf_tables.h");
-
- if !mips {
- cfg.header("linux/quota.h");
- }
- }
- }
-
- if linux || android {
- cfg.header("sys/fsuid.h");
- cfg.header("linux/module.h");
- cfg.header("linux/seccomp.h");
- cfg.header("linux/if_ether.h");
- cfg.header("linux/if_tun.h");
- cfg.header("linux/net_tstamp.h");
- cfg.header("sys/inotify.h");
-
- // DCCP support
- if !uclibc && !musl && !emscripten {
- cfg.header("linux/dccp.h");
- }
-
- if !musl || mips {
- cfg.header("linux/memfd.h");
- }
- }
-
- if linux {
- cfg.header("linux/random.h");
- cfg.header("elf.h");
- cfg.header("link.h");
- cfg.header("spawn.h");
- }
-
- if freebsd {
- cfg.header("mqueue.h");
- cfg.header("pthread_np.h");
- cfg.header("sched.h");
- cfg.header("ufs/ufs/quota.h");
- cfg.header("sys/extattr.h");
- cfg.header("sys/jail.h");
- cfg.header("sys/ipc.h");
- cfg.header("sys/msg.h");
- cfg.header("sys/shm.h");
- cfg.header("sys/procdesc.h");
- cfg.header("sys/rtprio.h");
- cfg.header("spawn.h");
- }
-
- if openbsd {
- cfg.header("ufs/ufs/quota.h");
- cfg.header("pthread_np.h");
- cfg.header("sys/syscall.h");
- }
-
- if linux || freebsd || emscripten {
- if !uclibc {
- cfg.header("aio.h");
- }
- }
-
- cfg.type_name(move |ty, is_struct, is_union| {
- match ty {
- // Just pass all these through, no need for a "struct" prefix
- "FILE" | "fd_set" | "Dl_info" | "DIR" | "Elf32_Phdr"
- | "Elf64_Phdr" | "Elf32_Shdr" | "Elf64_Shdr" | "Elf32_Sym"
- | "Elf64_Sym" | "Elf32_Ehdr" | "Elf64_Ehdr" | "Elf32_Chdr"
- | "Elf64_Chdr" => ty.to_string(),
-
- // OSX calls this something else
- "sighandler_t" if bsdlike => "sig_t".to_string(),
-
- t if is_union => format!("union {}", t),
-
- t if t.ends_with("_t") => t.to_string(),
-
- // put `struct` in front of all structs:.
- t if is_struct => format!("struct {}", t),
-
- t => t.to_string(),
- }
- });
-
- let target2 = target.clone();
- cfg.field_name(move |struct_, field| {
- match field {
- "st_birthtime" if openbsd && struct_ == "stat" => {
- "__st_birthtime".to_string()
- }
- "st_birthtime_nsec" if openbsd && struct_ == "stat" => {
- "__st_birthtimensec".to_string()
- }
- // Our stat *_nsec fields normally don't actually exist but are part
- // of a timeval struct
- s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
- if target2.contains("android") {
- s.to_string()
- } else {
- s.replace("e_nsec", ".tv_nsec")
- }
- }
- "u64" if struct_ == "epoll_event" => "data.u64".to_string(),
- "type_"
- if (linux || freebsd)
- && (struct_ == "input_event"
- || struct_ == "input_mask"
- || struct_ == "ff_effect"
- || struct_ == "rtprio") =>
- {
- "type".to_string()
- }
- s => s.to_string(),
- }
- });
-
- cfg.skip_type(move |ty| {
- match ty {
- // sighandler_t is crazy across platforms
- "sighandler_t" => true,
-
- _ => false,
- }
- });
-
- cfg.skip_struct(move |ty| {
- match ty {
- "sockaddr_nl" => musl,
-
- // On Linux, the type of `ut_tv` field of `struct utmpx`
- // can be an anonymous struct, so an extra struct,
- // which is absent in glibc, has to be defined.
- "__timeval" if linux => true,
-
- // This is actually a union, not a struct
- "sigval" => true,
-
- // Linux kernel headers used on musl are too old to have this
- // definition. Because it's tested on other Linux targets, skip it.
- "input_mask" if musl => true,
-
- // These structs have changed since unified headers in NDK r14b.
- // `st_atime` and `st_atime_nsec` have changed sign.
- // FIXME: unskip it for next major release
- "stat" | "stat64" if android => true,
-
- // These are tested as part of the linux_fcntl tests since there are
- // header conflicts when including them with all the other structs.
- "termios2" => true,
-
- _ => false,
- }
- });
-
- cfg.skip_signededness(move |c| {
- match c {
- "LARGE_INTEGER" | "float" | "double" => true,
- n if n.starts_with("pthread") => true,
- // sem_t is a struct or pointer
- "sem_t" if openbsd || freebsd => true,
- // mqd_t is a pointer on FreeBSD
- "mqd_t" if freebsd => true,
-
- _ => false,
- }
- });
-
- cfg.skip_const(move |name| {
- match name {
- "SIG_DFL" | "SIG_ERR" | "SIG_IGN" => true, // sighandler_t weirdness
- "SIGUNUSED" => true, // removed in glibc 2.26
-
- // types on musl are defined a little differently
- n if musl && n.contains("__SIZEOF_PTHREAD") => true,
-
- // Skip constants not defined in MUSL but just passed down to the
- // kernel regardless
- "RLIMIT_NLIMITS"
- | "TCP_COOKIE_TRANSACTIONS"
- | "RLIMIT_RTTIME"
- | "MSG_COPY"
- if musl =>
- {
- true
- }
- // work around super old mips toolchain
- "SCHED_IDLE" | "SHM_NORESERVE" => mips,
-
- // weird signed extension or something like that?
- "MS_NOUSER" => true,
- "MS_RMT_MASK" => true, // updated in glibc 2.22 and musl 1.1.13
-
- // These constants were removed in FreeBSD 11 (svn r273250) but will
- // still be accepted and ignored at runtime.
- "MAP_RENAME" | "MAP_NORESERVE" if freebsd => true,
-
- // These constants were removed in FreeBSD 11 (svn r262489),
- // and they've never had any legitimate use outside of the
- // base system anyway.
- "CTL_MAXID" | "KERN_MAXID" | "HW_MAXID" | "NET_MAXID"
- | "USER_MAXID"
- if freebsd =>
- {
- true
- }
-
- // These constants were added in FreeBSD 11
- "EVFILT_PROCDESC" | "EVFILT_SENDFILE" | "EVFILT_EMPTY"
- | "PD_CLOEXEC" | "PD_ALLOWED_AT_FORK"
- if freebsd =>
- {
- true
- }
-
- // These constants were added in FreeBSD 12
- "SF_USER_READAHEAD" | "SO_REUSEPORT_LB" if freebsd => true,
-
- // These constants were removed in OpenBSD 6 (https://git.io/v7gBO
- // https://git.io/v7gBq)
- "KERN_USERMOUNT" | "KERN_ARND" if openbsd => true,
-
- // These are either unimplemented or optionally built into uClibc
- "LC_CTYPE_MASK"
- | "LC_NUMERIC_MASK"
- | "LC_TIME_MASK"
- | "LC_COLLATE_MASK"
- | "LC_MONETARY_MASK"
- | "LC_MESSAGES_MASK"
- | "MADV_MERGEABLE"
- | "MADV_UNMERGEABLE"
- | "MADV_HWPOISON"
- | "IPV6_ADD_MEMBERSHIP"
- | "IPV6_DROP_MEMBERSHIP"
- | "IPV6_MULTICAST_LOOP"
- | "IPV6_V6ONLY"
- | "MAP_STACK"
- | "RTLD_DEEPBIND"
- | "SOL_IPV6"
- | "SOL_ICMPV6"
- if uclibc =>
- {
- true
- }
-
- // Musl uses old, patched kernel headers
- "FALLOC_FL_COLLAPSE_RANGE"
- | "FALLOC_FL_ZERO_RANGE"
- | "FALLOC_FL_INSERT_RANGE"
- | "FALLOC_FL_UNSHARE_RANGE"
- | "RENAME_NOREPLACE"
- | "RENAME_EXCHANGE"
- | "RENAME_WHITEOUT"
- // ALG_SET_AEAD_* constants are available starting from kernel 3.19
- | "ALG_SET_AEAD_ASSOCLEN"
- | "ALG_SET_AEAD_AUTHSIZE"
- if musl =>
- {
- true
- }
-
- // Both android and musl use old kernel headers
- // These are constants used in getrandom syscall
- "GRND_NONBLOCK" | "GRND_RANDOM" if musl || android => true,
-
- // Defined by libattr not libc on linux (hard to test).
- // See constant definition for more details.
- "ENOATTR" if android || linux => true,
-
- // On mips*-unknown-linux-gnu* CMSPAR cannot be included with the set of headers we
- // want to use here for testing. It's originally defined in asm/termbits.h, which is
- // also included by asm/termios.h, but not the standard termios.h. There's no way to
- // include both asm/termbits.h and termios.h and there's no way to include both
- // asm/termios.h and ioctl.h (+ some other headers) because of redeclared types.
- "CMSPAR" if mips && linux && !musl => true,
-
- // On mips Linux targets, MADV_SOFT_OFFLINE is currently missing, though it's been added but CI has too old
- // of a Linux version. Since it exists on all other Linux targets, just ignore this for now and remove once
- // it's been fixed in CI.
- "MADV_SOFT_OFFLINE" if mips && linux => true,
-
- // These constants are tested in a separate test program generated below because there
- // are header conflicts if we try to include the headers that define them here.
- "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => true,
- "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW"
- | "F_SEAL_WRITE" => true,
- "QFMT_VFS_OLD" | "QFMT_VFS_V0" | "QFMT_VFS_V1"
- if mips && linux =>
- {
- true
- } // Only on MIPS
- "BOTHER" => true,
-
- "MFD_CLOEXEC" | "MFD_ALLOW_SEALING" if !mips && musl => true,
- // MFD_HUGETLB is not available in some older libc versions on the CI builders. On the
- // x86_64 and i686 builders it seems to be available for all targets, so at least test
- // it there.
- "MFD_HUGETLB"
- if !(x86_64 || i686) || musl || (x86_64 && android) =>
- {
- true
- }
-
- // These are defined for Solaris 11, but the crate is tested on
- // illumos, where they are currently not defined
- "EADI"
- | "PORT_SOURCE_POSTWAIT"
- | "PORT_SOURCE_SIGNAL"
- | "PTHREAD_STACK_MIN" => true,
-
- // These change all the time from release to release of linux
- // distros, let's just not bother trying to verify them. They
- // shouldn't be used in code anyway...
- "AF_MAX" | "PF_MAX" => true,
-
- // These are not in a glibc release yet, only in kernel headers.
- "AF_XDP"
- | "PF_XDP"
- | "SOL_XDP"
- | "IPV6_FLOWINFO"
- | "IPV6_FLOWLABEL_MGR"
- | "IPV6_FLOWINFO_SEND"
- | "IPV6_FLOWINFO_FLOWLABEL"
- | "IPV6_FLOWINFO_PRIORITY"
- if linux =>
- {
- true
- }
-
- | "IP_ORIGDSTADDR"
- | "IP_RECVORIGDSTADDR"
- | "IPV6_ORIGDSTADDR"
- | "IPV6_RECVORIGDSTADDR"
- if freebsd =>
- {
- // FreeBSD 12 required, but CI has FreeBSD 11.
- true
- }
-
- _ => false,
- }
- });
-
- cfg.skip_fn(move |name| {
- // skip those that are manually verified
- match name {
- "execv" | // crazy stuff with const/mut
- "execve" |
- "execvp" |
- "execvpe" |
- "fexecve" => true,
-
- "getrlimit" | "getrlimit64" | // non-int in 1st arg
- "setrlimit" | "setrlimit64" | // non-int in 1st arg
- "prlimit" | "prlimit64" | // non-int in 2nd arg
- "strerror_r" if linux => true, // actually xpg-something-or-other
-
- // int vs uint. Sorry musl, your prototype declarations are "correct" in the sense that
- // they match the interface defined by Linux verbatim, but they conflict with other
- // send*/recv* syscalls
- "sendmmsg" | "recvmmsg" if musl => true,
-
- // typed 2nd arg on linux and android
- "gettimeofday" if linux || android || freebsd || openbsd => true,
-
- // not declared in newer android toolchains
- "getdtablesize" if android => true,
-
- "dlerror" if android => true, // const-ness is added
- "dladdr" if musl => true, // const-ness only added recently
-
- // There seems to be a small error in EGLIBC's eventfd.h header. The
- // [underlying system call][1] always takes its first `count`
- // argument as an `unsigned int`, but [EGLIBC's <sys/eventfd.h>
- // header][2] declares it to take an `int`. [GLIBC's header][3]
- // matches the kernel.
- //
- // EGLIBC is no longer actively developed, and Debian, the largest
- // distribution that had been using it, switched back to GLIBC in
- // April 2015. So effectively all Linux <sys/eventfd.h> headers will
- // be using `unsigned int` soon.
- //
- // [1]: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/fs/eventfd.c?id=refs/tags/v3.12.51#n397
- // [2]: http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/trusty/eglibc/trusty/view/head:/sysdeps/unix/sysv/linux/sys/eventfd.h
- // [3]: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sys/eventfd.h;h=6295f32e937e779e74318eb9d3bdbe76aef8a8f3;hb=4e42b5b8f89f0e288e68be7ad70f9525aebc2cff#l34
- "eventfd" if linux => true,
-
- // The `uname` function in freebsd is now an inline wrapper that
- // delegates to another, but the symbol still exists, so don't check
- // the symbol.
- "uname" if freebsd => true,
-
- // FIXME: need to upgrade FreeBSD version; see https://github.com/rust-lang/libc/issues/938
- "setgrent" if freebsd => true,
-
- // aio_waitcomplete's return type changed between FreeBSD 10 and 11.
- "aio_waitcomplete" if freebsd => true,
-
- // lio_listio confuses the checker, probably because one of its
- // arguments is an array
- "lio_listio" if freebsd => true,
- "lio_listio" if musl => true,
-
- // Apparently the NDK doesn't have this defined on android, but
- // it's in a header file?
- "endpwent" if android => true,
-
- // These are either unimplemented or optionally built into uClibc
- // or "sysinfo", where it's defined but the structs in linux/sysinfo.h and sys/sysinfo.h
- // clash so it can't be tested
- "getxattr" | "lgetxattr" | "fgetxattr" | "setxattr" | "lsetxattr" | "fsetxattr" |
- "listxattr" | "llistxattr" | "flistxattr" | "removexattr" | "lremovexattr" |
- "fremovexattr" |
- "backtrace" |
- "sysinfo" | "newlocale" | "duplocale" | "freelocale" | "uselocale" |
- "nl_langinfo_l" | "wcslen" | "wcstombs" if uclibc => true,
-
- // Apparently res_init exists on Android, but isn't defined in a header:
- // https://mail.gnome.org/archives/commits-list/2013-May/msg01329.html
- "res_init" if android => true,
-
- // Definition of those functions as changed since unified headers from NDK r14b
- // These changes imply some API breaking changes but are still ABI compatible.
- // We can wait for the next major release to be compliant with the new API.
- // FIXME: unskip these for next major release
- "strerror_r" | "madvise" | "msync" | "mprotect" | "recvfrom" | "getpriority" |
- "setpriority" | "personality" if android => true,
- // In Android 64 bits, these functions have been fixed since unified headers.
- // Ignore these until next major version.
- "bind" | "writev" | "readv" | "sendmsg" | "recvmsg" if android && (aarch64 || x86_64) => true,
-
- // Removed in OpenBSD 6.5
- // https://marc.info/?l=openbsd-cvs&m=154723400730318
- "mincore" if openbsd => true,
-
- _ => false,
- }
- });
-
- cfg.skip_static(move |name| {
- match name {
- // Internal constant, not declared in any headers.
- "__progname" if android => true,
- _ => false,
- }
- });
-
- cfg.skip_field_type(move |struct_, field| {
- // This is a weird union, don't check the type.
- (struct_ == "ifaddrs" && field == "ifa_ifu") ||
- // sighandler_t type is super weird
- (struct_ == "sigaction" && field == "sa_sigaction") ||
- // __timeval type is a patch which doesn't exist in glibc
- (linux && struct_ == "utmpx" && field == "ut_tv") ||
- // sigval is actually a union, but we pretend it's a struct
- (struct_ == "sigevent" && field == "sigev_value") ||
- // aio_buf is "volatile void*" and Rust doesn't understand volatile
- (struct_ == "aiocb" && field == "aio_buf") ||
- // stack_t.ss_sp's type changed from FreeBSD 10 to 11 in svn r294930
- (freebsd && struct_ == "stack_t" && field == "ss_sp") ||
- // type siginfo_t.si_addr changed from OpenBSD 6.0 to 6.1
- (openbsd && struct_ == "siginfo_t" && field == "si_addr") ||
- // this one is an anonymous union
- (linux && struct_ == "ff_effect" && field == "u")
- });
-
- cfg.skip_field(move |struct_, field| {
- // this is actually a union on linux, so we can't represent it well and
- // just insert some padding.
- (struct_ == "siginfo_t" && field == "_pad") ||
- // musl names this __dummy1 but it's still there
- (musl && struct_ == "glob_t" && field == "gl_flags") ||
- // musl seems to define this as an *anonymous* bitfield
- (musl && struct_ == "statvfs" && field == "__f_unused") ||
- // sigev_notify_thread_id is actually part of a sigev_un union
- (struct_ == "sigevent" && field == "sigev_notify_thread_id") ||
- // signalfd had SIGSYS fields added in Linux 4.18, but no libc release has them yet.
- (struct_ == "signalfd_siginfo" && (field == "ssi_addr_lsb" ||
- field == "_pad2" ||
- field == "ssi_syscall" ||
- field == "ssi_call_addr" ||
- field == "ssi_arch"))
- });
-
- // FIXME: remove
- cfg.fn_cname(move |name, _cname| name.to_string());
-
- cfg.generate("../src/lib.rs", "main.rs");
-
- // On Linux or Android also generate another script for testing linux/fcntl declarations.
- // These cannot be tested normally because including both `linux/fcntl.h` and `fcntl.h`
- // fails on a lot of platforms.
- let mut cfg = ctest::TestGenerator::new();
- cfg.skip_type(|_| true)
- .skip_fn(|_| true)
- .skip_static(|_| true);
- if android || linux {
- // musl defines these directly in `fcntl.h`
- if musl {
- cfg.header("fcntl.h");
- } else {
- cfg.header("linux/fcntl.h");
- }
- if !musl {
- cfg.header("net/if.h");
- cfg.header("linux/if.h");
- }
- cfg.header("linux/quota.h");
- cfg.header("asm/termbits.h");
- cfg.skip_const(move |name| match name {
- "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => false,
- "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW"
- | "F_SEAL_WRITE" => false,
- "QFMT_VFS_OLD" | "QFMT_VFS_V0" | "QFMT_VFS_V1"
- if mips && linux =>
- {
- false
- }
- "BOTHER" => false,
- _ => true,
- });
- cfg.skip_struct(|s| s != "termios2");
- cfg.type_name(move |ty, is_struct, is_union| match ty {
- t if is_struct => format!("struct {}", t),
- t if is_union => format!("union {}", t),
- t => t.to_string(),
- });
- } else {
- cfg.skip_const(|_| true);
- cfg.skip_struct(|_| true);
+ t if t.contains("wasi") => return test_wasi(t),
+ t if t.contains("windows") => return test_windows(t),
+ t => panic!("unknown target {}", t),
}
- cfg.generate("../src/lib.rs", "linux_fcntl.rs");
}
fn main() {
@@ -1037,11 +313,9 @@ fn test_openbsd(target: &str) {
cfg.skip_fn(move |name| {
match name {
+ // FIXME: https://github.com/rust-lang/libc/issues/1272
"execv" | "execve" | "execvp" | "execvpe" => true,
- // typed 2nd arg
- "gettimeofday" => true,
-
// Removed in OpenBSD 6.5
// https://marc.info/?l=openbsd-cvs&m=154723400730318
"mincore" => true,
@@ -1065,22 +339,18 @@ fn test_openbsd(target: &str) {
}
});
- cfg.field_name(move |struct_, field| {
- match field {
- "st_birthtime" if struct_.starts_with("stat") => {
- "__st_birthtime".to_string()
- }
- "st_birthtime_nsec" if struct_.starts_with("stat") => {
- "__st_birthtimensec".to_string()
- }
- s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
- s.replace("e_nsec", ".tv_nsec")
- }
- "sa_sigaction" if struct_ == "sigaction" => {
- "sa_handler".to_string()
- }
- s => s.to_string(),
+ cfg.field_name(move |struct_, field| match field {
+ "st_birthtime" if struct_.starts_with("stat") => {
+ "__st_birthtime".to_string()
+ }
+ "st_birthtime_nsec" if struct_.starts_with("stat") => {
+ "__st_birthtimensec".to_string()
+ }
+ s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
+ s.replace("e_nsec", ".tv_nsec")
}
+ "sa_sigaction" if struct_ == "sigaction" => "sa_handler".to_string(),
+ s => s.to_string(),
});
cfg.skip_field_type(move |struct_, field| {
@@ -1189,7 +459,7 @@ fn test_windows(target: &str) {
cfg.skip_fn(move |name| {
match name {
- // FIXME: API error:
+ // FIXME: https://github.com/rust-lang/libc/issues/1272
"execv" | "execve" | "execvp" | "execvpe" => true,
_ => false,
@@ -1604,12 +874,8 @@ fn test_netbsd(target: &str) {
cfg.skip_fn(move |name| {
match name {
- // FIXME: incorrect API
- "execv" |
- "execve" |
- "execvp" |
- "execvpe" |
- "fexecve" => true,
+ // FIXME: https://github.com/rust-lang/libc/issues/1272
+ "execv" | "execve" | "execvp" => true,
"getrlimit" | "getrlimit64" | // non-int in 1st arg
"setrlimit" | "setrlimit64" | // non-int in 1st arg
@@ -1833,6 +1099,938 @@ fn test_dragonflybsd(target: &str) {
cfg.skip_fn(move |name| {
// skip those that are manually verified
match name {
+ // FIXME: https://github.com/rust-lang/libc/issues/1272
+ "execv" | "execve" | "execvp" => true,
+
+ "getrlimit" | "getrlimit64" | // non-int in 1st arg
+ "setrlimit" | "setrlimit64" | // non-int in 1st arg
+ "prlimit" | "prlimit64" // non-int in 2nd arg
+ => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_field_type(move |struct_, field| {
+ // This is a weird union, don't check the type.
+ (struct_ == "ifaddrs" && field == "ifa_ifu") ||
+ // sighandler_t type is super weird
+ (struct_ == "sigaction" && field == "sa_sigaction") ||
+ // sigval is actually a union, but we pretend it's a struct
+ (struct_ == "sigevent" && field == "sigev_value") ||
+ // aio_buf is "volatile void*" and Rust doesn't understand volatile
+ (struct_ == "aiocb" && field == "aio_buf")
+ });
+
+ cfg.skip_field(move |struct_, field| {
+ // this is actually a union on linux, so we can't represent it well and
+ // just insert some padding.
+ (struct_ == "siginfo_t" && field == "_pad") ||
+ // sigev_notify_thread_id is actually part of a sigev_un union
+ (struct_ == "sigevent" && field == "sigev_notify_thread_id")
+ });
+
+ cfg.generate("../src/lib.rs", "main.rs");
+}
+
+fn test_wasi(target: &str) {
+ assert!(target.contains("wasi"));
+
+ let mut cfg = ctest::TestGenerator::new();
+ cfg.define("_GNU_SOURCE", None);
+
+ headers! { cfg:
+ "ctype.h",
+ "dirent.h",
+ "errno.h",
+ "fcntl.h",
+ "limits.h",
+ "locale.h",
+ "malloc.h",
+ "poll.h",
+ "sched.h",
+ "stdbool.h",
+ "stddef.h",
+ "stdint.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "sys/resource.h",
+ "sys/select.h",
+ "sys/socket.h",
+ "sys/stat.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/uio.h",
+ "sys/utsname.h",
+ "time.h",
+ "unistd.h",
+ "wasi/core.h",
+ "wasi/libc.h",
+ "wasi/libc-find-relpath.h",
+ "wchar.h",
+ }
+
+ cfg.type_name(move |ty, is_struct, is_union| match ty {
+ "FILE" | "fd_set" | "DIR" => ty.to_string(),
+ t if is_union => format!("union {}", t),
+ t if t.starts_with("__wasi") && t.ends_with("_u") => {
+ format!("union {}", t)
+ }
+ t if t.starts_with("__wasi") && is_struct => format!("struct {}", t),
+ t if t.ends_with("_t") => t.to_string(),
+ t if is_struct => format!("struct {}", t),
+ t => t.to_string(),
+ });
+
+ cfg.field_name(move |_struct, field| {
+ match field {
+ // deal with fields as rust keywords
+ "type_" => "type".to_string(),
+ s => s.to_string(),
+ }
+ });
+
+ // Looks like LLD doesn't merge duplicate imports, so if the Rust
+ // code imports from a module and the C code also imports from a
+ // module we end up with two imports of function pointers which
+ // import the same thing but have different function pointers
+ cfg.skip_fn_ptrcheck(|f| f.starts_with("__wasi"));
+
+ // d_name is declared as a flexible array in WASI libc, so it
+ // doesn't support sizeof.
+ cfg.skip_field(|s, field| s == "dirent" && field == "d_name");
+
+ cfg.generate("../src/lib.rs", "main.rs");
+}
+
+fn test_android(target: &str) {
+ assert!(target.contains("android"));
+ let target_pointer_width = match target {
+ t if t.contains("aarch64") || t.contains("x86_64") => 64,
+ t if t.contains("i686") || t.contains("arm") => 32,
+ t => panic!("unsupported target: {}", t),
+ };
+ let x86 = target.contains("i686") || target.contains("x86_64");
+
+ let mut cfg = ctest::TestGenerator::new();
+ cfg.define("_GNU_SOURCE", None);
+
+ headers! { cfg:
+ "arpa/inet.h",
+ "asm/mman.h",
+ "ctype.h",
+ "dirent.h",
+ "dlfcn.h",
+ "errno.h",
+ "fcntl.h",
+ "grp.h",
+ "ifaddrs.h",
+ "limits.h",
+ "linux/dccp.h",
+ "linux/futex.h",
+ "linux/fs.h",
+ "linux/genetlink.h",
+ "linux/if_alg.h",
+ "linux/if_ether.h",
+ "linux/if_tun.h",
+ "linux/magic.h",
+ "linux/memfd.h",
+ "linux/module.h",
+ "linux/net_tstamp.h",
+ "linux/netfilter/nf_tables.h",
+ "linux/netfilter_ipv4.h",
+ "linux/netfilter_ipv6.h",
+ "linux/netlink.h",
+ "linux/quota.h",
+ "linux/reboot.h",
+ "linux/seccomp.h",
+ "linux/sockios.h",
+ "locale.h",
+ "malloc.h",
+ "net/ethernet.h",
+ "net/if.h",
+ "net/if_arp.h",
+ "net/route.h",
+ "netdb.h",
+ "netinet/in.h",
+ "netinet/ip.h",
+ "netinet/tcp.h",
+ "netinet/udp.h",
+ "netpacket/packet.h",
+ "poll.h",
+ "pthread.h",
+ "pty.h",
+ "pwd.h",
+ "resolv.h",
+ "sched.h",
+ "semaphore.h",
+ "signal.h",
+ "stddef.h",
+ "stdint.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "sys/epoll.h",
+ "sys/eventfd.h",
+ "sys/file.h",
+ "sys/fsuid.h",
+ "sys/inotify.h",
+ "sys/ioctl.h",
+ "sys/mman.h",
+ "sys/mount.h",
+ "sys/personality.h",
+ "sys/prctl.h",
+ "sys/ptrace.h",
+ "sys/random.h",
+ "sys/reboot.h",
+ "sys/resource.h",
+ "sys/sendfile.h",
+ "sys/signalfd.h",
+ "sys/socket.h",
+ "sys/stat.h",
+ "sys/statvfs.h",
+ "sys/swap.h",
+ "sys/syscall.h",
+ "sys/sysinfo.h",
+ "sys/time.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/uio.h",
+ "sys/un.h",
+ "sys/utsname.h",
+ "sys/vfs.h",
+ "sys/xattr.h",
+ "sys/wait.h",
+ "syslog.h",
+ "termios.h",
+ "time.h",
+ "unistd.h",
+ "utime.h",
+ "utmp.h",
+ "wchar.h",
+ "xlocale.h",
+ }
+
+ if target_pointer_width == 32 {
+ // time64_t is not defined for 64-bit targets If included it will
+ // generate the error 'Your time_t is already 64-bit'
+ cfg.header("time64.h");
+ }
+
+ if x86 {
+ cfg.header("sys/reg.h");
+ }
+
+ cfg.type_name(move |ty, is_struct, is_union| {
+ match ty {
+ // Just pass all these through, no need for a "struct" prefix
+ "FILE" | "fd_set" | "Dl_info" => ty.to_string(),
+
+ t if is_union => format!("union {}", t),
+
+ t if t.ends_with("_t") => t.to_string(),
+
+ // sigval is a struct in Rust, but a union in C:
+ "sigval" => format!("union sigval"),
+
+ // put `struct` in front of all structs:.
+ t if is_struct => format!("struct {}", t),
+
+ t => t.to_string(),
+ }
+ });
+
+ cfg.field_name(move |struct_, field| {
+ match field {
+ // Our stat *_nsec fields normally don't actually exist but are part
+ // of a timeval struct
+ s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
+ s.to_string()
+ }
+ // FIXME: appears that `epoll_event.data` is an union
+ "u64" if struct_ == "epoll_event" => "data.u64".to_string(),
+ s => s.to_string(),
+ }
+ });
+
+ cfg.skip_type(move |ty| {
+ match ty {
+ // FIXME: `sighandler_t` type is incorrect, see:
+ // https://github.com/rust-lang/libc/issues/1359
+ "sighandler_t" => true,
+ _ => false,
+ }
+ });
+
+ cfg.skip_struct(move |ty| {
+ match ty {
+ // These are tested as part of the linux_fcntl tests since there are
+ // header conflicts when including them with all the other structs.
+ "termios2" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_const(move |name| {
+ match name {
+ // FIXME: deprecated: not available in any header
+ // See: https://github.com/rust-lang/libc/issues/1356
+ "ENOATTR" => true,
+
+ // FIXME: still necessary?
+ "SIG_DFL" | "SIG_ERR" | "SIG_IGN" => true, // sighandler_t weirdness
+ // FIXME: still necessary?
+ "SIGUNUSED" => true, // removed in glibc 2.26
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_fn(move |name| {
+ // skip those that are manually verified
+ match name {
+ // FIXME: https://github.com/rust-lang/libc/issues/1272
+ "execv" | "execve" | "execvp" | "execvpe" | "fexecve" => true,
+
+ // There are two versions of the sterror_r function, see
+ //
+ // https://linux.die.net/man/3/strerror_r
+ //
+ // An XSI-compliant version provided if:
+ //
+ // (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE
+ //
+ // and a GNU specific version provided if _GNU_SOURCE is defined.
+ //
+ // libc provides bindings for the XSI-compliant version, which is
+ // preferred for portable applications.
+ //
+ // We skip the test here since here _GNU_SOURCE is defined, and
+ // test the XSI version below.
+ "strerror_r" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_field_type(move |struct_, field| {
+ // This is a weird union, don't check the type.
+ (struct_ == "ifaddrs" && field == "ifa_ifu") ||
+ // sigval is actually a union, but we pretend it's a struct
+ (struct_ == "sigevent" && field == "sigev_value")
+ });
+
+ cfg.skip_field(move |struct_, field| {
+ // this is actually a union on linux, so we can't represent it well and
+ // just insert some padding.
+ (struct_ == "siginfo_t" && field == "_pad") ||
+ // FIXME: `sa_sigaction` has type `sighandler_t` but that type is
+ // incorrect, see: https://github.com/rust-lang/libc/issues/1359
+ (struct_ == "sigaction" && field == "sa_sigaction") ||
+ // sigev_notify_thread_id is actually part of a sigev_un union
+ (struct_ == "sigevent" && field == "sigev_notify_thread_id") ||
+ // signalfd had SIGSYS fields added in Android 4.19, but CI does not have that version yet.
+ (struct_ == "signalfd_siginfo" && (field == "ssi_syscall" ||
+ field == "ssi_call_addr" ||
+ field == "ssi_arch"))
+ });
+
+ cfg.generate("../src/lib.rs", "main.rs");
+
+ // On Android also generate another script for testing linux/fcntl
+ // declarations. These cannot be tested normally because including both
+ // `linux/fcntl.h` and `fcntl.h` fails.
+ //
+ // This also tests strerror_r.
+ test_linux_termios2(target);
+}
+
+fn test_freebsd(target: &str) {
+ assert!(target.contains("freebsd"));
+ let x86 = target.contains("i686") || target.contains("x86_64");
+
+ let mut cfg = ctest::TestGenerator::new();
+ // Required for `getline`:
+ cfg.define("_WITH_GETLINE", None);
+
+ headers! { cfg:
+ "aio.h",
+ "arpa/inet.h",
+ "ctype.h",
+ "dirent.h",
+ "dlfcn.h",
+ "errno.h",
+ "fcntl.h",
+ "glob.h",
+ "grp.h",
+ "ifaddrs.h",
+ "langinfo.h",
+ "libutil.h",
+ "limits.h",
+ "locale.h",
+ "mqueue.h",
+ "net/bpf.h",
+ "net/if.h",
+ "net/if_arp.h",
+ "net/if_dl.h",
+ "net/route.h",
+ "netdb.h",
+ "netinet/ip.h",
+ "netinet/in.h",
+ "netinet/tcp.h",
+ "netinet/udp.h",
+ "poll.h",
+ "pthread.h",
+ "pthread_np.h",
+ "pwd.h",
+ "resolv.h",
+ "sched.h",
+ "semaphore.h",
+ "signal.h",
+ "spawn.h",
+ "stddef.h",
+ "stdint.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "sys/event.h",
+ "sys/extattr.h",
+ "sys/file.h",
+ "sys/ioctl.h",
+ "sys/ipc.h",
+ "sys/jail.h",
+ "sys/mman.h",
+ "sys/mount.h",
+ "sys/msg.h",
+ "sys/procdesc.h",
+ "sys/ptrace.h",
+ "sys/resource.h",
+ "sys/rtprio.h",
+ "sys/shm.h",
+ "sys/socket.h",
+ "sys/stat.h",
+ "sys/statvfs.h",
+ "sys/sysctl.h",
+ "sys/time.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/uio.h",
+ "sys/un.h",
+ "sys/utsname.h",
+ "sys/wait.h",
+ "syslog.h",
+ "termios.h",
+ "time.h",
+ "ufs/ufs/quota.h",
+ "unistd.h",
+ "utime.h",
+ "utmpx.h",
+ "wchar.h",
+ }
+
+ cfg.type_name(move |ty, is_struct, is_union| {
+ match ty {
+ // Just pass all these through, no need for a "struct" prefix
+ // FIXME: still required?
+ "FILE" | "fd_set" | "Dl_info" | "DIR" | "Elf32_Phdr"
+ | "Elf64_Phdr" | "Elf32_Shdr" | "Elf64_Shdr" | "Elf32_Sym"
+ | "Elf64_Sym" | "Elf32_Ehdr" | "Elf64_Ehdr" | "Elf32_Chdr"
+ | "Elf64_Chdr" => ty.to_string(),
+
+ // FIXME: still required?
+ "sighandler_t" => "sig_t".to_string(),
+
+ t if is_union => format!("union {}", t),
+
+ t if t.ends_with("_t") => t.to_string(),
+
+ // put `struct` in front of all structs:.
+ t if is_struct => format!("struct {}", t),
+
+ t => t.to_string(),
+ }
+ });
+
+ cfg.field_name(move |struct_, field| {
+ match field {
+ // Our stat *_nsec fields normally don't actually exist but are part
+ // of a timeval struct
+ s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
+ s.replace("e_nsec", ".tv_nsec")
+ }
+ // FIXME: still required?
+ "u64" if struct_ == "epoll_event" => "data.u64".to_string(),
+ // FIXME: still required?
+ "type_"
+ if struct_ == "input_event"
+ || struct_ == "input_mask"
+ || struct_ == "ff_effect"
+ || struct_ == "rtprio" =>
+ {
+ "type".to_string()
+ }
+ s => s.to_string(),
+ }
+ });
+
+ cfg.skip_type(move |ty| {
+ match ty {
+ // sighandler_t is crazy across platforms
+ // FIXME: still required?
+ "sighandler_t" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_struct(move |ty| {
+ match ty {
+ // This is actually a union, not a struct
+ // FIXME: still required?
+ "sigval" => true,
+
+ // These are tested as part of the linux_fcntl tests since there are
+ // header conflicts when including them with all the other structs.
+ // FIXME: still required?
+ "termios2" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_signededness(move |c| {
+ match c {
+ // FIXME: still required?
+ "LARGE_INTEGER" | "float" | "double" => true,
+ // FIXME: still required?
+ n if n.starts_with("pthread") => true,
+ // sem_t is a struct or pointer
+ // FIXME: still required?
+ "sem_t" => true,
+ // mqd_t is a pointer on FreeBSD
+ // FIXME: still required?
+ "mqd_t" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_const(move |name| {
+ match name {
+ // FIXME: still required?
+ "SIG_DFL" | "SIG_ERR" | "SIG_IGN" => true, // sighandler_t weirdness
+ // FIXME: still required?
+ "SIGUNUSED" => true, // removed in glibc 2.26
+
+ // weird signed extension or something like that?
+ // FIXME: still required?
+ "MS_NOUSER" => true,
+ // FIXME: still required?
+ "MS_RMT_MASK" => true, // updated in glibc 2.22 and musl 1.1.13
+
+ // These constants were removed in FreeBSD 11 (svn r273250) but will
+ // still be accepted and ignored at runtime.
+ "MAP_RENAME" | "MAP_NORESERVE" => true,
+
+ // These constants were removed in FreeBSD 11 (svn r262489),
+ // and they've never had any legitimate use outside of the
+ // base system anyway.
+ "CTL_MAXID" | "KERN_MAXID" | "HW_MAXID" | "NET_MAXID"
+ | "USER_MAXID" => true,
+
+ // These constants were added in FreeBSD 11
+ // FIXME: still required?
+ "EVFILT_PROCDESC" | "EVFILT_SENDFILE" | "EVFILT_EMPTY"
+ | "PD_CLOEXEC" | "PD_ALLOWED_AT_FORK" => true,
+
+ // These constants were added in FreeBSD 12
+ // FIXME: still required?
+ "SF_USER_READAHEAD" | "SO_REUSEPORT_LB" => true,
+
+ // These constants are tested in a separate test program generated
+ // below because there are header conflicts if we try to include the
+ // headers that define them here.
+ // FIXME: still required?
+ "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => true,
+ // FIXME: still required?
+ "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW"
+ | "F_SEAL_WRITE" => true,
+ // FIXME: still required?
+ "BOTHER" => true,
+
+ // MFD_HUGETLB is not available in some older libc versions on the
+ // CI builders. On the x86_64 and i686 builders it seems to be
+ // available for all targets, so at least test it there.
+ // FIXME: still required?
+ "MFD_HUGETLB" if !x86 => true,
+
+ // These change all the time from release to release of linux
+ // distros, let's just not bother trying to verify them. They
+ // shouldn't be used in code anyway...
+ // FIXME: still required?
+ "AF_MAX" | "PF_MAX" => true,
+
+ // FreeBSD 12 required, but CI has FreeBSD 11.
+ // FIXME: still required?
+ "IP_ORIGDSTADDR"
+ | "IP_RECVORIGDSTADDR"
+ | "IPV6_ORIGDSTADDR"
+ | "IPV6_RECVORIGDSTADDR" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_fn(move |name| {
+ // skip those that are manually verified
+ match name {
+ // FIXME: still required?
+ "execv" | // crazy stuff with const/mut
+ "execve" |
+ "execvp" |
+ "execvpe" |
+ "fexecve" => true,
+
+ // The `uname` function in freebsd is now an inline wrapper that
+ // delegates to another, but the symbol still exists, so don't check
+ // the symbol.
+ // FIXME: still required?
+ "uname" => true,
+
+ // FIXME: need to upgrade FreeBSD version; see https://github.com/rust-lang/libc/issues/938
+ // FIXME: still required?
+ "setgrent" => true,
+
+ // aio_waitcomplete's return type changed between FreeBSD 10 and 11.
+ // FIXME: still required?
+ "aio_waitcomplete" => true,
+
+ // lio_listio confuses the checker, probably because one of its
+ // arguments is an array
+ // FIXME: still required?
+ "lio_listio" => true,
+
+ // Definition of those functions as changed since unified headers from NDK r14b
+ // These changes imply some API breaking changes but are still ABI compatible.
+ // We can wait for the next major release to be compliant with the new API.
+ // FIXME: unskip these for next major release
+ // FIXME: still required ?
+ "strerror_r" | "madvise" | "msync" | "mprotect" | "recvfrom" | "getpriority" |
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_field_type(move |struct_, field| {
+ // This is a weird union, don't check the type.
+ // FIXME: still required?
+ (struct_ == "ifaddrs" && field == "ifa_ifu") ||
+ // FIXME: still required?
+ // sighandler_t type is super weird
+ (struct_ == "sigaction" && field == "sa_sigaction") ||
+ // FIXME: still required?
+ // sigval is actually a union, but we pretend it's a struct
+ (struct_ == "sigevent" && field == "sigev_value") ||
+ // aio_buf is "volatile void*" and Rust doesn't understand volatile
+ // FIXME: still required?
+ (struct_ == "aiocb" && field == "aio_buf") ||
+ // stack_t.ss_sp's type changed from FreeBSD 10 to 11 in svn r294930
+ // FIXME: still required?
+ (struct_ == "stack_t" && field == "ss_sp")
+ });
+
+ cfg.skip_field(move |struct_, field| {
+ // this is actually a union on linux, so we can't represent it well and
+ // just insert some padding.
+ // FIXME: still required?
+ (struct_ == "siginfo_t" && field == "_pad") ||
+ // sigev_notify_thread_id is actually part of a sigev_un union
+ // FIXME: still required?
+ (struct_ == "sigevent" && field == "sigev_notify_thread_id") ||
+ // signalfd had SIGSYS fields added in Linux 4.18, but no libc release has them yet.
+ // FIXME: still required?
+ (struct_ == "signalfd_siginfo" && (field == "ssi_addr_lsb" ||
+ field == "_pad2" ||
+ field == "ssi_syscall" ||
+ field == "ssi_call_addr" ||
+ field == "ssi_arch"))
+ });
+
+ // FIXME: remove
+ cfg.fn_cname(move |name, _cname| name.to_string());
+
+ cfg.generate("../src/lib.rs", "main.rs");
+}
+
+fn test_emscripten(target: &str) {
+ assert!(target.contains("emscripten"));
+
+ let mut cfg = ctest::TestGenerator::new();
+ // FIXME: still necessary?
+ cfg.define("_GNU_SOURCE", None);
+
+ // FIXME: still necessary?
+ cfg.flag("-Wno-deprecated-declarations");
+
+ headers! { cfg:
+ "aio.h",
+ "ctype.h",
+ "dirent.h",
+ "dlfcn.h",
+ "errno.h",
+ "fcntl.h",
+ "glob.h",
+ "grp.h",
+ "ifaddrs.h",
+ "langinfo.h",
+ "limits.h",
+ "locale.h",
+ "malloc.h",
+ "mntent.h",
+ "mqueue.h",
+ "net/ethernet.h",
+ "net/if.h",
+ "net/if_arp.h",
+ "net/route.h",
+ "netdb.h",
+ "netinet/in.h",
+ "netinet/ip.h",
+ "netinet/tcp.h",
+ "netinet/udp.h",
+ "netpacket/packet.h",
+ "poll.h",
+ "pthread.h",
+ "pty.h",
+ "pwd.h",
+ "resolv.h",
+ "sched.h",
+ "sched.h",
+ "semaphore.h",
+ "shadow.h",
+ "signal.h",
+ "stddef.h",
+ "stdint.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "sys/epoll.h",
+ "sys/eventfd.h",
+ "sys/file.h",
+ "sys/ioctl.h",
+ "sys/ipc.h",
+ "sys/mman.h",
+ "sys/mount.h",
+ "sys/msg.h",
+ "sys/personality.h",
+ "sys/prctl.h",
+ "sys/ptrace.h",
+ "sys/quota.h",
+ "sys/reboot.h",
+ "sys/resource.h",
+ "sys/sem.h",
+ "sys/sendfile.h",
+ "sys/shm.h",
+ "sys/signalfd.h",
+ "sys/socket.h",
+ "sys/stat.h",
+ "sys/statvfs.h",
+ "sys/swap.h",
+ "sys/syscall.h",
+ "sys/sysctl.h",
+ "sys/sysinfo.h",
+ "sys/time.h",
+ "sys/timerfd.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/uio.h",
+ "sys/un.h",
+ "sys/user.h",
+ "sys/utsname.h",
+ "sys/vfs.h",
+ "sys/wait.h",
+ "sys/xattr.h",
+ "syslog.h",
+ "termios.h",
+ "time.h",
+ "ucontext.h",
+ "unistd.h",
+ "utime.h",
+ "utmp.h",
+ "utmpx.h",
+ "wchar.h",
+ }
+
+ cfg.type_name(move |ty, is_struct, is_union| {
+ match ty {
+ // Just pass all these through, no need for a "struct" prefix
+ // FIXME: is this necessary?
+ "FILE" | "fd_set" | "Dl_info" | "DIR" | "Elf32_Phdr"
+ | "Elf64_Phdr" | "Elf32_Shdr" | "Elf64_Shdr" | "Elf32_Sym"
+ | "Elf64_Sym" | "Elf32_Ehdr" | "Elf64_Ehdr" | "Elf32_Chdr"
+ | "Elf64_Chdr" => ty.to_string(),
+
+ t if is_union => format!("union {}", t),
+
+ t if t.ends_with("_t") => t.to_string(),
+
+ // put `struct` in front of all structs:.
+ t if is_struct => format!("struct {}", t),
+
+ t => t.to_string(),
+ }
+ });
+
+ cfg.field_name(move |struct_, field| {
+ match field {
+ // Our stat *_nsec fields normally don't actually exist but are part
+ // of a timeval struct
+ s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
+ s.replace("e_nsec", ".tv_nsec")
+ }
+ // FIXME: is this necessary?
+ "u64" if struct_ == "epoll_event" => "data.u64".to_string(),
+ s => s.to_string(),
+ }
+ });
+
+ cfg.skip_type(move |ty| {
+ match ty {
+ // sighandler_t is crazy across platforms
+ // FIXME: is this necessary?
+ "sighandler_t" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_struct(move |ty| {
+ match ty {
+ // FIXME: is this necessary?
+ "sockaddr_nl" => true,
+
+ // This is actually a union, not a struct
+ // FIXME: is this necessary?
+ "sigval" => true,
+
+ // Linux kernel headers used on musl are too old to have this
+ // definition. Because it's tested on other Linux targets, skip it.
+ // FIXME: is this necessary?
+ "input_mask" => true,
+
+ // These are tested as part of the linux_fcntl tests since there are
+ // header conflicts when including them with all the other structs.
+ // FIXME: is this necessary?
+ "termios2" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_signededness(move |c| match c {
+ // FIXME: is this necessary?
+ "LARGE_INTEGER" | "float" | "double" => true,
+ // FIXME: is this necessary?
+ n if n.starts_with("pthread") => true,
+ _ => false,
+ });
+
+ cfg.skip_const(move |name| {
+ match name {
+ // FIXME: is this necessary?
+ "SIG_DFL" | "SIG_ERR" | "SIG_IGN" => true, // sighandler_t weirdness
+ // FIXME: is this necessary?
+ "SIGUNUSED" => true, // removed in glibc 2.26
+
+ // types on musl are defined a little differently
+ // FIXME: is this necessary?
+ n if n.contains("__SIZEOF_PTHREAD") => true,
+
+ // Skip constants not defined in MUSL but just passed down to the
+ // kernel regardless
+ // FIXME: is this necessary?
+ "RLIMIT_NLIMITS"
+ | "TCP_COOKIE_TRANSACTIONS"
+ | "RLIMIT_RTTIME"
+ | "MSG_COPY"
+ =>
+ {
+ true
+ }
+
+ // weird signed extension or something like that?
+ // FIXME: is this necessary?
+ "MS_NOUSER" => true,
+ // FIXME: is this necessary?
+ "MS_RMT_MASK" => true, // updated in glibc 2.22 and musl 1.1.13
+
+ // Musl uses old, patched kernel headers
+ // FIXME: is this necessary?
+ "FALLOC_FL_COLLAPSE_RANGE"
+ | "FALLOC_FL_ZERO_RANGE"
+ | "FALLOC_FL_INSERT_RANGE"
+ | "FALLOC_FL_UNSHARE_RANGE"
+ | "RENAME_NOREPLACE"
+ | "RENAME_EXCHANGE"
+ | "RENAME_WHITEOUT"
+ // ALG_SET_AEAD_* constants are available starting from kernel 3.19
+ | "ALG_SET_AEAD_ASSOCLEN"
+ | "ALG_SET_AEAD_AUTHSIZE"
+ =>
+ {
+ true
+ }
+
+ // musl uses old kernel headers
+ // These are constants used in getrandom syscall
+ // FIXME: is this necessary?
+ "GRND_NONBLOCK" | "GRND_RANDOM" => true,
+
+
+ // These constants are tested in a separate test program generated below because there
+ // are header conflicts if we try to include the headers that define them here.
+ // FIXME: is this necessary?
+ "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => true,
+ // FIXME: is this necessary?
+ "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW"
+ | "F_SEAL_WRITE" => true,
+ // FIXME: is this necessary?
+ "BOTHER" => true,
+
+ // FIXME: is this necessary?
+ "MFD_CLOEXEC" | "MFD_ALLOW_SEALING" => true,
+ // MFD_HUGETLB is not available in some older libc versions on the CI builders. On the
+ // x86_64 and i686 builders it seems to be available for all targets, so at least test
+ // it there.
+ // FIXME: is this necessary?
+ "MFD_HUGETLB" =>
+ {
+ true
+ }
+
+ // These are defined for Solaris 11, but the crate is tested on
+ // illumos, where they are currently not defined
+ // FIXME: is this necessary?
+ "EADI"
+ | "PORT_SOURCE_POSTWAIT"
+ | "PORT_SOURCE_SIGNAL"
+ | "PTHREAD_STACK_MIN" => true,
+
+ // These change all the time from release to release of linux
+ // distros, let's just not bother trying to verify them. They
+ // shouldn't be used in code anyway...
+ // FIXME: is this necessary?
+ "AF_MAX" | "PF_MAX" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_fn(move |name| {
+ // skip those that are manually verified
+ match name {
+ // FIXME: is this necessary?
"execv" | // crazy stuff with const/mut
"execve" |
"execvp" |
@@ -1842,8 +2040,24 @@ fn test_dragonflybsd(target: &str) {
"getrlimit" | "getrlimit64" | // non-int in 1st arg
"setrlimit" | "setrlimit64" | // non-int in 1st arg
"prlimit" | "prlimit64" | // non-int in 2nd arg
- // typed 2nd arg on linux and android
- "gettimeofday" => true,
+
+ // int vs uint. Sorry musl, your prototype declarations are "correct" in the sense that
+ // they match the interface defined by Linux verbatim, but they conflict with other
+ // send*/recv* syscalls
+ // FIXME: is this necessary?
+ "sendmmsg" | "recvmmsg" => true,
+
+ // FIXME: is this necessary?
+ "dladdr" => true, // const-ness only added recently
+
+ // FIXME: is this necessary?
+ "lio_listio" => true,
+
+ // Definition of those functions as changed since unified headers from NDK r14b
+ // These changes imply some API breaking changes but are still ABI compatible.
+ // We can wait for the next major release to be compliant with the new API.
+ // FIXME: unskip these for next major release
+ "strerror_r" | "madvise" | "msync" | "mprotect" | "recvfrom" | "getpriority" |
_ => false,
}
@@ -1851,22 +2065,664 @@ fn test_dragonflybsd(target: &str) {
cfg.skip_field_type(move |struct_, field| {
// This is a weird union, don't check the type.
+ // FIXME: is this necessary?
(struct_ == "ifaddrs" && field == "ifa_ifu") ||
// sighandler_t type is super weird
+ // FIXME: is this necessary?
(struct_ == "sigaction" && field == "sa_sigaction") ||
// sigval is actually a union, but we pretend it's a struct
+ // FIXME: is this necessary?
(struct_ == "sigevent" && field == "sigev_value") ||
// aio_buf is "volatile void*" and Rust doesn't understand volatile
+ // FIXME: is this necessary?
(struct_ == "aiocb" && field == "aio_buf")
});
cfg.skip_field(move |struct_, field| {
// this is actually a union on linux, so we can't represent it well and
// just insert some padding.
+ // FIXME: is this necessary?
(struct_ == "siginfo_t" && field == "_pad") ||
+ // musl names this __dummy1 but it's still there
+ // FIXME: is this necessary?
+ (struct_ == "glob_t" && field == "gl_flags") ||
+ // musl seems to define this as an *anonymous* bitfield
+ // FIXME: is this necessary?
+ (struct_ == "statvfs" && field == "__f_unused") ||
// sigev_notify_thread_id is actually part of a sigev_un union
- (struct_ == "sigevent" && field == "sigev_notify_thread_id")
+ (struct_ == "sigevent" && field == "sigev_notify_thread_id") ||
+ // signalfd had SIGSYS fields added in Linux 4.18, but no libc release has them yet.
+ (struct_ == "signalfd_siginfo" && (field == "ssi_addr_lsb" ||
+ field == "_pad2" ||
+ field == "ssi_syscall" ||
+ field == "ssi_call_addr" ||
+ field == "ssi_arch"))
+ });
+
+ // FIXME: remove
+ cfg.fn_cname(move |name, _cname| name.to_string());
+
+ cfg.generate("../src/lib.rs", "main.rs");
+}
+
+fn test_linux(target: &str) {
+ assert!(target.contains("linux"));
+
+ // target_env
+ let gnu = target.contains("gnu");
+ let musl = target.contains("musl");
+ let uclibc = target.contains("uclibc");
+
+ match (gnu, musl, uclibc) {
+ (true, false, false) => (),
+ (false, true, false) => (),
+ (false, false, true) => (),
+ (_, _, _) => panic!(
+ "linux target lib is gnu: {}, musl: {}, uclibc: {}",
+ gnu, musl, uclibc
+ ),
+ }
+
+ let mips = target.contains("mips");
+ let i686 = target.contains("i686");
+ let x86_64 = target.contains("x86_64");
+ let x32 = target.ends_with("gnux32");
+
+ let mut cfg = ctest::TestGenerator::new();
+ // FIXME: still necessary?
+ cfg.define("_GNU_SOURCE", None);
+ // This macro re-deifnes fscanf,scanf,sscanf to link to the symbols that are
+ // deprecated since glibc >= 2.29. This allows Rust binaries to link against
+ // glibc versions older than 2.29.
+ cfg.define("__GLIBC_USE_DEPRECATED_SCANF", None);
+
+ // FIXME: still necessary?
+ cfg.flag("-Wno-deprecated-declarations");
+
+ headers! { cfg:
+ "ctype.h",
+ "dirent.h",
+ "dlfcn.h",
+ "elf.h",
+ "fcntl.h",
+ "glob.h",
+ "grp.h",
+ "ifaddrs.h",
+ "langinfo.h",
+ "limits.h",
+ "link.h",
+ "locale.h",
+ "malloc.h",
+ "mntent.h",
+ "mqueue.h",
+ "net/ethernet.h",
+ "net/if.h",
+ "net/if_arp.h",
+ "net/route.h",
+ "netdb.h",
+ "netinet/in.h",
+ "netinet/ip.h",
+ "netinet/tcp.h",
+ "netinet/udp.h",
+ "netpacket/packet.h",
+ "poll.h",
+ "pthread.h",
+ "pty.h",
+ "pwd.h",
+ "resolv.h",
+ "sched.h",
+ "semaphore.h",
+ "shadow.h",
+ "signal.h",
+ "spawn.h",
+ "stddef.h",
+ "stdint.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "sys/epoll.h",
+ "sys/eventfd.h",
+ "sys/file.h",
+ "sys/fsuid.h",
+ "sys/inotify.h",
+ "sys/ioctl.h",
+ "sys/ipc.h",
+ "sys/mman.h",
+ "sys/mount.h",
+ "sys/msg.h",
+ "sys/personality.h",
+ "sys/prctl.h",
+ "sys/ptrace.h",
+ "sys/quota.h",
+ "sys/reboot.h",
+ "sys/resource.h",
+ "sys/sem.h",
+ "sys/sendfile.h",
+ "sys/shm.h",
+ "sys/signalfd.h",
+ "sys/socket.h",
+ "sys/stat.h",
+ "sys/statvfs.h",
+ "sys/swap.h",
+ "sys/syscall.h",
+ "sys/time.h",
+ "sys/timerfd.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/uio.h",
+ "sys/un.h",
+ "sys/user.h",
+ "sys/utsname.h",
+ "sys/vfs.h",
+ "sys/wait.h",
+ "syslog.h",
+ "termios.h",
+ "time.h",
+ "ucontext.h",
+ "unistd.h",
+ "utime.h",
+ "utmp.h",
+ "wchar.h",
+ "errno.h",
+ }
+
+ // Include linux headers at the end:
+ headers! {
+ cfg:
+ "linux/falloc.h",
+ "linux/futex.h",
+ "linux/fs.h",
+ "linux/genetlink.h",
+ "linux/if_addr.h",
+ "linux/if_alg.h",
+ "linux/if_ether.h",
+ "linux/if_tun.h",
+ "linux/input.h",
+ "linux/module.h",
+ "linux/net_tstamp.h",
+ "linux/netfilter_ipv4.h",
+ "linux/netfilter_ipv6.h",
+ "linux/netlink.h",
+ "linux/random.h",
+ "linux/rtnetlink.h",
+ "linux/seccomp.h",
+ "linux/sockios.h",
+ }
+
+ if x86_64 {
+ headers! { cfg: "sys/io.h" };
+ }
+ if i686 || x86_64 {
+ headers! { cfg: "sys/reg.h" };
+ }
+
+ if !musl {
+ assert!(uclibc || gnu);
+ headers! { cfg:
+ "asm/mman.h",
+ "linux/if.h",
+ "linux/magic.h",
+ "linux/netfilter/nf_tables.h",
+ "linux/reboot.h",
+ "sys/auxv.h",
+ };
+
+ if !x32 {
+ assert!((gnu || uclibc) && !x32);
+ headers! { cfg: "sys/sysctl.h", }
+ }
+ if !uclibc {
+ assert!(gnu);
+ headers! { cfg:
+ "execinfo.h",
+ "utmpx.h",
+ }
+ }
+ if !mips {
+ assert!((gnu || uclibc) && !mips);
+ headers! { cfg: "linux/quota.h" };
+ }
+ }
+
+ // DCCP support
+ if !uclibc && !musl {
+ assert!(gnu);
+ headers! { cfg: "linux/dccp.h" };
+ }
+
+ if !musl || mips {
+ assert!(gnu || uclibc || (mips && musl));
+ headers! { cfg: "linux/memfd.h" };
+ }
+
+ // note: aio.h must be included before sys/mount.h
+ if !uclibc {
+ assert!(gnu || musl);
+ // optionally included in uclibc
+ headers! { cfg:
+ "sys/xattr.h",
+ "sys/sysinfo.h",
+ "aio.h",
+ }
+ }
+
+ cfg.type_name(move |ty, is_struct, is_union| {
+ match ty {
+ // Just pass all these through, no need for a "struct" prefix
+ "FILE" | "fd_set" | "Dl_info" | "DIR" | "Elf32_Phdr"
+ | "Elf64_Phdr" | "Elf32_Shdr" | "Elf64_Shdr" | "Elf32_Sym"
+ | "Elf64_Sym" | "Elf32_Ehdr" | "Elf64_Ehdr" | "Elf32_Chdr"
+ | "Elf64_Chdr" => ty.to_string(),
+
+ t if is_union => format!("union {}", t),
+
+ t if t.ends_with("_t") => t.to_string(),
+
+ // put `struct` in front of all structs:.
+ t if is_struct => format!("struct {}", t),
+
+ t => t.to_string(),
+ }
+ });
+
+ cfg.field_name(move |struct_, field| {
+ match field {
+ // Our stat *_nsec fields normally don't actually exist but are part
+ // of a timeval struct
+ s if s.ends_with("_nsec") && struct_.starts_with("stat") => {
+ s.replace("e_nsec", ".tv_nsec")
+ }
+ // FIXME: is this necessary?
+ "u64" if struct_ == "epoll_event" => "data.u64".to_string(),
+ // FIXME: is this necessary?
+ "type_"
+ if struct_ == "input_event"
+ || struct_ == "input_mask"
+ || struct_ == "ff_effect"
+ || struct_ == "rtprio" =>
+ {
+ "type".to_string()
+ }
+ s => s.to_string(),
+ }
+ });
+
+ cfg.skip_type(move |ty| {
+ match ty {
+ // sighandler_t is crazy across platforms
+ // FIXME: is this necessary?
+ "sighandler_t" => true,
+
+ // These cannot be tested when "resolv.h" is included and are tested
+ // below.
+ "Elf64_Phdr" | "Elf32_Phdr" => true,
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_struct(move |ty| {
+ match ty {
+ // FIXME: is this necessary?
+ "sockaddr_nl" if musl => true,
+
+ // These cannot be tested when "resolv.h" is included and are tested
+ // below.
+ "Elf64_Phdr" | "Elf32_Phdr" => true,
+
+ // On Linux, the type of `ut_tv` field of `struct utmpx`
+ // can be an anonymous struct, so an extra struct,
+ // which is absent in glibc, has to be defined.
+ "__timeval" => true,
+
+ // This is actually a union, not a struct
+ "sigval" => true,
+
+ // Linux kernel headers used on musl are too old to have this
+ // definition. Because it's tested on other Linux targets, skip it.
+ // FIXME: is this necessary?
+ "input_mask" if musl => true,
+
+ // These are tested as part of the linux_fcntl tests since there are
+ // header conflicts when including them with all the other structs.
+ // FIXME: is this necessary?
+ "termios2" => true,
+
+ _ => false,
+ }
});
+ cfg.skip_signededness(move |c| match c {
+ // FIXME: is this necessary?
+ "LARGE_INTEGER" | "float" | "double" => true,
+ // FIXME: is this necessary?
+ n if n.starts_with("pthread") => true,
+ _ => false,
+ });
+
+ cfg.skip_const(move |name| {
+ match name {
+ // FIXME: is this necessary?
+ "SIG_DFL" | "SIG_ERR" | "SIG_IGN" => true, // sighandler_t weirdness
+ // FIXME: is this necessary?
+ "SIGUNUSED" => true, // removed in glibc 2.26
+
+ // types on musl are defined a little differently
+ // FIXME: is this necessary?
+ n if musl && n.contains("__SIZEOF_PTHREAD") => true,
+
+ // Skip constants not defined in MUSL but just passed down to the
+ // kernel regardless
+ // FIXME: is this necessary?
+ "RLIMIT_NLIMITS"
+ | "TCP_COOKIE_TRANSACTIONS"
+ | "RLIMIT_RTTIME"
+ | "MSG_COPY"
+ if musl =>
+ {
+ true
+ }
+ // work around super old mips toolchain
+ // FIXME: is this necessary?
+ "SCHED_IDLE" | "SHM_NORESERVE" => mips,
+
+ // weird signed extension or something like that?
+ // FIXME: is this necessary?
+ "MS_NOUSER" => true,
+ // FIXME: is this necessary?
+ "MS_RMT_MASK" => true, // updated in glibc 2.22 and musl 1.1.13
+
+ // These are either unimplemented or optionally built into uClibc
+ // FIXME: is this necessary?
+ "LC_CTYPE_MASK"
+ | "LC_NUMERIC_MASK"
+ | "LC_TIME_MASK"
+ | "LC_COLLATE_MASK"
+ | "LC_MONETARY_MASK"
+ | "LC_MESSAGES_MASK"
+ | "MADV_MERGEABLE"
+ | "MADV_UNMERGEABLE"
+ | "MADV_HWPOISON"
+ | "IPV6_ADD_MEMBERSHIP"
+ | "IPV6_DROP_MEMBERSHIP"
+ | "IPV6_MULTICAST_LOOP"
+ | "IPV6_V6ONLY"
+ | "MAP_STACK"
+ | "RTLD_DEEPBIND"
+ | "SOL_IPV6"
+ | "SOL_ICMPV6"
+ if uclibc =>
+ {
+ true
+ }
+
+ // Musl uses old, patched kernel headers
+ // FIXME: is this necessary?
+ "FALLOC_FL_COLLAPSE_RANGE"
+ | "FALLOC_FL_ZERO_RANGE"
+ | "FALLOC_FL_INSERT_RANGE"
+ | "FALLOC_FL_UNSHARE_RANGE"
+ | "RENAME_NOREPLACE"
+ | "RENAME_EXCHANGE"
+ | "RENAME_WHITEOUT"
+ // ALG_SET_AEAD_* constants are available starting from kernel 3.19
+ | "ALG_SET_AEAD_ASSOCLEN"
+ | "ALG_SET_AEAD_AUTHSIZE"
+ if musl =>
+ {
+ true
+ }
+
+ // musl uses old kernel headers
+ // These are constants used in getrandom syscall
+ // FIXME: is this necessary?
+ "GRND_NONBLOCK" | "GRND_RANDOM" if musl => true,
+
+ // Defined by libattr not libc on linux (hard to test).
+ // See constant definition for more details.
+ // FIXME: is this necessary?
+ "ENOATTR" => true,
+
+ // On mips*-unknown-linux-gnu* CMSPAR cannot be included with the set of headers we
+ // want to use here for testing. It's originally defined in asm/termbits.h, which is
+ // also included by asm/termios.h, but not the standard termios.h. There's no way to
+ // include both asm/termbits.h and termios.h and there's no way to include both
+ // asm/termios.h and ioctl.h (+ some other headers) because of redeclared types.
+ // FIXME: is this necessary?
+ "CMSPAR" if mips && !musl => true,
+
+ // On mips Linux targets, MADV_SOFT_OFFLINE is currently missing, though it's been added but CI has too old
+ // of a Linux version. Since it exists on all other Linux targets, just ignore this for now and remove once
+ // it's been fixed in CI.
+ // FIXME: is this necessary?
+ "MADV_SOFT_OFFLINE" if mips => true,
+
+ // These constants are tested in a separate test program generated below because there
+ // are header conflicts if we try to include the headers that define them here.
+ // FIXME: is this necessary?
+ "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => true,
+ // FIXME: is this necessary?
+ "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW"
+ | "F_SEAL_WRITE" => true,
+ // FIXME: is this necessary?
+ "QFMT_VFS_OLD" | "QFMT_VFS_V0" | "QFMT_VFS_V1"
+ if mips =>
+ {
+ true
+ } // Only on MIPS
+ // FIXME: is this necessary?
+ "BOTHER" => true,
+
+ // FIXME: is this necessary?
+ "MFD_CLOEXEC" | "MFD_ALLOW_SEALING" if !mips && musl => true,
+ // MFD_HUGETLB is not available in some older libc versions on the CI builders. On the
+ // x86_64 and i686 builders it seems to be available for all targets, so at least test
+ // it there.
+ // FIXME: is this necessary?
+ "MFD_HUGETLB"
+ if !(x86_64 || i686) || musl =>
+ {
+ true
+ }
+
+ // These are defined for Solaris 11, but the crate is tested on
+ // illumos, where they are currently not defined
+ // FIXME: is this necessary?
+ "EADI"
+ | "PORT_SOURCE_POSTWAIT"
+ | "PORT_SOURCE_SIGNAL"
+ | "PTHREAD_STACK_MIN" => true,
+
+ // These change all the time from release to release of linux
+ // distros, let's just not bother trying to verify them. They
+ // shouldn't be used in code anyway...
+ // FIXME: is this necessary?
+ "AF_MAX" | "PF_MAX" => true,
+
+ // These are not in a glibc release yet, only in kernel headers.
+ // FIXME: is this necessary?
+ "AF_XDP"
+ | "PF_XDP"
+ | "SOL_XDP"
+ | "IPV6_FLOWINFO"
+ | "IPV6_FLOWLABEL_MGR"
+ | "IPV6_FLOWINFO_SEND"
+ | "IPV6_FLOWINFO_FLOWLABEL"
+ | "IPV6_FLOWINFO_PRIORITY"
+ =>
+ {
+ true
+ }
+
+ _ => false,
+ }
+ });
+
+ cfg.skip_fn(move |name| {
+ // skip those that are manually verified
+ match name {
+ "execv" | // crazy stuff with const/mut
+ "execve" |
+ "execvp" |
+ "execvpe" |
+ "fexecve" => true,
+
+ "getrlimit" | "getrlimit64" | // non-int in 1st arg
+ "setrlimit" | "setrlimit64" | // non-int in 1st arg
+ "prlimit" | "prlimit64" // non-int in 2nd arg
+ => true,
+
+ // int vs uint. Sorry musl, your prototype declarations are "correct" in the sense that
+ // they match the interface defined by Linux verbatim, but they conflict with other
+ // send*/recv* syscalls
+ // FIXME: is this necessary?
+ "sendmmsg" | "recvmmsg" if musl => true,
+
+ // FIXME: is this necessary?
+ "dladdr" if musl => true, // const-ness only added recently
+
+ // There seems to be a small error in EGLIBC's eventfd.h header. The
+ // [underlying system call][1] always takes its first `count`
+ // argument as an `unsigned int`, but [EGLIBC's <sys/eventfd.h>
+ // header][2] declares it to take an `int`. [GLIBC's header][3]
+ // matches the kernel.
+ //
+ // EGLIBC is no longer actively developed, and Debian, the largest
+ // distribution that had been using it, switched back to GLIBC in
+ // April 2015. So effectively all Linux <sys/eventfd.h> headers will
+ // be using `unsigned int` soon.
+ //
+ // [1]: https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/fs/eventfd.c?id=refs/tags/v3.12.51#n397
+ // [2]: http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/trusty/eglibc/trusty/view/head:/sysdeps/unix/sysv/linux/sys/eventfd.h
+ // [3]: https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sys/eventfd.h;h=6295f32e937e779e74318eb9d3bdbe76aef8a8f3;hb=4e42b5b8f89f0e288e68be7ad70f9525aebc2cff#l34
+ // FIXME: is this necessary?
+ "eventfd" => true,
+
+ "lio_listio" if musl => true,
+
+ // These are either unimplemented or optionally built into uClibc
+ // or "sysinfo", where it's defined but the structs in linux/sysinfo.h and sys/sysinfo.h
+ // clash so it can't be tested
+ "getxattr" | "lgetxattr" | "fgetxattr" | "setxattr" | "lsetxattr" | "fsetxattr" |
+ "listxattr" | "llistxattr" | "flistxattr" | "removexattr" | "lremovexattr" |
+ "fremovexattr" |
+ "backtrace" |
+ "sysinfo" | "newlocale" | "duplocale" | "freelocale" | "uselocale" |
+ "nl_langinfo_l" | "wcslen" | "wcstombs" if uclibc => true,
+
+ // Definition of those functions as changed since unified headers from NDK r14b
+ // These changes imply some API breaking changes but are still ABI compatible.
+ // We can wait for the next major release to be compliant with the new API.
+ // FIXME: unskip these for next major release
+ "strerror_r" | "madvise" | "msync" | "mprotect" | "recvfrom" | "getpriority" => true,
+
+ _ => false,
+ }
+ });
+
+ // FIXME: is this necessary?
+ cfg.skip_field_type(move |struct_, field| {
+ // This is a weird union, don't check the type.
+ (struct_ == "ifaddrs" && field == "ifa_ifu") ||
+ // sighandler_t type is super weird
+ (struct_ == "sigaction" && field == "sa_sigaction") ||
+ // __timeval type is a patch which doesn't exist in glibc
+ (struct_ == "utmpx" && field == "ut_tv") ||
+ // sigval is actually a union, but we pretend it's a struct
+ (struct_ == "sigevent" && field == "sigev_value") ||
+ // aio_buf is "volatile void*" and Rust doesn't understand volatile
+ (struct_ == "aiocb" && field == "aio_buf") ||
+ // this one is an anonymous union
+ (struct_ == "ff_effect" && field == "u")
+ });
+
+ cfg.skip_field(move |struct_, field| {
+ // this is actually a union on linux, so we can't represent it well and
+ // just insert some padding.
+ (struct_ == "siginfo_t" && field == "_pad") ||
+ // musl names this __dummy1 but it's still there
+ (musl && struct_ == "glob_t" && field == "gl_flags") ||
+ // musl seems to define this as an *anonymous* bitfield
+ (musl && struct_ == "statvfs" && field == "__f_unused") ||
+ // sigev_notify_thread_id is actually part of a sigev_un union
+ (struct_ == "sigevent" && field == "sigev_notify_thread_id") ||
+ // signalfd had SIGSYS fields added in Linux 4.18, but no libc release has them yet.
+ (struct_ == "signalfd_siginfo" && (field == "ssi_addr_lsb" ||
+ field == "_pad2" ||
+ field == "ssi_syscall" ||
+ field == "ssi_call_addr" ||
+ field == "ssi_arch"))
+ });
+
+ // FIXME: remove
+ cfg.fn_cname(move |name, _cname| name.to_string());
+
cfg.generate("../src/lib.rs", "main.rs");
+
+ // On Linux also generate another script for testing linux/fcntl declarations.
+ // These cannot be tested normally because including both `linux/fcntl.h` and `fcntl.h`
+ // fails on a lot of platforms.
+ test_linux_termios2(target);
+
+ // Test Elf64_Phdr and Elf32_Phdr
+ // These types have a field called `p_type`, but including
+ // "resolve.h" defines a `p_type` macro that expands to `__p_type`
+ // making the tests for these fails when both are included.
+ let mut cfg = ctest::TestGenerator::new();
+ cfg.skip_fn(|_| true)
+ .skip_const(|_| true)
+ .skip_static(|_| true)
+ .type_name(move |ty, _is_struct, _is_union| ty.to_string());
+ cfg.skip_struct(move |ty| match ty {
+ "Elf64_Phdr" | "Elf32_Phdr" => false,
+ _ => true,
+ });
+ cfg.skip_type(move |ty| match ty {
+ "Elf64_Phdr" | "Elf32_Phdr" => false,
+ _ => true,
+ });
+ cfg.header("elf.h");
+ cfg.generate("../src/lib.rs", "linux_elf.rs");
+}
+
+fn test_linux_termios2(target: &str) {
+ assert!(target.contains("linux") || target.contains("android"));
+ let musl = target.contains("musl");
+ let mut cfg = ctest::TestGenerator::new();
+ cfg.skip_type(|_| true)
+ .skip_fn(|f| match f {
+ "strerror_r" => false,
+ _ => true,
+ })
+ .skip_static(|_| true);
+ headers! {
+ cfg:
+ "linux/quota.h",
+ "asm/termbits.h",
+ "string.h"
+ }
+ if musl {
+ cfg.header("fcntl.h");
+ } else {
+ cfg.header("linux/fcntl.h");
+ }
+ if !musl {
+ cfg.header("net/if.h");
+ cfg.header("linux/if.h");
+ }
+
+ cfg.skip_const(move |name| match name {
+ "F_CANCELLK" | "F_ADD_SEALS" | "F_GET_SEALS" => false,
+ "F_SEAL_SEAL" | "F_SEAL_SHRINK" | "F_SEAL_GROW" | "F_SEAL_WRITE" => {
+ false
+ }
+ _ => true,
+ });
+ cfg.skip_struct(|s| s != "termios2");
+ cfg.type_name(move |ty, is_struct, is_union| match ty {
+ t if is_struct => format!("struct {}", t),
+ t if is_union => format!("union {}", t),
+ t => t.to_string(),
+ });
+ cfg.generate("../src/lib.rs", "linux_fcntl.rs");
}
diff --git a/src/fuchsia/mod.rs b/src/fuchsia/mod.rs
index 01317e30a4..b8388b6eb1 100644
--- a/src/fuchsia/mod.rs
+++ b/src/fuchsia/mod.rs
@@ -27,6 +27,8 @@ pub type c_ulonglong = u64;
pub type intmax_t = i64;
pub type uintmax_t = u64;
+pub type locale_t = *mut ::c_void;
+
pub type size_t = usize;
pub type ptrdiff_t = isize;
pub type intptr_t = isize;
@@ -110,12 +112,7 @@ impl ::Copy for DIR {}
impl ::Clone for DIR {
fn clone(&self) -> DIR { *self }
}
-#[cfg_attr(feature = "extra_traits", derive(Debug))]
-pub enum locale_t {}
-impl ::Copy for locale_t {}
-impl ::Clone for locale_t {
- fn clone(&self) -> locale_t { *self }
-}
+
#[cfg_attr(feature = "extra_traits", derive(Debug))]
pub enum fpos64_t {} // TODO: fill this out with a struct
impl ::Copy for fpos64_t {}
@@ -4168,7 +4165,7 @@ extern {
offset: *mut off_t,
count: ::size_t) -> ::ssize_t;
pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int;
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
diff --git a/src/lib.rs b/src/lib.rs
index 019f072e17..baf6324341 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,6 +26,7 @@
#![deny(missing_copy_implementations, safe_packed_borrows)]
#![no_std]
#![cfg_attr(feature = "rustc-dep-of-std", no_core)]
+#![cfg_attr(target_os = "redox", feature(static_nobundle))]
#[macro_use]
mod macros;
@@ -91,9 +92,6 @@ cfg_if! {
if #[cfg(windows)] {
mod windows;
pub use windows::*;
- } else if #[cfg(target_os = "redox")] {
- mod redox;
- pub use redox::*;
} else if #[cfg(target_os = "cloudabi")] {
mod cloudabi;
pub use cloudabi::*;
@@ -109,10 +107,13 @@ cfg_if! {
} else if #[cfg(target_os = "hermit")] {
mod hermit;
pub use hermit::*;
- } else if #[cfg(target_env = "sgx")] {
+ } else if #[cfg(all(target_env = "sgx", target_vendor = "fortanix"))] {
mod sgx;
pub use sgx::*;
- } else {
+ } else if #[cfg(any(target_env = "wasi", target_os = "wasi"))] {
+ mod wasi;
+ pub use wasi::*;
+ } else {
// non-supported targets: empty...
}
}
diff --git a/src/redox/align.rs b/src/redox/align.rs
deleted file mode 100644
index 4fdba9a6ab..0000000000
--- a/src/redox/align.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-s! {
- #[repr(align(4))]
- pub struct in6_addr {
- pub s6_addr: [u8; 16],
- }
-}
diff --git a/src/redox/mod.rs b/src/redox/mod.rs
deleted file mode 100644
index ac0ae00bce..0000000000
--- a/src/redox/mod.rs
+++ /dev/null
@@ -1,416 +0,0 @@
-pub type int8_t = i8;
-pub type int16_t = i16;
-pub type int32_t = i32;
-pub type int64_t = i64;
-pub type uint8_t = u8;
-pub type uint16_t = u16;
-pub type uint32_t = u32;
-pub type uint64_t = u64;
-
-pub type c_schar = i8;
-pub type c_uchar = u8;
-pub type c_short = i16;
-pub type c_ushort = u16;
-pub type c_int = i32;
-pub type c_uint = u32;
-pub type c_float = f32;
-pub type c_double = f64;
-pub type c_longlong = i64;
-pub type c_ulonglong = u64;
-pub type intmax_t = i64;
-pub type uintmax_t = u64;
-
-pub type size_t = usize;
-pub type ptrdiff_t = isize;
-pub type intptr_t = isize;
-pub type uintptr_t = usize;
-pub type ssize_t = isize;
-
-pub type c_char = i8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-
-pub type wchar_t = i32;
-pub type wint_t = u32;
-pub type wctype_t = i64;
-
-pub type regoff_t = size_t;
-pub type off_t = c_long;
-pub type mode_t = c_int;
-pub type time_t = c_long;
-pub type pid_t = c_int;
-pub type id_t = c_uint;
-pub type gid_t = c_int;
-pub type uid_t = c_int;
-pub type dev_t = c_long;
-pub type ino_t = c_ulong;
-pub type nlink_t = c_ulong;
-pub type blksize_t = c_long;
-pub type blkcnt_t = c_ulong;
-
-pub type fsblkcnt_t = c_ulong;
-pub type fsfilcnt_t = c_ulong;
-
-pub type useconds_t = c_uint;
-pub type suseconds_t = c_int;
-
-pub type clock_t = c_long;
-pub type clockid_t = c_int;
-pub type timer_t = *mut c_void;
-
-pub type nfds_t = c_ulong;
-
-s! {
- pub struct fd_set {
- fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE],
- }
-
- pub struct pollfd {
- pub fd: ::c_int,
- pub events: ::c_short,
- pub revents: ::c_short,
- }
-
- pub struct stat {
- pub st_dev: ::dev_t,
- pub st_ino: ::ino_t,
- pub st_nlink: ::nlink_t,
- pub st_mode: ::mode_t,
- pub st_uid: ::uid_t,
- pub st_gid: ::gid_t,
- pub st_rdev: ::dev_t,
- pub st_size: ::off_t,
- pub st_blksize: ::blksize_t,
- pub st_blocks: ::blkcnt_t,
-
- pub st_atime: ::timespec,
- pub st_mtime: ::timespec,
- pub st_ctime: ::timespec,
-
- _pad: [c_char; 24],
- }
-
- pub struct timeval {
- pub tv_sec: time_t,
- pub tv_usec: suseconds_t,
- }
-
- pub struct timespec {
- pub tv_sec: time_t,
- pub tv_nsec: c_long,
- }
-}
-
-pub const INT_MIN: c_int = -2147483648;
-pub const INT_MAX: c_int = 2147483647;
-
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const MAP_SHARED: ::c_int = 1;
-pub const MAP_PRIVATE: ::c_int = 2;
-pub const MAP_ANONYMOUS: ::c_int = 4;
-pub const MAP_ANON: ::c_int = MAP_ANONYMOUS;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-pub const POLLIN: ::c_short = 0x001;
-pub const POLLPRI: ::c_short = 0x002;
-pub const POLLOUT: ::c_short = 0x004;
-pub const POLLERR: ::c_short = 0x008;
-pub const POLLHUP: ::c_short = 0x010;
-pub const POLLNVAL: ::c_short = 0x020;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_EXEC: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_READ: ::c_int = 4;
-
-pub const S_ISUID: ::c_int = 0x800;
-pub const S_ISGID: ::c_int = 0x400;
-pub const S_ISVTX: ::c_int = 0x200;
-
-pub const S_IFIFO: mode_t = 0x1000;
-pub const S_IFCHR: mode_t = 0x2000;
-pub const S_IFBLK: mode_t = 0x6000;
-pub const S_IFDIR: mode_t = 0x4000;
-pub const S_IFREG: mode_t = 0x8000;
-pub const S_IFLNK: mode_t = 0xA000;
-pub const S_IFSOCK: mode_t = 0xC000;
-pub const S_IFMT: mode_t = 0xF000;
-pub const S_IEXEC: mode_t = 0x40;
-pub const S_IWRITE: mode_t = 0x80;
-pub const S_IREAD: mode_t = 0x100;
-pub const S_IRWXU: mode_t = 0x1C0;
-pub const S_IXUSR: mode_t = 0x40;
-pub const S_IWUSR: mode_t = 0x80;
-pub const S_IRUSR: mode_t = 0x100;
-pub const S_IRWXG: mode_t = 0x38;
-pub const S_IXGRP: mode_t = 0x8;
-pub const S_IWGRP: mode_t = 0x10;
-pub const S_IRGRP: mode_t = 0x20;
-pub const S_IRWXO: mode_t = 0x7;
-pub const S_IXOTH: mode_t = 0x1;
-pub const S_IWOTH: mode_t = 0x2;
-pub const S_IROTH: mode_t = 0x4;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-
-pub const FD_CLOEXEC: ::c_int = 0x0100_0000;
-
-pub const O_RDONLY: ::c_int = 0x0001_0000;
-pub const O_WRONLY: ::c_int = 0x0002_0000;
-pub const O_RDWR: ::c_int = 0x0003_0000;
-pub const O_NONBLOCK: ::c_int = 0x0004_0000;
-pub const O_APPEND: ::c_int = 0x0008_0000;
-pub const O_SHLOCK: ::c_int = 0x0010_0000;
-pub const O_EXLOCK: ::c_int = 0x0020_0000;
-pub const O_ASYNC: ::c_int = 0x0040_0000;
-pub const O_FSYNC: ::c_int = 0x0080_0000;
-pub const O_CLOEXEC: ::c_int = 0x0100_0000;
-pub const O_CREAT: ::c_int = 0x0200_0000;
-pub const O_TRUNC: ::c_int = 0x0400_0000;
-pub const O_EXCL: ::c_int = 0x0800_0000;
-pub const O_DIRECTORY: ::c_int = 0x1000_0000;
-pub const O_STAT: ::c_int = 0x2000_0000;
-pub const O_SYMLINK: ::c_int = 0x4000_0000;
-pub const O_NOFOLLOW: ::c_int = 0x8000_0000;
-pub const O_ACCMODE: ::c_int = O_RDONLY | O_WRONLY | O_RDWR;
-
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGTRAP: ::c_int = 5;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGURG: ::c_int = 23;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGIO: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIGSYS: ::c_int = 31;
-
-#[cfg_attr(feature = "extra_traits", derive(Debug))]
-pub enum FILE {}
-impl ::Copy for FILE {}
-impl ::Clone for FILE {
- fn clone(&self) -> FILE { *self }
-}
-#[cfg_attr(feature = "extra_traits", derive(Debug))]
-pub enum fpos_t {} // TODO: fill this out with a struct
-impl ::Copy for fpos_t {}
-impl ::Clone for fpos_t {
- fn clone(&self) -> fpos_t { *self }
-}
-
-// intentionally not public, only used for fd_set
-cfg_if! {
- if #[cfg(target_pointer_width = "32")] {
- const ULONG_SIZE: usize = 32;
- } else if #[cfg(target_pointer_width = "64")] {
- const ULONG_SIZE: usize = 64;
- } else {
- // Unknown target_pointer_width
- }
-}
-
-extern {
- pub fn isalnum(c: c_int) -> c_int;
- pub fn isalpha(c: c_int) -> c_int;
- pub fn iscntrl(c: c_int) -> c_int;
- pub fn isdigit(c: c_int) -> c_int;
- pub fn isgraph(c: c_int) -> c_int;
- pub fn islower(c: c_int) -> c_int;
- pub fn isprint(c: c_int) -> c_int;
- pub fn ispunct(c: c_int) -> c_int;
- pub fn isspace(c: c_int) -> c_int;
- pub fn isupper(c: c_int) -> c_int;
- pub fn isxdigit(c: c_int) -> c_int;
- pub fn tolower(c: c_int) -> c_int;
- pub fn toupper(c: c_int) -> c_int;
- pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE;
- pub fn freopen(filename: *const c_char, mode: *const c_char,
- file: *mut FILE) -> *mut FILE;
- pub fn fflush(file: *mut FILE) -> c_int;
- pub fn fclose(file: *mut FILE) -> c_int;
- pub fn remove(filename: *const c_char) -> c_int;
- pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int;
- pub fn tmpfile() -> *mut FILE;
- pub fn setvbuf(stream: *mut FILE, buffer: *mut c_char, mode: c_int,
- size: size_t) -> c_int;
- pub fn setbuf(stream: *mut FILE, buf: *mut c_char);
- pub fn getchar() -> c_int;
- pub fn putchar(c: c_int) -> c_int;
- pub fn fgetc(stream: *mut FILE) -> c_int;
- pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char;
- pub fn fputc(c: c_int, stream: *mut FILE) -> c_int;
- pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int;
- pub fn puts(s: *const c_char) -> c_int;
- pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int;
- pub fn fread(ptr: *mut c_void, size: size_t, nobj: size_t,
- stream: *mut FILE) -> size_t;
- pub fn fwrite(ptr: *const c_void, size: size_t, nobj: size_t,
- stream: *mut FILE) -> size_t;
- pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int;
- pub fn ftell(stream: *mut FILE) -> c_long;
- pub fn rewind(stream: *mut FILE);
- pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int;
- pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int;
- pub fn feof(stream: *mut FILE) -> c_int;
- pub fn ferror(stream: *mut FILE) -> c_int;
- pub fn perror(s: *const c_char);
- pub fn atoi(s: *const c_char) -> c_int;
- pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double;
- pub fn strtol(s: *const c_char, endp: *mut *mut c_char,
- base: c_int) -> c_long;
- pub fn strtoul(s: *const c_char, endp: *mut *mut c_char,
- base: c_int) -> c_ulong;
- pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
- pub fn malloc(size: size_t) -> *mut c_void;
- pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
- pub fn free(p: *mut c_void);
- pub fn abort() -> !;
- pub fn exit(status: c_int) -> !;
- pub fn _exit(status: c_int) -> !;
- pub fn atexit(cb: extern fn()) -> c_int;
- pub fn system(s: *const c_char) -> c_int;
- pub fn getenv(s: *const c_char) -> *mut c_char;
-
- pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
- pub fn strncpy(dst: *mut c_char, src: *const c_char,
- n: size_t) -> *mut c_char;
- pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char;
- pub fn strncat(s: *mut c_char, ct: *const c_char,
- n: size_t) -> *mut c_char;
- pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int;
- pub fn strncmp(cs: *const c_char, ct: *const c_char,
- n: size_t) -> c_int;
- pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
- pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char;
- pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char;
- pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t;
- pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t;
- pub fn strdup(cs: *const c_char) -> *mut c_char;
- pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char;
- pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
- pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
- pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int;
- pub fn strncasecmp(s1: *const c_char, s2: *const c_char,
- n: size_t) -> c_int;
- pub fn strlen(cs: *const c_char) -> size_t;
- pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t;
- pub fn strerror(n: c_int) -> *mut c_char;
- pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char;
- pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t;
- pub fn wcslen(buf: *const wchar_t) -> size_t;
- pub fn wcstombs(dest: *mut c_char, src: *const wchar_t,
- n: size_t) -> ::size_t;
-
- pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
- pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int;
- pub fn memcpy(dest: *mut c_void, src: *const c_void,
- n: size_t) -> *mut c_void;
- pub fn memmove(dest: *mut c_void, src: *const c_void,
- n: size_t) -> *mut c_void;
- pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void;
-
- pub fn abs(i: c_int) -> c_int;
- pub fn atof(s: *const c_char) -> c_double;
- pub fn labs(i: c_long) -> c_long;
- pub fn rand() -> c_int;
- pub fn srand(seed: c_uint);
-
- pub fn chown(path: *const c_char, uid: uid_t, gid: gid_t) -> ::c_int;
- pub fn close(fd: ::c_int) -> ::c_int;
- pub fn fchown(fd: ::c_int, uid: ::uid_t, gid: ::gid_t) -> ::c_int;
- pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int;
- pub fn fstat(fd: ::c_int, buf: *mut stat) -> ::c_int;
- pub fn fsync(fd: ::c_int) -> ::c_int;
- pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int;
- pub fn getpid() -> pid_t;
- pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
- pub fn mmap(addr: *mut ::c_void,
- len: ::size_t,
- prot: ::c_int,
- flags: ::c_int,
- fd: ::c_int,
- offset: off_t)
- -> *mut ::c_void;
- pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
- -> ::c_int;
- pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int;
- pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int;
- pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t) -> ::ssize_t;
- pub fn setenv(name: *const c_char, val: *const c_char, overwrite: ::c_int)
- -> ::c_int;
- pub fn unsetenv(name: *const c_char) -> ::c_int;
- pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t)
- -> ::ssize_t;
-}
-
-#[link(name = "c")]
-#[link(name = "m")]
-extern {}
-
-pub use self::net::*;
-
-mod net;
-
-cfg_if! {
- if #[cfg(libc_core_cvoid)] {
- pub use ::ffi::c_void;
- } else {
- // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help
- // enable more optimization opportunities around it recognizing things
- // like malloc/free.
- #[repr(u8)]
- #[allow(missing_copy_implementations)]
- #[allow(missing_debug_implementations)]
- pub enum c_void {
- // Two dummy variants so the #[repr] attribute can be used.
- #[doc(hidden)]
- __variant1,
- #[doc(hidden)]
- __variant2,
- }
- }
-}
-
-cfg_if! {
- if #[cfg(libc_align)] {
- mod align;
- pub use self::align::*;
- } else {
- mod no_align;
- pub use self::no_align::*;
- }
-}
diff --git a/src/redox/net.rs b/src/redox/net.rs
deleted file mode 100644
index 5d962b1649..0000000000
--- a/src/redox/net.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-pub type in_addr_t = u32;
-pub type in_port_t = u16;
-
-pub type socklen_t = u32;
-pub type sa_family_t = u16;
-
-s! {
- pub struct in_addr {
- pub s_addr: in_addr_t,
- }
-
- pub struct ip_mreq {
- pub imr_multiaddr: in_addr,
- pub imr_interface: in_addr,
- }
-
- pub struct ipv6_mreq {
- pub ipv6mr_multiaddr: ::in6_addr,
- pub ipv6mr_interface: ::c_uint,
- }
-
- pub struct linger {
- pub l_onoff: ::c_int,
- pub l_linger: ::c_int,
- }
-
- pub struct sockaddr {
- pub sa_family: sa_family_t,
- pub sa_data: [::c_char; 14],
- }
-
- pub struct sockaddr_in {
- pub sin_family: sa_family_t,
- pub sin_port: ::in_port_t,
- pub sin_addr: ::in_addr,
- pub sin_zero: [u8; 8],
- }
-
- pub struct sockaddr_in6 {
- pub sin6_family: sa_family_t,
- pub sin6_port: in_port_t,
- pub sin6_flowinfo: u32,
- pub sin6_addr: ::in6_addr,
- pub sin6_scope_id: u32,
- }
-
- pub struct sockaddr_storage {
- pub ss_family: sa_family_t,
- pub __ss_padding: [u8; 26],
- }
-}
-
-pub const AF_INET: ::c_int = 2;
-pub const AF_INET6: ::c_int = 23;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-
-pub const TCP_KEEPIDLE: ::c_int = 4;
-pub const TCP_NODELAY: ::c_int = 8193;
-
-pub const IP_TTL: ::c_int = 8;
-pub const IP_MULTICAST_LOOP: ::c_int = 9;
-pub const IP_MULTICAST_TTL: ::c_int = 10;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 11;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 12;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
-pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
-pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
-pub const IPV6_V6ONLY: ::c_int = 26;
-
-pub const SOL_SOCKET: ::c_int = 65535;
-
-pub const SO_REUSEADDR: ::c_int = 4;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_KEEPALIVE: ::c_int = 8;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_LINGER: ::c_int = 128;
-pub const SO_SNDBUF: ::c_int = 4097;
-pub const SO_RCVBUF: ::c_int = 4098;
-pub const SO_ERROR: ::c_int = 4105;
-
-extern {
- pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int;
- pub fn bind(fd: ::c_int, addr: *const sockaddr, len: socklen_t) -> ::c_int;
- pub fn connect(socket: ::c_int, address: *const sockaddr,
- len: socklen_t) -> ::c_int;
- pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int;
- pub fn getsockname(socket: ::c_int, address: *mut sockaddr,
- address_len: *mut socklen_t) -> ::c_int;
- pub fn getsockopt(sockfd: ::c_int,
- level: ::c_int,
- optname: ::c_int,
- optval: *mut ::c_void,
- optlen: *mut ::socklen_t) -> ::c_int;
- pub fn setsockopt(socket: ::c_int, level: ::c_int, name: ::c_int,
- value: *const ::c_void,
- option_len: socklen_t) -> ::c_int;
- pub fn getpeername(socket: ::c_int, address: *mut sockaddr,
- address_len: *mut socklen_t) -> ::c_int;
- pub fn sendto(socket: ::c_int, buf: *const ::c_void, len: ::size_t,
- flags: ::c_int, addr: *const sockaddr,
- addrlen: socklen_t) -> ::ssize_t;
- pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t,
- flags: ::c_int) -> ::ssize_t;
- pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
- flags: ::c_int, addr: *mut ::sockaddr,
- addrlen: *mut ::socklen_t) -> ::ssize_t;
- pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
- flags: ::c_int) -> ::ssize_t;
-}
diff --git a/src/redox/no_align.rs b/src/redox/no_align.rs
deleted file mode 100644
index f6b9f4c12d..0000000000
--- a/src/redox/no_align.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-s! {
- pub struct in6_addr {
- pub s6_addr: [u8; 16],
- __align: [u32; 0],
- }
-}
diff --git a/src/unix/bsd/apple/mod.rs b/src/unix/bsd/apple/mod.rs
index 3c0877b275..53463abbc8 100644
--- a/src/unix/bsd/apple/mod.rs
+++ b/src/unix/bsd/apple/mod.rs
@@ -3045,6 +3045,8 @@ extern {
pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn getutxent() -> *mut utmpx;
pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
@@ -3168,6 +3170,7 @@ extern {
name: *mut ::c_char,
termp: *mut termios,
winp: *mut ::winsize) -> ::pid_t;
+ pub fn login_tty(fd: ::c_int) -> ::c_int;
pub fn duplocale(base: ::locale_t) -> ::locale_t;
pub fn freelocale(loc: ::locale_t) -> ::c_int;
pub fn localeconv_l(loc: ::locale_t) -> *mut lconv;
diff --git a/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
index f0cbef9ce2..e91b351cc4 100644
--- a/src/unix/bsd/freebsdlike/dragonfly/mod.rs
+++ b/src/unix/bsd/freebsdlike/dragonfly/mod.rs
@@ -16,6 +16,7 @@ pub type uuid_t = ::uuid;
pub type fsblkcnt_t = u64;
pub type fsfilcnt_t = u64;
+pub type mqd_t = ::c_int;
pub type sem_t = *mut sem;
#[cfg_attr(feature = "extra_traits", derive(Debug))]
diff --git a/src/unix/bsd/freebsdlike/freebsd/mod.rs b/src/unix/bsd/freebsdlike/freebsd/mod.rs
index 85816e97c3..3ce96e8966 100644
--- a/src/unix/bsd/freebsdlike/freebsd/mod.rs
+++ b/src/unix/bsd/freebsdlike/freebsd/mod.rs
@@ -15,6 +15,7 @@ pub type key_t = ::c_long;
pub type msglen_t = ::c_ulong;
pub type msgqnum_t = ::c_ulong;
+pub type mqd_t = *mut ::c_void;
pub type posix_spawnattr_t = *mut ::c_void;
pub type posix_spawn_file_actions_t = *mut ::c_void;
@@ -1332,6 +1333,7 @@ extern {
pub fn aio_waitcomplete(iocbp: *mut *mut aiocb,
timeout: *mut ::timespec) -> ::ssize_t;
+ pub fn mq_getfd_np(mqd: ::mqd_t) -> ::c_int;
pub fn freelocale(loc: ::locale_t) -> ::c_int;
pub fn waitid(idtype: idtype_t, id: ::id_t, infop: *mut ::siginfo_t,
diff --git a/src/unix/bsd/freebsdlike/mod.rs b/src/unix/bsd/freebsdlike/mod.rs
index e296e07b12..5e0853bf51 100644
--- a/src/unix/bsd/freebsdlike/mod.rs
+++ b/src/unix/bsd/freebsdlike/mod.rs
@@ -2,7 +2,6 @@ pub type dev_t = u32;
pub type mode_t = u16;
pub type pthread_attr_t = *mut ::c_void;
pub type rlim_t = i64;
-pub type mqd_t = *mut ::c_void;
pub type pthread_mutex_t = *mut ::c_void;
pub type pthread_mutexattr_t = *mut ::c_void;
pub type pthread_cond_t = *mut ::c_void;
@@ -1096,7 +1095,8 @@ extern {
-> ::c_int;
pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int;
-
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
pub fn accept4(s: ::c_int, addr: *mut ::sockaddr,
addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int;
pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
@@ -1300,6 +1300,7 @@ extern {
name: *mut ::c_char,
termp: *mut termios,
winp: *mut ::winsize) -> ::pid_t;
+ pub fn login_tty(fd: ::c_int) -> ::c_int;
}
cfg_if! {
diff --git a/src/unix/bsd/mod.rs b/src/unix/bsd/mod.rs
index e1a2f416fd..ef92bd5cd4 100644
--- a/src/unix/bsd/mod.rs
+++ b/src/unix/bsd/mod.rs
@@ -488,6 +488,8 @@ f! {
}
extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
pub fn abs(i: ::c_int) -> ::c_int;
pub fn atof(s: *const ::c_char) -> ::c_double;
pub fn labs(i: ::c_long) -> ::c_long;
@@ -594,7 +596,7 @@ extern {
pub fn sync();
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
@@ -663,8 +665,7 @@ cfg_if! {
if #[cfg(any(target_os = "macos", target_os = "ios"))] {
mod apple;
pub use self::apple::*;
- } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd",
- target_os = "bitrig"))] {
+ } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd"))] {
mod netbsdlike;
pub use self::netbsdlike::*;
} else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] {
diff --git a/src/unix/bsd/netbsdlike/mod.rs b/src/unix/bsd/netbsdlike/mod.rs
index 3ef2e09e42..6e8383061c 100644
--- a/src/unix/bsd/netbsdlike/mod.rs
+++ b/src/unix/bsd/netbsdlike/mod.rs
@@ -643,6 +643,7 @@ extern {
name: *mut ::c_char,
termp: *mut termios,
winp: *mut ::winsize) -> ::pid_t;
+ pub fn login_tty(fd: ::c_int) -> ::c_int;
pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
@@ -675,9 +676,9 @@ cfg_if! {
if #[cfg(target_os = "netbsd")] {
mod netbsd;
pub use self::netbsd::*;
- } else if #[cfg(any(target_os = "openbsd", target_os = "bitrig"))] {
- mod openbsdlike;
- pub use self::openbsdlike::*;
+ } else if #[cfg(target_os = "openbsd")] {
+ mod openbsd;
+ pub use self::openbsd::*;
} else {
// Unknown target_os
}
diff --git a/src/unix/bsd/netbsdlike/netbsd/mod.rs b/src/unix/bsd/netbsdlike/netbsd/mod.rs
index ad53c19b3b..d4ccd6775a 100644
--- a/src/unix/bsd/netbsdlike/netbsd/mod.rs
+++ b/src/unix/bsd/netbsdlike/netbsd/mod.rs
@@ -1492,6 +1492,9 @@ extern {
#[link_name = "__lutimes50"]
pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
+ #[link_name = "__gettimeofday50"]
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn getnameinfo(sa: *const ::sockaddr,
salen: ::socklen_t,
host: *mut ::c_char,
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/aarch64.rs b/src/unix/bsd/netbsdlike/openbsd/aarch64.rs
index 6a8cbb5c4f..6a8cbb5c4f 100644
--- a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/aarch64.rs
+++ b/src/unix/bsd/netbsdlike/openbsd/aarch64.rs
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs
index cf9dc8f551..e3efae9e8b 100644
--- a/src/unix/bsd/netbsdlike/openbsdlike/mod.rs
+++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs
@@ -17,6 +17,150 @@ pub type pthread_rwlockattr_t = *mut ::c_void;
pub type caddr_t = *mut ::c_char;
s! {
+ pub struct glob_t {
+ pub gl_pathc: ::size_t,
+ pub gl_matchc: ::size_t,
+ pub gl_offs: ::size_t,
+ pub gl_flags: ::c_int,
+ pub gl_pathv: *mut *mut ::c_char,
+ __unused1: *mut ::c_void,
+ __unused2: *mut ::c_void,
+ __unused3: *mut ::c_void,
+ __unused4: *mut ::c_void,
+ __unused5: *mut ::c_void,
+ __unused6: *mut ::c_void,
+ __unused7: *mut ::c_void,
+ }
+
+ pub struct lconv {
+ pub decimal_point: *mut ::c_char,
+ pub thousands_sep: *mut ::c_char,
+ pub grouping: *mut ::c_char,
+ pub int_curr_symbol: *mut ::c_char,
+ pub currency_symbol: *mut ::c_char,
+ pub mon_decimal_point: *mut ::c_char,
+ pub mon_thousands_sep: *mut ::c_char,
+ pub mon_grouping: *mut ::c_char,
+ pub positive_sign: *mut ::c_char,
+ pub negative_sign: *mut ::c_char,
+ pub int_frac_digits: ::c_char,
+ pub frac_digits: ::c_char,
+ pub p_cs_precedes: ::c_char,
+ pub p_sep_by_space: ::c_char,
+ pub n_cs_precedes: ::c_char,
+ pub n_sep_by_space: ::c_char,
+ pub p_sign_posn: ::c_char,
+ pub n_sign_posn: ::c_char,
+ pub int_p_cs_precedes: ::c_char,
+ pub int_p_sep_by_space: ::c_char,
+ pub int_n_cs_precedes: ::c_char,
+ pub int_n_sep_by_space: ::c_char,
+ pub int_p_sign_posn: ::c_char,
+ pub int_n_sign_posn: ::c_char,
+ }
+
+ pub struct ufs_args {
+ pub fspec: *mut ::c_char,
+ pub export_info: export_args,
+ }
+
+ pub struct mfs_args {
+ pub fspec: *mut ::c_char,
+ pub export_info: export_args,
+ // https://github.com/openbsd/src/blob/master/sys/sys/types.h#L134
+ pub base: *mut ::c_char,
+ pub size: ::c_ulong,
+ }
+
+ pub struct iso_args {
+ pub fspec: *mut ::c_char,
+ pub export_info: export_args,
+ pub flags: ::c_int,
+ pub sess: ::c_int,
+ }
+
+ pub struct nfs_args {
+ pub version: ::c_int,
+ pub addr: *mut ::sockaddr,
+ pub addrlen: ::c_int,
+ pub sotype: ::c_int,
+ pub proto: ::c_int,
+ pub fh: *mut ::c_uchar,
+ pub fhsize: ::c_int,
+ pub flags: ::c_int,
+ pub wsize: ::c_int,
+ pub rsize: ::c_int,
+ pub readdirsize: ::c_int,
+ pub timeo: ::c_int,
+ pub retrans: ::c_int,
+ pub maxgrouplist: ::c_int,
+ pub readahead: ::c_int,
+ pub leaseterm: ::c_int,
+ pub deadthresh: ::c_int,
+ pub hostname: *mut ::c_char,
+ pub acregmin: ::c_int,
+ pub acregmax: ::c_int,
+ pub acdirmin: ::c_int,
+ pub acdirmax: ::c_int,
+ }
+
+ pub struct msdosfs_args {
+ pub fspec: *mut ::c_char,
+ pub export_info: export_args,
+ pub uid: ::uid_t,
+ pub gid: ::gid_t,
+ pub mask: ::mode_t,
+ pub flags: ::c_int,
+ }
+
+ pub struct ntfs_args {
+ pub fspec: *mut ::c_char,
+ pub export_info: export_args,
+ pub uid: ::uid_t,
+ pub gid: ::gid_t,
+ pub mode: ::mode_t,
+ pub flag: ::c_ulong,
+ }
+
+ pub struct udf_args {
+ pub fspec: *mut ::c_char,
+ pub lastblock: ::uint32_t,
+ }
+
+ pub struct tmpfs_args {
+ pub ta_version: ::c_int,
+ pub ta_nodes_max: ::ino_t,
+ pub ta_size_max: ::off_t,
+ pub ta_root_uid: ::uid_t,
+ pub ta_root_gid: ::gid_t,
+ pub ta_root_mode: ::mode_t,
+ }
+
+ pub struct fusefs_args {
+ pub name: *mut ::c_char,
+ pub fd: ::c_int,
+ pub max_read: ::c_int,
+ pub allow_other: ::c_int,
+ }
+
+ pub struct xucred {
+ pub cr_uid: ::uid_t,
+ pub cr_gid: ::gid_t,
+ pub cr_ngroups: ::c_short,
+ //https://github.com/openbsd/src/blob/master/sys/sys/syslimits.h#L44
+ pub cr_groups: [::gid_t; 16],
+ }
+
+ pub struct export_args {
+ pub ex_flags: ::c_int,
+ pub ex_root: ::uid_t,
+ pub ex_anon: xucred,
+ pub ex_addr: *mut ::sockaddr,
+ pub ex_addrlen: ::c_int,
+ pub ex_mask: *mut ::sockaddr,
+ pub ex_masklen: ::c_int,
+ }
+
pub struct ip_mreq {
pub imr_multiaddr: in_addr,
pub imr_interface: in_addr,
@@ -206,6 +350,18 @@ s_no_extra_traits! {
pub ut_host: [::c_char; UT_HOSTSIZE],
pub ut_time: ::time_t,
}
+
+ pub union mount_info {
+ pub ufs_args: ufs_args,
+ pub mfs_args: mfs_args,
+ pub nfs_args: nfs_args,
+ pub iso_args: iso_args,
+ pub msdosfs_args: msdosfs_args,
+ pub ntfs_args: ntfs_args,
+ pub tmpfs_args: tmpfs_args,
+ align: [::c_char; 160],
+ }
+
}
cfg_if! {
@@ -385,6 +541,167 @@ cfg_if! {
self.ut_time.hash(state);
}
}
+
+ impl PartialEq for mount_info {
+ fn eq(&self, other: &mount_info) -> bool {
+ unsafe {
+ self.align
+ .iter()
+ .zip(other.align.iter())
+ .all(|(a,b)| a == b)
+ }
+ }
+ }
+
+ impl Eq for mount_info { }
+
+ impl ::fmt::Debug for mount_info {
+ fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
+ f.debug_struct("mount_info")
+ // FIXME: .field("align", &self.align)
+ .finish()
+ }
+ }
+
+ impl ::hash::Hash for mount_info {
+ fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
+ unsafe { self.align.hash(state) };
+ }
+ }
+ }
+}
+
+cfg_if! {
+ if #[cfg(libc_union)] {
+ s_no_extra_traits! {
+ // This type uses the union mount_info:
+ pub struct statfs {
+ pub f_flags: ::uint32_t,
+ pub f_bsize: ::uint32_t,
+ pub f_iosize: ::uint32_t,
+ pub f_blocks: ::uint64_t,
+ pub f_bfree: ::uint64_t,
+ pub f_bavail: ::int64_t,
+ pub f_files: ::uint64_t,
+ pub f_ffree: ::uint64_t,
+ pub f_favail: ::int64_t,
+ pub f_syncwrites: ::uint64_t,
+ pub f_syncreads: ::uint64_t,
+ pub f_asyncwrites: ::uint64_t,
+ pub f_asyncreads: ::uint64_t,
+ pub f_fsid: ::fsid_t,
+ pub f_namemax: ::uint32_t,
+ pub f_owner: ::uid_t,
+ pub f_ctime: ::uint64_t,
+ pub f_fstypename: [::c_char; 16],
+ pub f_mntonname: [::c_char; 90],
+ pub f_mntfromname: [::c_char; 90],
+ pub f_mntfromspec: [::c_char; 90],
+ pub mount_info: mount_info,
+ }
+ }
+
+ cfg_if! {
+ if #[cfg(feature = "extra_traits")] {
+ impl PartialEq for statfs {
+ fn eq(&self, other: &statfs) -> bool {
+ self.f_flags == other.f_flags
+ && self.f_bsize == other.f_bsize
+ && self.f_iosize == other.f_iosize
+ && self.f_blocks == other.f_blocks
+ && self.f_bfree == other.f_bfree
+ && self.f_bavail == other.f_bavail
+ && self.f_files == other.f_files
+ && self.f_ffree == other.f_ffree
+ && self.f_favail == other.f_favail
+ && self.f_syncwrites == other.f_syncwrites
+ && self.f_syncreads == other.f_syncreads
+ && self.f_asyncwrites == other.f_asyncwrites
+ && self.f_asyncreads == other.f_asyncreads
+ && self.f_fsid == other.f_fsid
+ && self.f_namemax == other.f_namemax
+ && self.f_owner == other.f_owner
+ && self.f_ctime == other.f_ctime
+ && self.f_fstypename
+ .iter()
+ .zip(other.f_fstypename.iter())
+ .all(|(a,b)| a == b)
+ && self.f_mntonname
+ .iter()
+ .zip(other.f_mntonname.iter())
+ .all(|(a,b)| a == b)
+ && self.f_mntfromname
+ .iter()
+ .zip(other.f_mntfromname.iter())
+ .all(|(a,b)| a == b)
+ && self.f_mntfromspec
+ .iter()
+ .zip(other.f_mntfromspec.iter())
+ .all(|(a,b)| a == b)
+ && self.mount_info == other.mount_info
+ }
+ }
+
+ impl Eq for statfs { }
+
+ impl ::fmt::Debug for statfs {
+ fn fmt(&self, f: &mut ::fmt::Formatter)
+ -> ::fmt::Result {
+ f.debug_struct("statfs")
+ .field("f_flags", &self.f_flags)
+ .field("f_bsize", &self.f_bsize)
+ .field("f_iosize", &self.f_iosize)
+ .field("f_blocks", &self.f_blocks)
+ .field("f_bfree", &self.f_bfree)
+ .field("f_bavail", &self.f_bavail)
+ .field("f_files", &self.f_files)
+ .field("f_ffree", &self.f_ffree)
+ .field("f_favail", &self.f_favail)
+ .field("f_syncwrites", &self.f_syncwrites)
+ .field("f_syncreads", &self.f_syncreads)
+ .field("f_asyncwrites", &self.f_asyncwrites)
+ .field("f_asyncreads", &self.f_asyncreads)
+ .field("f_fsid", &self.f_fsid)
+ .field("f_namemax", &self.f_namemax)
+ .field("f_owner", &self.f_owner)
+ .field("f_ctime", &self.f_ctime)
+ // FIXME: .field("f_fstypename", &self.f_fstypename)
+ // FIXME: .field("f_mntonname", &self.f_mntonname)
+ // FIXME: .field("f_mntfromname", &self.f_mntfromname)
+ // FIXME: .field("f_mntfromspec", &self.f_mntfromspec)
+ .field("mount_info", &self.mount_info)
+ .finish()
+ }
+ }
+
+ impl ::hash::Hash for statfs {
+ fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
+ self.f_flags.hash(state);
+ self.f_bsize.hash(state);
+ self.f_iosize.hash(state);
+ self.f_blocks.hash(state);
+ self.f_bfree.hash(state);
+ self.f_bavail.hash(state);
+ self.f_files.hash(state);
+ self.f_ffree.hash(state);
+ self.f_favail.hash(state);
+ self.f_syncwrites.hash(state);
+ self.f_syncreads.hash(state);
+ self.f_asyncwrites.hash(state);
+ self.f_asyncreads.hash(state);
+ self.f_fsid.hash(state);
+ self.f_namemax.hash(state);
+ self.f_owner.hash(state);
+ self.f_ctime.hash(state);
+ self.f_fstypename.hash(state);
+ self.f_mntonname.hash(state);
+ self.f_mntfromname.hash(state);
+ self.f_mntfromspec.hash(state);
+ self.mount_info.hash(state);
+ }
+ }
+ }
+ }
}
}
@@ -758,12 +1075,15 @@ pub const TMP_MAX : ::c_uint = 0x7fffffff;
pub const NI_MAXHOST: ::size_t = 256;
pub const RTLD_LOCAL: ::c_int = 0;
+
pub const CTL_MAXNAME: ::c_int = 12;
+
pub const CTLTYPE_NODE: ::c_int = 1;
pub const CTLTYPE_INT: ::c_int = 2;
pub const CTLTYPE_STRING: ::c_int = 3;
pub const CTLTYPE_QUAD: ::c_int = 4;
pub const CTLTYPE_STRUCT: ::c_int = 5;
+
pub const CTL_UNSPEC: ::c_int = 0;
pub const CTL_KERN: ::c_int = 1;
pub const CTL_VM: ::c_int = 2;
@@ -775,7 +1095,9 @@ pub const CTL_MACHDEP: ::c_int = 7;
pub const CTL_DDB: ::c_int = 9;
pub const CTL_VFS: ::c_int = 10;
pub const CTL_MAXID: ::c_int = 11;
+
pub const HW_NCPUONLINE: ::c_int = 25;
+
pub const KERN_OSTYPE: ::c_int = 1;
pub const KERN_OSRELEASE: ::c_int = 2;
pub const KERN_OSREV: ::c_int = 3;
@@ -852,7 +1174,9 @@ pub const KERN_CONSBUFSIZE: ::c_int = 82;
pub const KERN_CONSBUF: ::c_int = 83;
pub const KERN_AUDIO: ::c_int = 84;
pub const KERN_CPUSTATS: ::c_int = 85;
-pub const KERN_MAXID: ::c_int = 86;
+pub const KERN_PFSTATUS: ::c_int = 86;
+pub const KERN_MAXID: ::c_int = 87;
+
pub const KERN_PROC_ALL: ::c_int = 0;
pub const KERN_PROC_PID: ::c_int = 1;
pub const KERN_PROC_PGRP: ::c_int = 2;
@@ -862,13 +1186,16 @@ pub const KERN_PROC_UID: ::c_int = 5;
pub const KERN_PROC_RUID: ::c_int = 6;
pub const KERN_PROC_KTHREAD: ::c_int = 7;
pub const KERN_PROC_SHOW_THREADS: ::c_int = 0x40000000;
+
pub const KERN_SYSVIPC_MSG_INFO: ::c_int = 1;
pub const KERN_SYSVIPC_SEM_INFO: ::c_int = 2;
pub const KERN_SYSVIPC_SHM_INFO: ::c_int = 3;
+
pub const KERN_PROC_ARGV: ::c_int = 1;
pub const KERN_PROC_NARGV: ::c_int = 2;
pub const KERN_PROC_ENV: ::c_int = 3;
pub const KERN_PROC_NENV: ::c_int = 4;
+
pub const KI_NGROUPS: ::c_int = 16;
pub const KI_MAXCOMLEN: ::c_int = 24;
pub const KI_WMESGLEN: ::c_int = 8;
@@ -880,6 +1207,92 @@ pub const OLCUC: ::tcflag_t = 0x20;
pub const ONOCR: ::tcflag_t = 0x40;
pub const ONLRET: ::tcflag_t = 0x80;
+//https://github.com/openbsd/src/blob/master/sys/sys/mount.h
+pub const ISOFSMNT_NORRIP: ::c_int = 0x1; // disable Rock Ridge Ext
+pub const ISOFSMNT_GENS: ::c_int = 0x2; // enable generation numbers
+pub const ISOFSMNT_EXTATT: ::c_int = 0x4; // enable extended attr
+pub const ISOFSMNT_NOJOLIET: ::c_int = 0x8; // disable Joliet Ext
+pub const ISOFSMNT_SESS: ::c_int = 0x10; // use iso_args.sess
+
+pub const NFS_ARGSVERSION: ::c_int = 4; // change when nfs_args changes
+
+pub const NFSMNT_RESVPORT: ::c_int = 0; // always use reserved ports
+pub const NFSMNT_SOFT: ::c_int = 0x1; // soft mount (hard is default)
+pub const NFSMNT_WSIZE: ::c_int = 0x2; // set write size
+pub const NFSMNT_RSIZE: ::c_int = 0x4; // set read size
+pub const NFSMNT_TIMEO: ::c_int = 0x8; // set initial timeout
+pub const NFSMNT_RETRANS: ::c_int = 0x10; // set number of request retries
+pub const NFSMNT_MAXGRPS: ::c_int = 0x20; // set maximum grouplist size
+pub const NFSMNT_INT: ::c_int = 0x40; // allow interrupts on hard mount
+pub const NFSMNT_NOCONN: ::c_int = 0x80; // Don't Connect the socket
+pub const NFSMNT_NQNFS: ::c_int = 0x100; // Use Nqnfs protocol
+pub const NFSMNT_NFSV3: ::c_int = 0x200; // Use NFS Version 3 protocol
+pub const NFSMNT_KERB: ::c_int = 0x400; // Use Kerberos authentication
+pub const NFSMNT_DUMBTIMR: ::c_int = 0x800; // Don't estimate rtt dynamically
+pub const NFSMNT_LEASETERM: ::c_int = 0x1000; // set lease term (nqnfs)
+pub const NFSMNT_READAHEAD: ::c_int = 0x2000; // set read ahead
+pub const NFSMNT_DEADTHRESH: ::c_int = 0x4000; // set dead server retry thresh
+pub const NFSMNT_NOAC: ::c_int = 0x8000; // disable attribute cache
+pub const NFSMNT_RDIRPLUS: ::c_int = 0x10000; // Use Readdirplus for V3
+pub const NFSMNT_READDIRSIZE: ::c_int = 0x20000; // Set readdir size
+
+/* Flags valid only in mount syscall arguments */
+pub const NFSMNT_ACREGMIN: ::c_int = 0x40000; // acregmin field valid
+pub const NFSMNT_ACREGMAX: ::c_int = 0x80000; // acregmax field valid
+pub const NFSMNT_ACDIRMIN: ::c_int = 0x100000; // acdirmin field valid
+pub const NFSMNT_ACDIRMAX: ::c_int = 0x200000; // acdirmax field valid
+
+/* Flags valid only in kernel */
+pub const NFSMNT_INTERNAL: ::c_int = 0xfffc0000; // Bits set internally
+pub const NFSMNT_HASWRITEVERF: ::c_int = 0x40000; // Has write verifier for V3
+pub const NFSMNT_GOTPATHCONF: ::c_int = 0x80000; // Got the V3 pathconf info
+pub const NFSMNT_GOTFSINFO: ::c_int = 0x100000; // Got the V3 fsinfo
+pub const NFSMNT_MNTD: ::c_int = 0x200000; // Mnt server for mnt point
+pub const NFSMNT_DISMINPROG: ::c_int = 0x400000; // Dismount in progress
+pub const NFSMNT_DISMNT: ::c_int = 0x800000; // Dismounted
+pub const NFSMNT_SNDLOCK: ::c_int = 0x1000000; // Send socket lock
+pub const NFSMNT_WANTSND: ::c_int = 0x2000000; // Want above
+pub const NFSMNT_RCVLOCK: ::c_int = 0x4000000; // Rcv socket lock
+pub const NFSMNT_WANTRCV: ::c_int = 0x8000000; // Want above
+pub const NFSMNT_WAITAUTH: ::c_int = 0x10000000; // Wait for authentication
+pub const NFSMNT_HASAUTH: ::c_int = 0x20000000; // Has authenticator
+pub const NFSMNT_WANTAUTH: ::c_int = 0x40000000; // Wants an authenticator
+pub const NFSMNT_AUTHERR: ::c_int = 0x80000000; // Authentication error
+
+pub const MSDOSFSMNT_SHORTNAME: ::c_int = 0x1; // Force old DOS short names only
+pub const MSDOSFSMNT_LONGNAME: ::c_int = 0x2; // Force Win'95 long names
+pub const MSDOSFSMNT_NOWIN95: ::c_int = 0x4; // Completely ignore Win95 entries
+
+pub const NTFS_MFLAG_CASEINS: ::c_int = 0x1;
+pub const NTFS_MFLAG_ALLNAMES: ::c_int = 0x2;
+
+pub const TMPFS_ARGS_VERSION: ::c_int = 1;
+
+pub const MAP_STACK : ::c_int = 0x4000;
+
+// https://github.com/openbsd/src/blob/master/sys/net/if.h#L187
+pub const IFF_UP: ::c_int = 0x1; // interface is up
+pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid
+pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging
+pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net
+pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link
+pub const IFF_STATICARP: ::c_int = 0x20; // only static ARP
+pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated
+pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol
+pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets
+pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets
+pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress
+pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions
+pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit
+pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit
+pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit
+pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast
+
+pub const PTHREAD_STACK_MIN : ::size_t = 4096;
+pub const SIGSTKSZ : ::size_t = 28672;
+
+pub const PT_FIRSTMACH: ::c_int = 32;
+
pub const SOCK_CLOEXEC: ::c_int = 0x8000;
pub const SOCK_NONBLOCK: ::c_int = 0x4000;
pub const SOCK_DNS: ::c_int = 0x1000;
@@ -888,13 +1301,73 @@ pub const PTRACE_FORK: ::c_int = 0x0002;
pub const WCONTINUED: ::c_int = 8;
+fn _ALIGN(p: usize) -> usize {
+ (p + _ALIGNBYTES) & !_ALIGNBYTES
+}
+
f! {
pub fn WIFCONTINUED(status: ::c_int) -> bool {
status & 0o177777 == 0o177777
}
+
+ pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
+ (cmsg as *mut ::c_uchar)
+ .offset(_ALIGN(::mem::size_of::<::cmsghdr>()) as isize)
+ }
+
+ pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
+ _ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length
+ }
+
+ pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr)
+ -> *mut ::cmsghdr
+ {
+ if cmsg.is_null() {
+ return ::CMSG_FIRSTHDR(mhdr);
+ };
+ let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)
+ + _ALIGN(::mem::size_of::<::cmsghdr>());
+ let max = (*mhdr).msg_control as usize
+ + (*mhdr).msg_controllen as usize;
+ if next > max {
+ 0 as *mut ::cmsghdr
+ } else {
+ (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize))
+ as *mut ::cmsghdr
+ }
+ }
+
+ pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
+ (_ALIGN(::mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize))
+ as ::c_uint
+ }
+
+ pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
+ status >> 8
+ }
+
+ pub fn WIFSIGNALED(status: ::c_int) -> bool {
+ (status & 0o177) != 0o177 && (status & 0o177) != 0
+ }
+
+ pub fn WIFSTOPPED(status: ::c_int) -> bool {
+ (status & 0o177) == 0o177
+ }
}
extern {
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
+ pub fn accept4(s: ::c_int, addr: *mut ::sockaddr,
+ addrlen: *mut ::socklen_t, 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 pledge(promises: *const ::c_char,
+ execpromises: *const ::c_char) -> ::c_int;
+ pub fn strtonum(nptr: *const ::c_char, minval: ::c_longlong,
+ maxval: ::c_longlong,
+ errstr: *mut *const ::c_char) -> ::c_longlong;
+ pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int;
pub fn chflags(path: *const ::c_char, flags: ::c_uint) -> ::c_int;
pub fn fchflags(fd: ::c_int, flags: ::c_uint) -> ::c_int;
pub fn chflagsat(fd: ::c_int, path: *const ::c_char, flags: ::c_uint,
@@ -936,13 +1409,26 @@ extern {
}
cfg_if! {
- if #[cfg(target_os = "openbsd")] {
- mod openbsd;
- pub use self::openbsd::*;
- } else if #[cfg(target_os = "bitrig")] {
- mod bitrig;
- pub use self::bitrig::*;
+ if #[cfg(libc_union)] {
+ extern {
+ // these functions use statfs which uses the union mount_info:
+ pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int;
+ pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int;
+ }
+ }
+}
+
+cfg_if! {
+ if #[cfg(target_arch = "x86")] {
+ mod x86;
+ pub use self::x86::*;
+ } else if #[cfg(target_arch = "x86_64")] {
+ mod x86_64;
+ pub use self::x86_64::*;
+ } else if #[cfg(target_arch = "aarch64")] {
+ mod aarch64;
+ pub use self::aarch64::*;
} else {
- // Unknown target_os
+ // Unknown target_arch
}
}
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86.rs b/src/unix/bsd/netbsdlike/openbsd/x86.rs
index 05538cd0a9..05538cd0a9 100644
--- a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86.rs
+++ b/src/unix/bsd/netbsdlike/openbsd/x86.rs
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86_64.rs b/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
index 7daa9d8366..7daa9d8366 100644
--- a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/x86_64.rs
+++ b/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/mod.rs b/src/unix/bsd/netbsdlike/openbsdlike/bitrig/mod.rs
deleted file mode 100644
index f73d7de7b2..0000000000
--- a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/mod.rs
+++ /dev/null
@@ -1,129 +0,0 @@
-pub type c_char = i8;
-
-s! {
- pub struct glob_t {
- pub gl_pathc: ::c_int,
- pub gl_matchc: ::c_int,
- pub gl_offs: ::c_int,
- pub gl_flags: ::c_int,
- pub gl_pathv: *mut *mut ::c_char,
- __unused1: *mut ::c_void,
- __unused2: *mut ::c_void,
- __unused3: *mut ::c_void,
- __unused4: *mut ::c_void,
- __unused5: *mut ::c_void,
- __unused6: *mut ::c_void,
- __unused7: *mut ::c_void,
- }
-
- pub struct lconv {
- pub decimal_point: *mut ::c_char,
- pub thousands_sep: *mut ::c_char,
- pub grouping: *mut ::c_char,
- pub int_curr_symbol: *mut ::c_char,
- pub currency_symbol: *mut ::c_char,
- pub mon_decimal_point: *mut ::c_char,
- pub mon_thousands_sep: *mut ::c_char,
- pub mon_grouping: *mut ::c_char,
- pub positive_sign: *mut ::c_char,
- pub negative_sign: *mut ::c_char,
- pub int_frac_digits: ::c_char,
- pub frac_digits: ::c_char,
- pub p_cs_precedes: ::c_char,
- pub p_sep_by_space: ::c_char,
- pub n_cs_precedes: ::c_char,
- pub n_sep_by_space: ::c_char,
- pub p_sign_posn: ::c_char,
- pub n_sign_posn: ::c_char,
- pub int_p_cs_precedes: ::c_char,
- pub int_n_cs_precedes: ::c_char,
- pub int_p_sep_by_space: ::c_char,
- pub int_n_sep_by_space: ::c_char,
- pub int_p_sign_posn: ::c_char,
- pub int_n_sign_posn: ::c_char,
- }
-}
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << 0);
-pub const LC_CTYPE_MASK: ::c_int = (1 << 1);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << 2);
-pub const LC_MONETARY_MASK: ::c_int = (1 << 3);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << 4);
-pub const LC_TIME_MASK: ::c_int = (1 << 5);
-pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK
- | LC_CTYPE_MASK
- | LC_MESSAGES_MASK
- | LC_MONETARY_MASK
- | LC_NUMERIC_MASK
- | LC_TIME_MASK;
-
-pub const ERA: ::nl_item = 52;
-pub const ERA_D_FMT: ::nl_item = 53;
-pub const ERA_D_T_FMT: ::nl_item = 54;
-pub const ERA_T_FMT: ::nl_item = 55;
-pub const ALT_DIGITS: ::nl_item = 56;
-
-pub const D_MD_ORDER: ::nl_item = 57;
-
-pub const ALTMON_1: ::nl_item = 58;
-pub const ALTMON_2: ::nl_item = 59;
-pub const ALTMON_3: ::nl_item = 60;
-pub const ALTMON_4: ::nl_item = 61;
-pub const ALTMON_5: ::nl_item = 62;
-pub const ALTMON_6: ::nl_item = 63;
-pub const ALTMON_7: ::nl_item = 64;
-pub const ALTMON_8: ::nl_item = 65;
-pub const ALTMON_9: ::nl_item = 66;
-pub const ALTMON_10: ::nl_item = 67;
-pub const ALTMON_11: ::nl_item = 68;
-pub const ALTMON_12: ::nl_item = 69;
-
-pub const KERN_RND: ::c_int = 31;
-
-// https://github.com/bitrig/bitrig/blob/master/sys/net/if.h#L187
-pub const IFF_UP: ::c_int = 0x1; // interface is up
-pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid
-pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging
-pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net
-pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link
-pub const IFF_NOTRAILERS: ::c_int = 0x20; // avoid use of trailers
-pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated
-pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol
-pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets
-pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets
-pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress
-pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions
-pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit
-pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit
-pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit
-pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast
-
-pub const PTHREAD_STACK_MIN : ::size_t = 2048;
-pub const SIGSTKSZ : ::size_t = 40960;
-
-pub const PT_FIRSTMACH: ::c_int = 32;
-
-extern {
- pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
- pub fn duplocale(base: ::locale_t) -> ::locale_t;
- pub fn freelocale(loc: ::locale_t) -> ::c_int;
- 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 pledge(promises: *const ::c_char,
- paths: *mut *const ::c_char) -> ::c_int;
- pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char;
-}
-
-cfg_if! {
- if #[cfg(target_arch = "x86")] {
- mod x86;
- pub use self::x86::*;
- } else if #[cfg(target_arch = "x86_64")] {
- mod x86_64;
- pub use self::x86_64::*;
- } else {
- // Unknown target_arch
- }
-}
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86.rs b/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86.rs
deleted file mode 100644
index 9b0b338b91..0000000000
--- a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86_64.rs b/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86_64.rs
deleted file mode 100644
index d3971aa35b..0000000000
--- a/src/unix/bsd/netbsdlike/openbsdlike/bitrig/x86_64.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use PT_FIRSTMACH;
-
-pub type c_long = i64;
-pub type c_ulong = u64;
-
-pub const PT_STEP: ::c_int = PT_FIRSTMACH + 0;
-pub const PT_GETREGS: ::c_int = PT_FIRSTMACH + 1;
-pub const PT_SETREGS: ::c_int = PT_FIRSTMACH + 2;
-pub const PT_GETFPREGS: ::c_int = PT_FIRSTMACH + 3;
-pub const PT_SETFPREGS: ::c_int = PT_FIRSTMACH + 4;
diff --git a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsdlike/openbsd/mod.rs
deleted file mode 100644
index c1687111b7..0000000000
--- a/src/unix/bsd/netbsdlike/openbsdlike/openbsd/mod.rs
+++ /dev/null
@@ -1,497 +0,0 @@
-s! {
- pub struct glob_t {
- pub gl_pathc: ::size_t,
- pub gl_matchc: ::size_t,
- pub gl_offs: ::size_t,
- pub gl_flags: ::c_int,
- pub gl_pathv: *mut *mut ::c_char,
- __unused1: *mut ::c_void,
- __unused2: *mut ::c_void,
- __unused3: *mut ::c_void,
- __unused4: *mut ::c_void,
- __unused5: *mut ::c_void,
- __unused6: *mut ::c_void,
- __unused7: *mut ::c_void,
- }
-
- pub struct lconv {
- pub decimal_point: *mut ::c_char,
- pub thousands_sep: *mut ::c_char,
- pub grouping: *mut ::c_char,
- pub int_curr_symbol: *mut ::c_char,
- pub currency_symbol: *mut ::c_char,
- pub mon_decimal_point: *mut ::c_char,
- pub mon_thousands_sep: *mut ::c_char,
- pub mon_grouping: *mut ::c_char,
- pub positive_sign: *mut ::c_char,
- pub negative_sign: *mut ::c_char,
- pub int_frac_digits: ::c_char,
- pub frac_digits: ::c_char,
- pub p_cs_precedes: ::c_char,
- pub p_sep_by_space: ::c_char,
- pub n_cs_precedes: ::c_char,
- pub n_sep_by_space: ::c_char,
- pub p_sign_posn: ::c_char,
- pub n_sign_posn: ::c_char,
- pub int_p_cs_precedes: ::c_char,
- pub int_p_sep_by_space: ::c_char,
- pub int_n_cs_precedes: ::c_char,
- pub int_n_sep_by_space: ::c_char,
- pub int_p_sign_posn: ::c_char,
- pub int_n_sign_posn: ::c_char,
- }
-
- pub struct ufs_args {
- pub fspec: *mut ::c_char,
- pub export_info: export_args,
- }
-
- pub struct mfs_args {
- pub fspec: *mut ::c_char,
- pub export_info: export_args,
- // https://github.com/openbsd/src/blob/master/sys/sys/types.h#L134
- pub base: *mut ::c_char,
- pub size: ::c_ulong,
- }
-
- pub struct iso_args {
- pub fspec: *mut ::c_char,
- pub export_info: export_args,
- pub flags: ::c_int,
- pub sess: ::c_int,
- }
-
- pub struct nfs_args {
- pub version: ::c_int,
- pub addr: *mut ::sockaddr,
- pub addrlen: ::c_int,
- pub sotype: ::c_int,
- pub proto: ::c_int,
- pub fh: *mut ::c_uchar,
- pub fhsize: ::c_int,
- pub flags: ::c_int,
- pub wsize: ::c_int,
- pub rsize: ::c_int,
- pub readdirsize: ::c_int,
- pub timeo: ::c_int,
- pub retrans: ::c_int,
- pub maxgrouplist: ::c_int,
- pub readahead: ::c_int,
- pub leaseterm: ::c_int,
- pub deadthresh: ::c_int,
- pub hostname: *mut ::c_char,
- pub acregmin: ::c_int,
- pub acregmax: ::c_int,
- pub acdirmin: ::c_int,
- pub acdirmax: ::c_int,
- }
-
- pub struct msdosfs_args {
- pub fspec: *mut ::c_char,
- pub export_info: export_args,
- pub uid: ::uid_t,
- pub gid: ::gid_t,
- pub mask: ::mode_t,
- pub flags: ::c_int,
- }
-
- pub struct ntfs_args {
- pub fspec: *mut ::c_char,
- pub export_info: export_args,
- pub uid: ::uid_t,
- pub gid: ::gid_t,
- pub mode: ::mode_t,
- pub flag: ::c_ulong,
- }
-
- pub struct udf_args {
- pub fspec: *mut ::c_char,
- pub lastblock: ::uint32_t,
- }
-
- pub struct tmpfs_args {
- pub ta_version: ::c_int,
- pub ta_nodes_max: ::ino_t,
- pub ta_size_max: ::off_t,
- pub ta_root_uid: ::uid_t,
- pub ta_root_gid: ::gid_t,
- pub ta_root_mode: ::mode_t,
- }
-
- pub struct fusefs_args {
- pub name: *mut ::c_char,
- pub fd: ::c_int,
- pub max_read: ::c_int,
- pub allow_other: ::c_int,
- }
-
- pub struct xucred {
- pub cr_uid: ::uid_t,
- pub cr_gid: ::gid_t,
- pub cr_ngroups: ::c_short,
- //https://github.com/openbsd/src/blob/master/sys/sys/syslimits.h#L44
- pub cr_groups: [::gid_t; 16],
- }
-
- pub struct export_args {
- pub ex_flags: ::c_int,
- pub ex_root: ::uid_t,
- pub ex_anon: xucred,
- pub ex_addr: *mut ::sockaddr,
- pub ex_addrlen: ::c_int,
- pub ex_mask: *mut ::sockaddr,
- pub ex_masklen: ::c_int,
- }
-}
-
-s_no_extra_traits! {
- pub union mount_info {
- pub ufs_args: ufs_args,
- pub mfs_args: mfs_args,
- pub nfs_args: nfs_args,
- pub iso_args: iso_args,
- pub msdosfs_args: msdosfs_args,
- pub ntfs_args: ntfs_args,
- pub tmpfs_args: tmpfs_args,
- align: [::c_char; 160],
- }
-}
-
-cfg_if! {
- if #[cfg(feature = "extra_traits")] {
- impl PartialEq for mount_info {
- fn eq(&self, other: &mount_info) -> bool {
- unsafe {
- self.align
- .iter()
- .zip(other.align.iter())
- .all(|(a,b)| a == b)
- }
- }
- }
-
- impl Eq for mount_info { }
-
- impl ::fmt::Debug for mount_info {
- fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
- f.debug_struct("mount_info")
- // FIXME: .field("align", &self.align)
- .finish()
- }
- }
-
- impl ::hash::Hash for mount_info {
- fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
- unsafe { self.align.hash(state) };
- }
- }
- }
-}
-
-cfg_if! {
- if #[cfg(libc_union)] {
- s_no_extra_traits! {
- // This type uses the union mount_info:
- pub struct statfs {
- pub f_flags: ::uint32_t,
- pub f_bsize: ::uint32_t,
- pub f_iosize: ::uint32_t,
- pub f_blocks: ::uint64_t,
- pub f_bfree: ::uint64_t,
- pub f_bavail: ::int64_t,
- pub f_files: ::uint64_t,
- pub f_ffree: ::uint64_t,
- pub f_favail: ::int64_t,
- pub f_syncwrites: ::uint64_t,
- pub f_syncreads: ::uint64_t,
- pub f_asyncwrites: ::uint64_t,
- pub f_asyncreads: ::uint64_t,
- pub f_fsid: ::fsid_t,
- pub f_namemax: ::uint32_t,
- pub f_owner: ::uid_t,
- pub f_ctime: ::uint64_t,
- pub f_fstypename: [::c_char; 16],
- pub f_mntonname: [::c_char; 90],
- pub f_mntfromname: [::c_char; 90],
- pub f_mntfromspec: [::c_char; 90],
- pub mount_info: mount_info,
- }
- }
-
- cfg_if! {
- if #[cfg(feature = "extra_traits")] {
- impl PartialEq for statfs {
- fn eq(&self, other: &statfs) -> bool {
- self.f_flags == other.f_flags
- && self.f_bsize == other.f_bsize
- && self.f_iosize == other.f_iosize
- && self.f_blocks == other.f_blocks
- && self.f_bfree == other.f_bfree
- && self.f_bavail == other.f_bavail
- && self.f_files == other.f_files
- && self.f_ffree == other.f_ffree
- && self.f_favail == other.f_favail
- && self.f_syncwrites == other.f_syncwrites
- && self.f_syncreads == other.f_syncreads
- && self.f_asyncwrites == other.f_asyncwrites
- && self.f_asyncreads == other.f_asyncreads
- && self.f_fsid == other.f_fsid
- && self.f_namemax == other.f_namemax
- && self.f_owner == other.f_owner
- && self.f_ctime == other.f_ctime
- && self.f_fstypename
- .iter()
- .zip(other.f_fstypename.iter())
- .all(|(a,b)| a == b)
- && self.f_mntonname
- .iter()
- .zip(other.f_mntonname.iter())
- .all(|(a,b)| a == b)
- && self.f_mntfromname
- .iter()
- .zip(other.f_mntfromname.iter())
- .all(|(a,b)| a == b)
- && self.f_mntfromspec
- .iter()
- .zip(other.f_mntfromspec.iter())
- .all(|(a,b)| a == b)
- && self.mount_info == other.mount_info
- }
- }
-
- impl Eq for statfs { }
-
- impl ::fmt::Debug for statfs {
- fn fmt(&self, f: &mut ::fmt::Formatter)
- -> ::fmt::Result {
- f.debug_struct("statfs")
- .field("f_flags", &self.f_flags)
- .field("f_bsize", &self.f_bsize)
- .field("f_iosize", &self.f_iosize)
- .field("f_blocks", &self.f_blocks)
- .field("f_bfree", &self.f_bfree)
- .field("f_bavail", &self.f_bavail)
- .field("f_files", &self.f_files)
- .field("f_ffree", &self.f_ffree)
- .field("f_favail", &self.f_favail)
- .field("f_syncwrites", &self.f_syncwrites)
- .field("f_syncreads", &self.f_syncreads)
- .field("f_asyncwrites", &self.f_asyncwrites)
- .field("f_asyncreads", &self.f_asyncreads)
- .field("f_fsid", &self.f_fsid)
- .field("f_namemax", &self.f_namemax)
- .field("f_owner", &self.f_owner)
- .field("f_ctime", &self.f_ctime)
- // FIXME: .field("f_fstypename", &self.f_fstypename)
- // FIXME: .field("f_mntonname", &self.f_mntonname)
- // FIXME: .field("f_mntfromname", &self.f_mntfromname)
- // FIXME: .field("f_mntfromspec", &self.f_mntfromspec)
- .field("mount_info", &self.mount_info)
- .finish()
- }
- }
-
- impl ::hash::Hash for statfs {
- fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
- self.f_flags.hash(state);
- self.f_bsize.hash(state);
- self.f_iosize.hash(state);
- self.f_blocks.hash(state);
- self.f_bfree.hash(state);
- self.f_bavail.hash(state);
- self.f_files.hash(state);
- self.f_ffree.hash(state);
- self.f_favail.hash(state);
- self.f_syncwrites.hash(state);
- self.f_syncreads.hash(state);
- self.f_asyncwrites.hash(state);
- self.f_asyncreads.hash(state);
- self.f_fsid.hash(state);
- self.f_namemax.hash(state);
- self.f_owner.hash(state);
- self.f_ctime.hash(state);
- self.f_fstypename.hash(state);
- self.f_mntonname.hash(state);
- self.f_mntfromname.hash(state);
- self.f_mntfromspec.hash(state);
- self.mount_info.hash(state);
- }
- }
- }
- }
- }
-}
-
-//https://github.com/openbsd/src/blob/master/sys/sys/mount.h
-pub const ISOFSMNT_NORRIP: ::c_int = 0x1; // disable Rock Ridge Ext
-pub const ISOFSMNT_GENS: ::c_int = 0x2; // enable generation numbers
-pub const ISOFSMNT_EXTATT: ::c_int = 0x4; // enable extended attr
-pub const ISOFSMNT_NOJOLIET: ::c_int = 0x8; // disable Joliet Ext
-pub const ISOFSMNT_SESS: ::c_int = 0x10; // use iso_args.sess
-
-pub const NFS_ARGSVERSION: ::c_int = 4; // change when nfs_args changes
-
-pub const NFSMNT_RESVPORT: ::c_int = 0; // always use reserved ports
-pub const NFSMNT_SOFT: ::c_int = 0x1; // soft mount (hard is default)
-pub const NFSMNT_WSIZE: ::c_int = 0x2; // set write size
-pub const NFSMNT_RSIZE: ::c_int = 0x4; // set read size
-pub const NFSMNT_TIMEO: ::c_int = 0x8; // set initial timeout
-pub const NFSMNT_RETRANS: ::c_int = 0x10; // set number of request retries
-pub const NFSMNT_MAXGRPS: ::c_int = 0x20; // set maximum grouplist size
-pub const NFSMNT_INT: ::c_int = 0x40; // allow interrupts on hard mount
-pub const NFSMNT_NOCONN: ::c_int = 0x80; // Don't Connect the socket
-pub const NFSMNT_NQNFS: ::c_int = 0x100; // Use Nqnfs protocol
-pub const NFSMNT_NFSV3: ::c_int = 0x200; // Use NFS Version 3 protocol
-pub const NFSMNT_KERB: ::c_int = 0x400; // Use Kerberos authentication
-pub const NFSMNT_DUMBTIMR: ::c_int = 0x800; // Don't estimate rtt dynamically
-pub const NFSMNT_LEASETERM: ::c_int = 0x1000; // set lease term (nqnfs)
-pub const NFSMNT_READAHEAD: ::c_int = 0x2000; // set read ahead
-pub const NFSMNT_DEADTHRESH: ::c_int = 0x4000; // set dead server retry thresh
-pub const NFSMNT_NOAC: ::c_int = 0x8000; // disable attribute cache
-pub const NFSMNT_RDIRPLUS: ::c_int = 0x10000; // Use Readdirplus for V3
-pub const NFSMNT_READDIRSIZE: ::c_int = 0x20000; // Set readdir size
-
-/* Flags valid only in mount syscall arguments */
-pub const NFSMNT_ACREGMIN: ::c_int = 0x40000; // acregmin field valid
-pub const NFSMNT_ACREGMAX: ::c_int = 0x80000; // acregmax field valid
-pub const NFSMNT_ACDIRMIN: ::c_int = 0x100000; // acdirmin field valid
-pub const NFSMNT_ACDIRMAX: ::c_int = 0x200000; // acdirmax field valid
-
-/* Flags valid only in kernel */
-pub const NFSMNT_INTERNAL: ::c_int = 0xfffc0000; // Bits set internally
-pub const NFSMNT_HASWRITEVERF: ::c_int = 0x40000; // Has write verifier for V3
-pub const NFSMNT_GOTPATHCONF: ::c_int = 0x80000; // Got the V3 pathconf info
-pub const NFSMNT_GOTFSINFO: ::c_int = 0x100000; // Got the V3 fsinfo
-pub const NFSMNT_MNTD: ::c_int = 0x200000; // Mnt server for mnt point
-pub const NFSMNT_DISMINPROG: ::c_int = 0x400000; // Dismount in progress
-pub const NFSMNT_DISMNT: ::c_int = 0x800000; // Dismounted
-pub const NFSMNT_SNDLOCK: ::c_int = 0x1000000; // Send socket lock
-pub const NFSMNT_WANTSND: ::c_int = 0x2000000; // Want above
-pub const NFSMNT_RCVLOCK: ::c_int = 0x4000000; // Rcv socket lock
-pub const NFSMNT_WANTRCV: ::c_int = 0x8000000; // Want above
-pub const NFSMNT_WAITAUTH: ::c_int = 0x10000000; // Wait for authentication
-pub const NFSMNT_HASAUTH: ::c_int = 0x20000000; // Has authenticator
-pub const NFSMNT_WANTAUTH: ::c_int = 0x40000000; // Wants an authenticator
-pub const NFSMNT_AUTHERR: ::c_int = 0x80000000; // Authentication error
-
-pub const MSDOSFSMNT_SHORTNAME: ::c_int = 0x1; // Force old DOS short names only
-pub const MSDOSFSMNT_LONGNAME: ::c_int = 0x2; // Force Win'95 long names
-pub const MSDOSFSMNT_NOWIN95: ::c_int = 0x4; // Completely ignore Win95 entries
-
-pub const NTFS_MFLAG_CASEINS: ::c_int = 0x1;
-pub const NTFS_MFLAG_ALLNAMES: ::c_int = 0x2;
-
-pub const TMPFS_ARGS_VERSION: ::c_int = 1;
-
-pub const MAP_STACK : ::c_int = 0x4000;
-
-// https://github.com/openbsd/src/blob/master/sys/net/if.h#L187
-pub const IFF_UP: ::c_int = 0x1; // interface is up
-pub const IFF_BROADCAST: ::c_int = 0x2; // broadcast address valid
-pub const IFF_DEBUG: ::c_int = 0x4; // turn on debugging
-pub const IFF_LOOPBACK: ::c_int = 0x8; // is a loopback net
-pub const IFF_POINTOPOINT: ::c_int = 0x10; // interface is point-to-point link
-pub const IFF_STATICARP: ::c_int = 0x20; // only static ARP
-pub const IFF_RUNNING: ::c_int = 0x40; // resources allocated
-pub const IFF_NOARP: ::c_int = 0x80; // no address resolution protocol
-pub const IFF_PROMISC: ::c_int = 0x100; // receive all packets
-pub const IFF_ALLMULTI: ::c_int = 0x200; // receive all multicast packets
-pub const IFF_OACTIVE: ::c_int = 0x400; // transmission in progress
-pub const IFF_SIMPLEX: ::c_int = 0x800; // can't hear own transmissions
-pub const IFF_LINK0: ::c_int = 0x1000; // per link layer defined bit
-pub const IFF_LINK1: ::c_int = 0x2000; // per link layer defined bit
-pub const IFF_LINK2: ::c_int = 0x4000; // per link layer defined bit
-pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast
-
-pub const PTHREAD_STACK_MIN : ::size_t = 4096;
-pub const SIGSTKSZ : ::size_t = 28672;
-
-pub const PT_FIRSTMACH: ::c_int = 32;
-
-fn _ALIGN(p: usize) -> usize {
- (p + _ALIGNBYTES) & !_ALIGNBYTES
-}
-
-f! {
- pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar {
- (cmsg as *mut ::c_uchar)
- .offset(_ALIGN(::mem::size_of::<::cmsghdr>()) as isize)
- }
-
- pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint {
- _ALIGN(::mem::size_of::<::cmsghdr>()) as ::c_uint + length
- }
-
- pub fn CMSG_NXTHDR(mhdr: *const ::msghdr, cmsg: *const ::cmsghdr)
- -> *mut ::cmsghdr
- {
- if cmsg.is_null() {
- return ::CMSG_FIRSTHDR(mhdr);
- };
- let next = cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)
- + _ALIGN(::mem::size_of::<::cmsghdr>());
- let max = (*mhdr).msg_control as usize
- + (*mhdr).msg_controllen as usize;
- if next > max {
- 0 as *mut ::cmsghdr
- } else {
- (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize))
- as *mut ::cmsghdr
- }
- }
-
- pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint {
- (_ALIGN(::mem::size_of::<::cmsghdr>()) + _ALIGN(length as usize))
- as ::c_uint
- }
-
- pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
- status >> 8
- }
-
- pub fn WIFSIGNALED(status: ::c_int) -> bool {
- (status & 0o177) != 0o177 && (status & 0o177) != 0
- }
-
- pub fn WIFSTOPPED(status: ::c_int) -> bool {
- (status & 0o177) == 0o177
- }
-}
-
-extern {
- pub fn accept4(s: ::c_int, addr: *mut ::sockaddr,
- addrlen: *mut ::socklen_t, 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 pledge(promises: *const ::c_char,
- execpromises: *const ::c_char) -> ::c_int;
- pub fn strtonum(nptr: *const ::c_char, minval: ::c_longlong,
- maxval: ::c_longlong,
- errstr: *mut *const ::c_char) -> ::c_longlong;
- pub fn dup3(src: ::c_int, dst: ::c_int, flags: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
- if #[cfg(libc_union)] {
- extern {
- // these functions use statfs which uses the union mount_info:
- pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int;
- pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int;
- }
- }
-}
-
-cfg_if! {
- if #[cfg(target_arch = "x86")] {
- mod x86;
- pub use self::x86::*;
- } else if #[cfg(target_arch = "x86_64")] {
- mod x86_64;
- pub use self::x86_64::*;
- } else if #[cfg(target_arch = "aarch64")] {
- mod aarch64;
- pub use self::aarch64::*;
- } else {
- // Unknown target_arch
- }
-}
diff --git a/src/unix/haiku/mod.rs b/src/unix/haiku/mod.rs
index bcf4613ddc..885c83991f 100644
--- a/src/unix/haiku/mod.rs
+++ b/src/unix/haiku/mod.rs
@@ -1209,6 +1209,9 @@ f! {
}
extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn abs(i: ::c_int) -> ::c_int;
pub fn atof(s: *const ::c_char) -> ::c_double;
pub fn labs(i: ::c_long) -> ::c_long;
@@ -1264,7 +1267,8 @@ extern {
errno: ::c_int) -> ::c_int>,
pglob: *mut ::glob_t) -> ::c_int;
pub fn globfree(pglob: *mut ::glob_t);
-
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-> ::c_int;
@@ -1306,7 +1310,7 @@ extern {
pub fn execvpe(file: *const ::c_char, argv: *const *const ::c_char,
environment: *const *const ::c_char) -> ::c_int;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
diff --git a/src/unix/hermit/mod.rs b/src/unix/hermit/mod.rs
index 288cc46a50..4c57811630 100644
--- a/src/unix/hermit/mod.rs
+++ b/src/unix/hermit/mod.rs
@@ -964,6 +964,9 @@ f! {
}
extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn sem_destroy(sem: *mut sem_t) -> ::c_int;
pub fn sem_init(sem: *mut sem_t,
pshared: ::c_int,
@@ -981,6 +984,8 @@ extern {
pub fn clock_gettime(clock_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int;
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn getpwuid_r(uid: ::uid_t, pwd: *mut passwd, buf: *mut ::c_char,
buflen: ::size_t, result: *mut *mut passwd) -> ::c_int;
diff --git a/src/unix/mod.rs b/src/unix/mod.rs
index e96eb51b1b..3d98624e58 100644
--- a/src/unix/mod.rs
+++ b/src/unix/mod.rs
@@ -45,12 +45,7 @@ impl ::Copy for DIR {}
impl ::Clone for DIR {
fn clone(&self) -> DIR { *self }
}
-#[cfg_attr(feature = "extra_traits", derive(Debug))]
-pub enum locale_t {}
-impl ::Copy for locale_t {}
-impl ::Clone for locale_t {
- fn clone(&self) -> locale_t { *self }
-}
+pub type locale_t = *mut :: c_void;
s! {
pub struct group {
@@ -223,7 +218,11 @@ pub const DT_REG: u8 = 8;
pub const DT_LNK: u8 = 10;
pub const DT_SOCK: u8 = 12;
-pub const FD_CLOEXEC: ::c_int = 0x1;
+cfg_if! {
+ if #[cfg(not(target_os = "redox"))] {
+ pub const FD_CLOEXEC: ::c_int = 0x1;
+ }
+}
pub const USRQUOTA: ::c_int = 0;
pub const GRPQUOTA: ::c_int = 1;
@@ -303,7 +302,7 @@ pub const ATF_USETRAILERS: ::c_int = 0x10;
cfg_if! {
if #[cfg(target_os = "l4re")] {
// required libraries for L4Re are linked externally, ATM
- } else if #[cfg(feature = "use_std")] {
+ } else if #[cfg(feature = "std")] {
// cargo build, don't pull in anything extra as the libstd dep
// already pulls in all libs.
} else if #[cfg(target_env = "musl")] {
@@ -327,8 +326,7 @@ cfg_if! {
} else if #[cfg(any(target_os = "macos",
target_os = "ios",
target_os = "android",
- target_os = "openbsd",
- target_os = "bitrig"))] {
+ target_os = "openbsd"))] {
#[link(name = "c")]
#[link(name = "m")]
extern {}
@@ -349,6 +347,13 @@ cfg_if! {
#[link(name = "c")]
#[link(name = "m")]
extern {}
+ } else if #[cfg(target_os = "redox")] {
+ #[cfg_attr(feature = "rustc-dep-of-std",
+ link(name = "c", kind = "static-nobundle",
+ cfg(target_feature = "crt-static")))]
+ #[cfg_attr(feature = "rustc-dep-of-std",
+ link(name = "c", cfg(not(target_feature = "crt-static"))))]
+ extern {}
} else {
#[link(name = "c")]
#[link(name = "m")]
@@ -512,8 +517,11 @@ extern {
pub fn snprintf(s: *mut ::c_char, n: ::size_t,
format: *const ::c_char, ...) -> ::c_int;
pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int;
+ #[cfg_attr(target_os = "linux", link_name = "__isoc99_fscanf")]
pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int;
+ #[cfg_attr(target_os = "linux", link_name = "__isoc99_scanf")]
pub fn scanf(format: *const ::c_char, ...) -> ::c_int;
+ #[cfg_attr(target_os = "linux", link_name = "__isoc99_sscanf")]
pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int;
pub fn getchar_unlocked() -> ::c_int;
pub fn putchar_unlocked(c: ::c_int) -> ::c_int;
@@ -612,9 +620,13 @@ extern {
pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent;
#[cfg_attr(target_os = "macos", link_name = "readdir_r$INODE64")]
#[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")]
- #[cfg_attr(any(target_os = "solaris", target_os = "illumos"),
- link_name = "__posix_readdir_r")]
#[cfg_attr(target_os = "freebsd", link_name = "readdir_r@FBSD_1.0")]
+ /// The 64-bit libc on Solaris and illumos only has readdir_r. If a
+ /// 32-bit Solaris or illumos target is ever created, it should use
+ /// __posix_readdir_r. See libc(3LIB) on Solaris or illumos:
+ /// https://illumos.org/man/3lib/libc
+ /// https://docs.oracle.com/cd/E36784_01/html/E36873/libc-3lib.html
+ /// https://www.unix.com/man-page/opensolaris/3LIB/libc/
pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent,
result: *mut *mut ::dirent) -> ::c_int;
#[cfg_attr(all(target_os = "macos", target_arch = "x86"),
@@ -832,9 +844,6 @@ extern {
pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int;
- #[cfg_attr(target_os = "netbsd", link_name = "__gettimeofday50")]
- pub fn gettimeofday(tp: *mut ::timeval,
- tz: *mut ::c_void) -> ::c_int;
#[cfg_attr(target_os = "netbsd", link_name = "__times13")]
pub fn times(buf: *mut ::tms) -> ::clock_t;
@@ -917,10 +926,6 @@ extern {
pub fn pthread_rwlockattr_init(attr: *mut pthread_rwlockattr_t) -> ::c_int;
pub fn pthread_rwlockattr_destroy(attr: *mut pthread_rwlockattr_t)
-> ::c_int;
- #[cfg_attr(all(target_os = "linux", not(target_env = "musl")),
- link_name = "__xpg_strerror_r")]
- pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
- buflen: ::size_t) -> ::c_int;
#[cfg_attr(target_os = "illumos", link_name = "__xnet_getsockopt")]
pub fn getsockopt(sockfd: ::c_int,
@@ -1143,8 +1148,7 @@ cfg_if! {
target_os = "freebsd",
target_os = "dragonfly",
target_os = "openbsd",
- target_os = "netbsd",
- target_os = "bitrig"))] {
+ target_os = "netbsd"))] {
mod bsd;
pub use self::bsd::*;
} else if #[cfg(any(target_os = "solaris",
@@ -1157,6 +1161,9 @@ cfg_if! {
} else if #[cfg(target_os = "hermit")] {
mod hermit;
pub use self::hermit::*;
+ } else if #[cfg(target_os = "redox")] {
+ mod redox;
+ pub use self::redox::*;
} else {
// Unknown target_os
}
diff --git a/src/unix/newlib/mod.rs b/src/unix/newlib/mod.rs
index e2c7fca076..93798e58b5 100644
--- a/src/unix/newlib/mod.rs
+++ b/src/unix/newlib/mod.rs
@@ -406,7 +406,8 @@ pub const SEEK_SET: ::c_int = 0;
pub const SEEK_CUR: ::c_int = 1;
pub const SEEK_END: ::c_int = 2;
-pub const FIONBIO: ::c_int = 1;
+pub const FIONBIO: ::c_ulong = 1;
+pub const FIOCLEX: ::c_ulong = 0x20006601;
pub const S_BLKSIZE: ::mode_t = 1024;
pub const S_IREAD: ::mode_t = 256;
@@ -457,15 +458,41 @@ pub const SHUT_RD: ::c_int = 0;
pub const SHUT_WR: ::c_int = 1;
pub const SHUT_RDWR: ::c_int = 2;
-pub const SO_REUSEADDR: ::c_int = 4;
-pub const SO_LINGER: ::c_int = 128;
-pub const SO_OOBINLINE: ::c_int = 256;
-pub const SO_SNDBUF: ::c_int = 4097;
-pub const SO_RCVBUF: ::c_int = 4098;
-pub const SO_SNDLOWAT: ::c_int = 4099;
-pub const SO_RCVLOWAT: ::c_int = 4100;
-pub const SO_TYPE: ::c_int = 4104;
-pub const SO_ERROR: ::c_int = 4105;
+pub const SO_BINTIME: ::c_int = 0x2000;
+pub const SO_NO_OFFLOAD: ::c_int = 0x4000;
+pub const SO_NO_DDP: ::c_int = 0x8000;
+pub const SO_REUSEPORT_LB: ::c_int = 0x10000;
+pub const SO_LABEL: ::c_int = 0x1009;
+pub const SO_PEERLABEL: ::c_int = 0x1010;
+pub const SO_LISTENQLIMIT: ::c_int = 0x1011;
+pub const SO_LISTENQLEN: ::c_int = 0x1012;
+pub const SO_LISTENINCQLEN: ::c_int = 0x1013;
+pub const SO_SETFIB: ::c_int = 0x1014;
+pub const SO_USER_COOKIE: ::c_int = 0x1015;
+pub const SO_PROTOCOL: ::c_int = 0x1016;
+pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL;
+pub const SO_VENDOR: ::c_int = 0x80000000;
+pub const SO_DEBUG: ::c_int = 0x01;
+pub const SO_ACCEPTCONN: ::c_int = 0x0002;
+pub const SO_REUSEADDR: ::c_int = 0x0004;
+pub const SO_KEEPALIVE: ::c_int = 0x0008;
+pub const SO_DONTROUTE: ::c_int = 0x0010;
+pub const SO_BROADCAST: ::c_int = 0x0020;
+pub const SO_USELOOPBACK: ::c_int = 0x0040;
+pub const SO_LINGER: ::c_int = 0x0080;
+pub const SO_OOBINLINE: ::c_int = 0x0100;
+pub const SO_REUSEPORT: ::c_int = 0x0200;
+pub const SO_TIMESTAMP: ::c_int = 0x0400;
+pub const SO_NOSIGPIPE: ::c_int = 0x0800;
+pub const SO_ACCEPTFILTER: ::c_int = 0x1000;
+pub const SO_SNDBUF: ::c_int = 0x1001;
+pub const SO_RCVBUF: ::c_int = 0x1002;
+pub const SO_SNDLOWAT: ::c_int = 0x1003;
+pub const SO_RCVLOWAT: ::c_int = 0x1004;
+pub const SO_SNDTIMEO: ::c_int = 0x1005;
+pub const SO_RCVTIMEO: ::c_int = 0x1006;
+pub const SO_ERROR: ::c_int = 0x1007;
+pub const SO_TYPE: ::c_int = 0x1008;
pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC;
@@ -493,14 +520,30 @@ pub const IFF_MULTICAST: ::c_int = 0x8000; // supports multicast
pub const TCP_NODELAY: ::c_int = 8193;
pub const TCP_MAXSEG: ::c_int = 8194;
+pub const TCP_NOPUSH: ::c_int = 4;
+pub const TCP_NOOPT: ::c_int = 8;
+pub const TCP_KEEPIDLE: ::c_int = 256;
+pub const TCP_KEEPINTVL: ::c_int = 512;
+pub const TCP_KEEPCNT: ::c_int = 1024;
-pub const IP_TOS: ::c_int = 7;
+pub const IP_TOS: ::c_int = 3;
pub const IP_TTL: ::c_int = 8;
-pub const IP_MULTICAST_LOOP: ::c_int = 9;
+pub const IP_MULTICAST_IF: ::c_int = 9;
pub const IP_MULTICAST_TTL: ::c_int = 10;
+pub const IP_MULTICAST_LOOP: ::c_int = 11;
pub const IP_ADD_MEMBERSHIP: ::c_int = 11;
pub const IP_DROP_MEMBERSHIP: ::c_int = 12;
+pub const IPV6_UNICAST_HOPS: ::c_int = 4;
+pub const IPV6_MULTICAST_IF: ::c_int = 9;
+pub const IPV6_MULTICAST_HOPS: ::c_int = 10;
+pub const IPV6_MULTICAST_LOOP: ::c_int = 11;
+pub const IPV6_V6ONLY: ::c_int = 27;
+pub const IPV6_JOIN_GROUP: ::c_int = 12;
+pub const IPV6_LEAVE_GROUP: ::c_int = 13;
+pub const IPV6_ADD_MEMBERSHIP: ::c_int = 12;
+pub const IPV6_DROP_MEMBERSHIP: ::c_int = 13;
+
pub const HOST_NOT_FOUND: ::c_int = 1;
pub const NO_DATA: ::c_int = 2;
pub const NO_ADDRESS: ::c_int = 2;
@@ -555,6 +598,11 @@ f! {
}
extern {
+ #[cfg_attr(target_os = "linux",
+ link_name = "__xpg_strerror_r")]
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn sem_destroy(sem: *mut sem_t) -> ::c_int;
pub fn sem_init(sem: *mut sem_t,
pshared: ::c_int,
@@ -580,8 +628,10 @@ extern {
pub fn fexecve(fd: ::c_int, argv: *const *const ::c_char,
envp: *const *const ::c_char)
-> ::c_int;
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
diff --git a/src/unix/notbsd/android/b32/mod.rs b/src/unix/notbsd/android/b32/mod.rs
index a8cc51b221..e0a0d7e67c 100644
--- a/src/unix/notbsd/android/b32/mod.rs
+++ b/src/unix/notbsd/android/b32/mod.rs
@@ -13,7 +13,7 @@ s! {
pub struct sigaction {
pub sa_sigaction: ::sighandler_t,
pub sa_mask: ::sigset_t,
- pub sa_flags: ::c_ulong,
+ pub sa_flags: ::c_int,
pub sa_restorer: ::Option<extern fn()>,
}
@@ -35,12 +35,12 @@ s! {
pub st_size: ::c_longlong,
pub st_blksize: ::blksize_t,
pub st_blocks: ::c_ulonglong,
- pub st_atime: ::c_ulong,
- pub st_atime_nsec: ::c_ulong,
- pub st_mtime: ::c_ulong,
- pub st_mtime_nsec: ::c_ulong,
- pub st_ctime: ::c_ulong,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_atime: ::c_long,
+ pub st_atime_nsec: ::c_long,
+ pub st_mtime: ::c_long,
+ pub st_mtime_nsec: ::c_long,
+ pub st_ctime: ::c_long,
+ pub st_ctime_nsec: ::c_long,
pub st_ino: ::c_ulonglong,
}
@@ -57,12 +57,12 @@ s! {
pub st_size: ::c_longlong,
pub st_blksize: ::blksize_t,
pub st_blocks: ::c_ulonglong,
- pub st_atime: ::c_ulong,
- pub st_atime_nsec: ::c_ulong,
- pub st_mtime: ::c_ulong,
- pub st_mtime_nsec: ::c_ulong,
- pub st_ctime: ::c_ulong,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_atime: ::c_long,
+ pub st_atime_nsec: ::c_long,
+ pub st_mtime: ::c_long,
+ pub st_mtime_nsec: ::c_long,
+ pub st_ctime: ::c_long,
+ pub st_ctime_nsec: ::c_long,
pub st_ino: ::c_ulonglong,
}
diff --git a/src/unix/notbsd/android/b64/aarch64.rs b/src/unix/notbsd/android/b64/aarch64.rs
index 44dfee6404..cb1c81b260 100644
--- a/src/unix/notbsd/android/b64/aarch64.rs
+++ b/src/unix/notbsd/android/b64/aarch64.rs
@@ -16,11 +16,11 @@ s! {
__pad2: ::c_int,
pub st_blocks: ::c_long,
pub st_atime: ::time_t,
- pub st_atime_nsec: ::c_ulong,
+ pub st_atime_nsec: ::c_long,
pub st_mtime: ::time_t,
- pub st_mtime_nsec: ::c_ulong,
+ pub st_mtime_nsec: ::c_long,
pub st_ctime: ::time_t,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_ctime_nsec: ::c_long,
__unused4: ::c_uint,
__unused5: ::c_uint,
}
@@ -39,11 +39,11 @@ s! {
__pad2: ::c_int,
pub st_blocks: ::c_long,
pub st_atime: ::time_t,
- pub st_atime_nsec: ::c_ulong,
+ pub st_atime_nsec: ::c_long,
pub st_mtime: ::time_t,
- pub st_mtime_nsec: ::c_ulong,
+ pub st_mtime_nsec: ::c_long,
pub st_ctime: ::time_t,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_ctime_nsec: ::c_long,
__unused4: ::c_uint,
__unused5: ::c_uint,
}
@@ -322,4 +322,4 @@ pub const SYS_pwritev2: ::c_long = 287;
pub const SYS_pkey_mprotect: ::c_long = 288;
pub const SYS_pkey_alloc: ::c_long = 289;
pub const SYS_pkey_free: ::c_long = 290;
-pub const SYS_syscalls: ::c_long = 291;
+pub const SYS_syscalls: ::c_long = 292;
diff --git a/src/unix/notbsd/android/b64/mod.rs b/src/unix/notbsd/android/b64/mod.rs
index 46becc53d4..eb10c6384e 100644
--- a/src/unix/notbsd/android/b64/mod.rs
+++ b/src/unix/notbsd/android/b64/mod.rs
@@ -13,7 +13,7 @@ s! {
}
pub struct sigaction {
- pub sa_flags: ::c_uint,
+ pub sa_flags: ::c_int,
pub sa_sigaction: ::sighandler_t,
pub sa_mask: ::sigset_t,
pub sa_restorer: ::Option<extern fn()>,
diff --git a/src/unix/notbsd/android/b64/x86_64.rs b/src/unix/notbsd/android/b64/x86_64.rs
index c813e7da32..2ab6080a6d 100644
--- a/src/unix/notbsd/android/b64/x86_64.rs
+++ b/src/unix/notbsd/android/b64/x86_64.rs
@@ -13,12 +13,12 @@ s! {
pub st_size: ::off64_t,
pub st_blksize: ::c_long,
pub st_blocks: ::c_long,
- pub st_atime: ::c_ulong,
- pub st_atime_nsec: ::c_ulong,
- pub st_mtime: ::c_ulong,
- pub st_mtime_nsec: ::c_ulong,
- pub st_ctime: ::c_ulong,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_atime: ::c_long,
+ pub st_atime_nsec: ::c_long,
+ pub st_mtime: ::c_long,
+ pub st_mtime_nsec: ::c_long,
+ pub st_ctime: ::c_long,
+ pub st_ctime_nsec: ::c_long,
__unused: [::c_long; 3],
}
@@ -33,12 +33,12 @@ s! {
pub st_size: ::off64_t,
pub st_blksize: ::c_long,
pub st_blocks: ::c_long,
- pub st_atime: ::c_ulong,
- pub st_atime_nsec: ::c_ulong,
- pub st_mtime: ::c_ulong,
- pub st_mtime_nsec: ::c_ulong,
- pub st_ctime: ::c_ulong,
- pub st_ctime_nsec: ::c_ulong,
+ pub st_atime: ::c_long,
+ pub st_atime_nsec: ::c_long,
+ pub st_mtime: ::c_long,
+ pub st_mtime_nsec: ::c_long,
+ pub st_ctime: ::c_long,
+ pub st_ctime_nsec: ::c_long,
__unused: [::c_long; 3],
}
}
diff --git a/src/unix/notbsd/android/mod.rs b/src/unix/notbsd/android/mod.rs
index 2f62a0930d..6fb61ae352 100644
--- a/src/unix/notbsd/android/mod.rs
+++ b/src/unix/notbsd/android/mod.rs
@@ -12,6 +12,7 @@ pub type pthread_t = ::c_long;
pub type pthread_mutexattr_t = ::c_long;
pub type pthread_rwlockattr_t = ::c_long;
pub type pthread_condattr_t = ::c_long;
+pub type pthread_key_t = ::c_int;
pub type fsfilcnt_t = ::c_ulong;
pub type fsblkcnt_t = ::c_ulong;
pub type nfds_t = ::c_uint;
@@ -190,6 +191,13 @@ s! {
pub ipi6_addr: ::in6_addr,
pub ipi6_ifindex: ::c_int,
}
+
+ pub struct inotify_event {
+ pub wd: ::c_int,
+ pub mask: ::uint32_t,
+ pub cookie: ::uint32_t,
+ pub len: ::uint32_t
+ }
}
s_no_extra_traits!{
@@ -540,6 +548,9 @@ cfg_if! {
}
}
+pub const MS_NOUSER: ::c_ulong = 0xffffffff80000000;
+pub const MS_RMT_MASK: ::c_ulong = 0x02800051;
+
pub const O_TRUNC: ::c_int = 512;
pub const O_CLOEXEC: ::c_int = 0x80000;
pub const O_PATH: ::c_int = 0o10000000;
@@ -575,11 +586,11 @@ pub const EFD_CLOEXEC: ::c_int = 0x80000;
pub const USER_PROCESS: ::c_short = 7;
pub const BUFSIZ: ::c_uint = 1024;
-pub const FILENAME_MAX: ::c_uint = 1024;
+pub const FILENAME_MAX: ::c_uint = 4096;
pub const FOPEN_MAX: ::c_uint = 20;
pub const POSIX_FADV_DONTNEED: ::c_int = 4;
pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-pub const L_tmpnam: ::c_uint = 1024;
+pub const L_tmpnam: ::c_uint = 4096;
pub const TMP_MAX: ::c_uint = 308915776;
pub const _PC_LINK_MAX: ::c_int = 1;
pub const _PC_MAX_CANON: ::c_int = 2;
@@ -1356,6 +1367,11 @@ pub const IP_ORIGDSTADDR : ::c_int = 20;
pub const IP_RECVORIGDSTADDR : ::c_int = IP_ORIGDSTADDR;
pub const IPV6_ORIGDSTADDR : ::c_int = 74;
pub const IPV6_RECVORIGDSTADDR : ::c_int = IPV6_ORIGDSTADDR;
+pub const IPV6_FLOWINFO: ::c_int = 11;
+pub const IPV6_FLOWLABEL_MGR: ::c_int = 32;
+pub const IPV6_FLOWINFO_SEND: ::c_int = 33;
+pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff;
+pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000;
pub const IUTF8: ::tcflag_t = 0x00004000;
pub const CMSPAR: ::tcflag_t = 0o10000000000;
pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY;
@@ -1447,10 +1463,10 @@ pub const NF_IP6_PRI_CONNTRACK_HELPER: ::c_int = 300;
pub const NF_IP6_PRI_LAST: ::c_int = ::INT_MAX;
// linux/netfilter/nf_tables.h
-pub const NFT_TABLE_MAXNAMELEN: ::c_int = 32;
-pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 32;
-pub const NFT_SET_MAXNAMELEN: ::c_int = 32;
-pub const NFT_OBJ_MAXNAMELEN: ::c_int = 32;
+pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256;
+pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256;
+pub const NFT_SET_MAXNAMELEN: ::c_int = 256;
+pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256;
pub const NFT_USERDATA_MAXLEN: ::c_int = 256;
pub const NFT_REG_VERDICT: ::c_int = 0;
@@ -1507,7 +1523,7 @@ pub const NFT_MSG_NEWOBJ: ::c_int = 18;
pub const NFT_MSG_GETOBJ: ::c_int = 19;
pub const NFT_MSG_DELOBJ: ::c_int = 20;
pub const NFT_MSG_GETOBJ_RESET: ::c_int = 21;
-pub const NFT_MSG_MAX: ::c_int = 22;
+pub const NFT_MSG_MAX: ::c_int = 25;
pub const NFT_SET_ANONYMOUS: ::c_int = 0x1;
pub const NFT_SET_CONSTANT: ::c_int = 0x2;
@@ -1777,7 +1793,10 @@ pub const SIOCSIFMAP: ::c_ulong = 0x00008971;
pub const MODULE_INIT_IGNORE_MODVERSIONS: ::c_uint = 0x0001;
pub const MODULE_INIT_IGNORE_VERMAGIC: ::c_uint = 0x0002;
-// Similarity to Linux it's not used but defined for compatibility.
+#[deprecated(
+ since = "0.2.55",
+ note = "ENOATTR is not available on Android; use ENODATA instead"
+)]
pub const ENOATTR: ::c_int = ::ENODATA;
// linux/if_alg.h
@@ -1790,6 +1809,62 @@ pub const ALG_SET_AEAD_AUTHSIZE: ::c_int = 5;
pub const ALG_OP_DECRYPT: ::c_int = 0;
pub const ALG_OP_ENCRYPT: ::c_int = 1;
+// uapi/linux/inotify.h
+pub const IN_ACCESS: ::uint32_t = 0x0000_0001;
+pub const IN_MODIFY: ::uint32_t = 0x0000_0002;
+pub const IN_ATTRIB: ::uint32_t = 0x0000_0004;
+pub const IN_CLOSE_WRITE: ::uint32_t = 0x0000_0008;
+pub const IN_CLOSE_NOWRITE: ::uint32_t = 0x0000_0010;
+pub const IN_CLOSE: ::uint32_t = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE);
+pub const IN_OPEN: ::uint32_t = 0x0000_0020;
+pub const IN_MOVED_FROM: ::uint32_t = 0x0000_0040;
+pub const IN_MOVED_TO: ::uint32_t = 0x0000_0080;
+pub const IN_MOVE: ::uint32_t = (IN_MOVED_FROM | IN_MOVED_TO);
+pub const IN_CREATE: ::uint32_t = 0x0000_0100;
+pub const IN_DELETE: ::uint32_t = 0x0000_0200;
+pub const IN_DELETE_SELF: ::uint32_t = 0x0000_0400;
+pub const IN_MOVE_SELF: ::uint32_t = 0x0000_0800;
+pub const IN_UNMOUNT: ::uint32_t = 0x0000_2000;
+pub const IN_Q_OVERFLOW: ::uint32_t = 0x0000_4000;
+pub const IN_IGNORED: ::uint32_t = 0x0000_8000;
+pub const IN_ONLYDIR: ::uint32_t = 0x0100_0000;
+pub const IN_DONT_FOLLOW: ::uint32_t = 0x0200_0000;
+// pub const IN_EXCL_UNLINK: ::uint32_t = 0x0400_0000;
+
+// pub const IN_MASK_CREATE: ::uint32_t = 0x1000_0000;
+// pub const IN_MASK_ADD: ::uint32_t = 0x2000_0000;
+pub const IN_ISDIR: ::uint32_t = 0x4000_0000;
+pub const IN_ONESHOT: ::uint32_t = 0x8000_0000;
+
+pub const IN_ALL_EVENTS: ::uint32_t = (
+ IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE |
+ IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM |
+ IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF |
+ IN_MOVE_SELF
+);
+
+pub const IN_CLOEXEC: ::c_int = O_CLOEXEC;
+pub const IN_NONBLOCK: ::c_int = O_NONBLOCK;
+
+pub const FUTEX_WAIT: ::c_int = 0;
+pub const FUTEX_WAKE: ::c_int = 1;
+pub const FUTEX_FD: ::c_int = 2;
+pub const FUTEX_REQUEUE: ::c_int = 3;
+pub const FUTEX_CMP_REQUEUE: ::c_int = 4;
+pub const FUTEX_WAKE_OP: ::c_int = 5;
+pub const FUTEX_LOCK_PI: ::c_int = 6;
+pub const FUTEX_UNLOCK_PI: ::c_int = 7;
+pub const FUTEX_TRYLOCK_PI: ::c_int = 8;
+pub const FUTEX_WAIT_BITSET: ::c_int = 9;
+pub const FUTEX_WAKE_BITSET: ::c_int = 10;
+pub const FUTEX_WAIT_REQUEUE_PI: ::c_int = 11;
+pub const FUTEX_CMP_REQUEUE_PI: ::c_int = 12;
+
+pub const FUTEX_PRIVATE_FLAG: ::c_int = 128;
+pub const FUTEX_CLOCK_REALTIME: ::c_int = 256;
+pub const FUTEX_CMD_MASK: ::c_int =
+ !(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME);
+
f! {
pub fn CMSG_NXTHDR(mhdr: *const msghdr,
cmsg: *const cmsghdr) -> *mut cmsghdr {
@@ -1852,19 +1927,20 @@ f! {
}
extern {
- static mut __progname: *mut ::c_char;
-}
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
-extern {
- pub fn madvise(addr: *const ::c_void, len: ::size_t, advice: ::c_int)
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
+ pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-> ::c_int;
pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int;
- pub fn msync(addr: *const ::c_void, len: ::size_t,
+ pub fn msync(addr: *mut ::c_void, len: ::size_t,
flags: ::c_int) -> ::c_int;
- pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int)
+ pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-> ::c_int;
pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
- flags: ::c_int, addr: *const ::sockaddr,
+ flags: ::c_int, addr: *mut ::sockaddr,
addrlen: *mut ::socklen_t) -> ::ssize_t;
pub fn getnameinfo(sa: *const ::sockaddr,
salen: ::socklen_t,
@@ -1874,11 +1950,12 @@ extern {
sevlen: ::size_t,
flags: ::c_int) -> ::c_int;
pub fn ptrace(request: ::c_int, ...) -> ::c_long;
- pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
- pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
+ pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
+ pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
pub fn __sched_cpualloc(count: ::size_t) -> *mut ::cpu_set_t;
pub fn __sched_cpufree(set: *mut ::cpu_set_t);
- pub fn __sched_cpucount(setsize: ::size_t, set: *mut cpu_set_t) -> ::c_int;
+ pub fn __sched_cpucount(setsize: ::size_t,
+ set: *const cpu_set_t) -> ::c_int;
pub fn sched_getcpu() -> ::c_int;
pub fn utmpname(name: *const ::c_char) -> ::c_int;
@@ -1941,7 +2018,7 @@ extern {
fstype: *const ::c_char,
flags: ::c_ulong,
data: *const ::c_void) -> ::c_int;
- pub fn personality(persona: ::c_ulong) -> ::c_int;
+ pub fn personality(persona: ::c_uint) -> ::c_int;
pub fn prctl(option: ::c_int, ...) -> ::c_int;
pub fn sched_getparam(pid: ::pid_t, param: *mut ::sched_param) -> ::c_int;
pub fn ppoll(fds: *mut ::pollfd,
@@ -1982,7 +2059,7 @@ extern {
pub fn setfsuid(uid: ::uid_t) -> ::c_int;
pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
@@ -1993,7 +2070,6 @@ extern {
pub fn sigaltstack(ss: *const stack_t,
oss: *mut stack_t) -> ::c_int;
pub fn sem_close(sem: *mut sem_t) -> ::c_int;
- pub fn getdtablesize() -> ::c_int;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrnam_r")]
pub fn getgrnam_r(name: *const ::c_char,
grp: *mut ::group,
@@ -2055,6 +2131,11 @@ extern {
flags: ::c_int) -> ::c_int;
pub fn recvmmsg(sockfd: ::c_int, msgvec: *mut ::mmsghdr, vlen: ::c_uint,
flags: ::c_int, timeout: *const ::timespec) -> ::c_int;
+ pub fn inotify_init() -> ::c_int;
+ pub fn inotify_init1(flags: ::c_int) -> ::c_int;
+ pub fn inotify_add_watch(fd: ::c_int,
+ path: *const ::c_char,
+ mask: ::uint32_t) -> ::c_int;
}
cfg_if! {
diff --git a/src/unix/notbsd/emscripten/mod.rs b/src/unix/notbsd/emscripten/mod.rs
index 0f8c76e3ab..0a98eafb61 100644
--- a/src/unix/notbsd/emscripten/mod.rs
+++ b/src/unix/notbsd/emscripten/mod.rs
@@ -17,6 +17,7 @@ pub type nfds_t = ::c_ulong;
pub type nl_item = ::c_int;
pub type idtype_t = ::c_uint;
pub type loff_t = i32;
+pub type pthread_key_t = ::c_uint;
pub type clock_t = c_long;
pub type time_t = c_long;
@@ -573,6 +574,9 @@ cfg_if! {
}
}
+pub const MS_NOUSER: ::c_ulong = 0x80000000;
+pub const MS_RMT_MASK: ::c_ulong = 0x800051;
+
pub const ABDAY_1: ::nl_item = 0x20000;
pub const ABDAY_2: ::nl_item = 0x20001;
pub const ABDAY_3: ::nl_item = 0x20002;
@@ -1683,12 +1687,18 @@ f! {
}
extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn abs(i: ::c_int) -> ::c_int;
pub fn atof(s: *const ::c_char) -> ::c_double;
pub fn labs(i: ::c_long) -> ::c_long;
pub fn rand() -> ::c_int;
pub fn srand(seed: ::c_uint);
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
+
pub fn setpwent();
pub fn endpwent();
pub fn getpwent() -> *mut passwd;
diff --git a/src/unix/notbsd/linux/align.rs b/src/unix/notbsd/linux/align.rs
index a35e26913a..0ff4649b8c 100644
--- a/src/unix/notbsd/linux/align.rs
+++ b/src/unix/notbsd/linux/align.rs
@@ -7,8 +7,7 @@ macro_rules! expand_align {
target_arch = "mips64",
target_arch = "s390x",
target_arch = "sparc64",
- all(target_arch = "aarch64",
- target_env = "musl")),
+ target_arch = "aarch64"),
repr(align(4)))]
#[cfg_attr(not(any(target_pointer_width = "32",
target_arch = "x86_64",
@@ -16,8 +15,7 @@ macro_rules! expand_align {
target_arch = "mips64",
target_arch = "s390x",
target_arch = "sparc64",
- all(target_arch = "aarch64",
- target_env = "musl"))),
+ target_arch = "aarch64")),
repr(align(8)))]
pub struct pthread_mutexattr_t {
#[doc(hidden)]
diff --git a/src/unix/notbsd/linux/mips/mips32.rs b/src/unix/notbsd/linux/mips/mips32.rs
index 9911613954..d9d5589130 100644
--- a/src/unix/notbsd/linux/mips/mips32.rs
+++ b/src/unix/notbsd/linux/mips/mips32.rs
@@ -353,7 +353,6 @@ pub const SYS_mknod: ::c_long = 4000 + 14;
pub const SYS_chmod: ::c_long = 4000 + 15;
pub const SYS_lchown: ::c_long = 4000 + 16;
pub const SYS_break: ::c_long = 4000 + 17;
-pub const SYS_unused18: ::c_long = 4000 + 18;
pub const SYS_lseek: ::c_long = 4000 + 19;
pub const SYS_getpid: ::c_long = 4000 + 20;
pub const SYS_mount: ::c_long = 4000 + 21;
@@ -363,7 +362,6 @@ pub const SYS_getuid: ::c_long = 4000 + 24;
pub const SYS_stime: ::c_long = 4000 + 25;
pub const SYS_ptrace: ::c_long = 4000 + 26;
pub const SYS_alarm: ::c_long = 4000 + 27;
-pub const SYS_unused28: ::c_long = 4000 + 28;
pub const SYS_pause: ::c_long = 4000 + 29;
pub const SYS_utime: ::c_long = 4000 + 30;
pub const SYS_stty: ::c_long = 4000 + 31;
@@ -394,7 +392,6 @@ pub const SYS_fcntl: ::c_long = 4000 + 55;
pub const SYS_mpx: ::c_long = 4000 + 56;
pub const SYS_setpgid: ::c_long = 4000 + 57;
pub const SYS_ulimit: ::c_long = 4000 + 58;
-pub const SYS_unused59: ::c_long = 4000 + 59;
pub const SYS_umask: ::c_long = 4000 + 60;
pub const SYS_chroot: ::c_long = 4000 + 61;
pub const SYS_ustat: ::c_long = 4000 + 62;
@@ -417,9 +414,7 @@ pub const SYS_gettimeofday: ::c_long = 4000 + 78;
pub const SYS_settimeofday: ::c_long = 4000 + 79;
pub const SYS_getgroups: ::c_long = 4000 + 80;
pub const SYS_setgroups: ::c_long = 4000 + 81;
-pub const SYS_reserved82: ::c_long = 4000 + 82;
pub const SYS_symlink: ::c_long = 4000 + 83;
-pub const SYS_unused84: ::c_long = 4000 + 84;
pub const SYS_readlink: ::c_long = 4000 + 85;
pub const SYS_uselib: ::c_long = 4000 + 86;
pub const SYS_swapon: ::c_long = 4000 + 87;
@@ -444,7 +439,6 @@ pub const SYS_getitimer: ::c_long = 4000 + 105;
pub const SYS_stat: ::c_long = 4000 + 106;
pub const SYS_lstat: ::c_long = 4000 + 107;
pub const SYS_fstat: ::c_long = 4000 + 108;
-pub const SYS_unused109: ::c_long = 4000 + 109;
pub const SYS_iopl: ::c_long = 4000 + 110;
pub const SYS_vhangup: ::c_long = 4000 + 111;
pub const SYS_idle: ::c_long = 4000 + 112;
@@ -485,7 +479,6 @@ pub const SYS_writev: ::c_long = 4000 + 146;
pub const SYS_cacheflush: ::c_long = 4000 + 147;
pub const SYS_cachectl: ::c_long = 4000 + 148;
pub const SYS_sysmips: ::c_long = 4000 + 149;
-pub const SYS_unused150: ::c_long = 4000 + 150;
pub const SYS_getsid: ::c_long = 4000 + 151;
pub const SYS_fdatasync: ::c_long = 4000 + 152;
pub const SYS__sysctl: ::c_long = 4000 + 153;
@@ -556,7 +549,6 @@ pub const SYS_mincore: ::c_long = 4000 + 217;
pub const SYS_madvise: ::c_long = 4000 + 218;
pub const SYS_getdents64: ::c_long = 4000 + 219;
pub const SYS_fcntl64: ::c_long = 4000 + 220;
-pub const SYS_reserved221: ::c_long = 4000 + 221;
pub const SYS_gettid: ::c_long = 4000 + 222;
pub const SYS_readahead: ::c_long = 4000 + 223;
pub const SYS_setxattr: ::c_long = 4000 + 224;
diff --git a/src/unix/notbsd/linux/mips/mips64.rs b/src/unix/notbsd/linux/mips/mips64.rs
index c4247c976c..f480e50a84 100644
--- a/src/unix/notbsd/linux/mips/mips64.rs
+++ b/src/unix/notbsd/linux/mips/mips64.rs
@@ -496,7 +496,6 @@ pub const SYS_nfsservctl: ::c_long = 5000 + 173;
pub const SYS_getpmsg: ::c_long = 5000 + 174;
pub const SYS_putpmsg: ::c_long = 5000 + 175;
pub const SYS_afs_syscall: ::c_long = 5000 + 176;
-pub const SYS_reserved177: ::c_long = 5000 + 177;
pub const SYS_gettid: ::c_long = 5000 + 178;
pub const SYS_readahead: ::c_long = 5000 + 179;
pub const SYS_setxattr: ::c_long = 5000 + 180;
@@ -512,7 +511,6 @@ pub const SYS_removexattr: ::c_long = 5000 + 189;
pub const SYS_lremovexattr: ::c_long = 5000 + 190;
pub const SYS_fremovexattr: ::c_long = 5000 + 191;
pub const SYS_tkill: ::c_long = 5000 + 192;
-pub const SYS_reserved193: ::c_long = 5000 + 193;
pub const SYS_futex: ::c_long = 5000 + 194;
pub const SYS_sched_setaffinity: ::c_long = 5000 + 195;
pub const SYS_sched_getaffinity: ::c_long = 5000 + 196;
diff --git a/src/unix/notbsd/linux/mips/mod.rs b/src/unix/notbsd/linux/mips/mod.rs
index b7001866eb..c1407b6c46 100644
--- a/src/unix/notbsd/linux/mips/mod.rs
+++ b/src/unix/notbsd/linux/mips/mod.rs
@@ -334,6 +334,8 @@ pub const MAP_LOCKED: ::c_int = 0x8000;
pub const MAP_POPULATE: ::c_int = 0x10000;
pub const MAP_NONBLOCK: ::c_int = 0x20000;
pub const MAP_STACK: ::c_int = 0x40000;
+pub const MAP_SHARED_VALIDATE: ::c_int = 0x3;
+pub const MAP_FIXED_NOREPLACE: ::c_int = 0x100000;
pub const SOCK_STREAM: ::c_int = 2;
pub const SOCK_DGRAM: ::c_int = 1;
@@ -706,10 +708,10 @@ pub const GENL_UNS_ADMIN_PERM: ::c_int = 0x10;
pub const GENL_ID_VFS_DQUOT: ::c_int = ::NLMSG_MIN_TYPE + 1;
pub const GENL_ID_PMCRAID: ::c_int = ::NLMSG_MIN_TYPE + 2;
-pub const NFT_TABLE_MAXNAMELEN: ::c_int = 32;
-pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 32;
-pub const NFT_SET_MAXNAMELEN: ::c_int = 32;
-pub const NFT_OBJ_MAXNAMELEN: ::c_int = 32;
+pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256;
+pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256;
+pub const NFT_SET_MAXNAMELEN: ::c_int = 256;
+pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256;
pub const NFT_USERDATA_MAXLEN: ::c_int = 256;
pub const NFT_REG_VERDICT: ::c_int = 0;
@@ -766,7 +768,7 @@ pub const NFT_MSG_NEWOBJ: ::c_int = 18;
pub const NFT_MSG_GETOBJ: ::c_int = 19;
pub const NFT_MSG_DELOBJ: ::c_int = 20;
pub const NFT_MSG_GETOBJ_RESET: ::c_int = 21;
-pub const NFT_MSG_MAX: ::c_int = 22;
+pub const NFT_MSG_MAX: ::c_int = 25;
pub const NFT_SET_ANONYMOUS: ::c_int = 0x1;
pub const NFT_SET_CONSTANT: ::c_int = 0x2;
diff --git a/src/unix/notbsd/linux/mod.rs b/src/unix/notbsd/linux/mod.rs
index b9ecc9de9f..bb3638d0a4 100644
--- a/src/unix/notbsd/linux/mod.rs
+++ b/src/unix/notbsd/linux/mod.rs
@@ -14,6 +14,7 @@ pub type nfds_t = ::c_ulong;
pub type nl_item = ::c_int;
pub type idtype_t = ::c_uint;
pub type loff_t = ::c_longlong;
+pub type pthread_key_t = ::c_uint;
pub type __u8 = ::c_uchar;
pub type __u16 = ::c_ushort;
@@ -493,6 +494,13 @@ s! {
pub updated: ::c_ulong,
pub ha: [::c_uchar; ::MAX_ADDR_LEN],
}
+
+ pub struct inotify_event {
+ pub wd: ::c_int,
+ pub mask: ::uint32_t,
+ pub cookie: ::uint32_t,
+ pub len: ::uint32_t
+ }
}
s_no_extra_traits!{
@@ -842,6 +850,9 @@ pub const _PC_ALLOC_SIZE_MIN: ::c_int = 18;
pub const _PC_SYMLINK_MAX: ::c_int = 19;
pub const _PC_2_SYMLINKS: ::c_int = 20;
+pub const MS_NOUSER: ::c_ulong = 0x80000000;
+pub const MS_RMT_MASK: ::c_ulong = 0x800051;
+
pub const _SC_ARG_MAX: ::c_int = 0;
pub const _SC_CHILD_MAX: ::c_int = 1;
pub const _SC_CLK_TCK: ::c_int = 2;
@@ -1017,26 +1028,56 @@ pub const IFF_LOWER_UP: ::c_int = 0x10000;
pub const IFF_DORMANT: ::c_int = 0x20000;
pub const IFF_ECHO: ::c_int = 0x40000;
+// linux/if_addr.h
+pub const IFA_UNSPEC: ::c_ushort = 0;
+pub const IFA_ADDRESS: ::c_ushort = 1;
+pub const IFA_LOCAL: ::c_ushort = 2;
+pub const IFA_LABEL: ::c_ushort = 3;
+pub const IFA_BROADCAST: ::c_ushort = 4;
+pub const IFA_ANYCAST: ::c_ushort = 5;
+pub const IFA_CACHEINFO: ::c_ushort = 6;
+pub const IFA_MULTICAST: ::c_ushort = 7;
+
+pub const IFA_F_SECONDARY: u32 = 0x01;
+pub const IFA_F_TEMPORARY: u32 = 0x01;
+pub const IFA_F_NODAD: u32 = 0x02;
+pub const IFA_F_OPTIMISTIC: u32 = 0x04;
+pub const IFA_F_DADFAILED: u32 = 0x08;
+pub const IFA_F_HOMEADDRESS: u32 = 0x10;
+pub const IFA_F_DEPRECATED: u32 = 0x20;
+pub const IFA_F_TENTATIVE: u32 = 0x40;
+pub const IFA_F_PERMANENT: u32 = 0x80;
+
+// linux/if_link.h
+pub const IFLA_UNSPEC: ::c_ushort = 0;
+pub const IFLA_ADDRESS: ::c_ushort = 1;
+pub const IFLA_BROADCAST: ::c_ushort = 2;
+pub const IFLA_IFNAME: ::c_ushort = 3;
+pub const IFLA_MTU: ::c_ushort = 4;
+pub const IFLA_LINK: ::c_ushort = 5;
+pub const IFLA_QDISC: ::c_ushort = 6;
+pub const IFLA_STATS: ::c_ushort = 7;
+
// linux/if_tun.h
-pub const IFF_TUN: ::c_short = 0x0001;
-pub const IFF_TAP: ::c_short = 0x0002;
-pub const IFF_NO_PI: ::c_short = 0x1000;
+pub const IFF_TUN: ::c_int = 0x0001;
+pub const IFF_TAP: ::c_int = 0x0002;
+pub const IFF_NO_PI: ::c_int = 0x1000;
// Read queue size
pub const TUN_READQ_SIZE: ::c_short = 500;
// TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead.
-pub const TUN_TUN_DEV: ::c_short = ::IFF_TUN;
-pub const TUN_TAP_DEV: ::c_short = ::IFF_TAP;
+pub const TUN_TUN_DEV: ::c_short = ::IFF_TUN as ::c_short;
+pub const TUN_TAP_DEV: ::c_short = ::IFF_TAP as ::c_short;
pub const TUN_TYPE_MASK: ::c_short = 0x000f;
// This flag has no real effect
-pub const IFF_ONE_QUEUE: ::c_short = 0x2000;
-pub const IFF_VNET_HDR: ::c_short = 0x4000;
-pub const IFF_TUN_EXCL: ::c_short = 0x8000;
-pub const IFF_MULTI_QUEUE: ::c_short = 0x0100;
-pub const IFF_ATTACH_QUEUE: ::c_short = 0x0200;
-pub const IFF_DETACH_QUEUE: ::c_short = 0x0400;
+pub const IFF_ONE_QUEUE: ::c_int = 0x2000;
+pub const IFF_VNET_HDR: ::c_int = 0x4000;
+pub const IFF_TUN_EXCL: ::c_int = 0x8000;
+pub const IFF_MULTI_QUEUE: ::c_int = 0x0100;
+pub const IFF_ATTACH_QUEUE: ::c_int = 0x0200;
+pub const IFF_DETACH_QUEUE: ::c_int = 0x0400;
// read-only flag
-pub const IFF_PERSIST: ::c_short = 0x0800;
-pub const IFF_NOFILTER: ::c_short = 0x1000;
+pub const IFF_PERSIST: ::c_int = 0x0800;
+pub const IFF_NOFILTER: ::c_int = 0x1000;
pub const ST_RDONLY: ::c_ulong = 1;
pub const ST_NOSUID: ::c_ulong = 2;
@@ -1399,9 +1440,10 @@ pub const FALLOC_FL_ZERO_RANGE: ::c_int = 0x10;
pub const FALLOC_FL_INSERT_RANGE: ::c_int = 0x20;
pub const FALLOC_FL_UNSHARE_RANGE: ::c_int = 0x40;
-// On Linux, libc doesn't define this constant, libattr does instead.
-// We still define it for Linux as it's defined by libc on other platforms,
-// and it's mentioned in the man pages for getxattr and setxattr.
+#[deprecated(
+ since = "0.2.55",
+ note = "ENOATTR is not available on Linux; use ENODATA instead"
+)]
pub const ENOATTR: ::c_int = ::ENODATA;
pub const SO_ORIGINAL_DST: ::c_int = 80;
@@ -1409,6 +1451,11 @@ pub const IP_ORIGDSTADDR : ::c_int = 20;
pub const IP_RECVORIGDSTADDR : ::c_int = IP_ORIGDSTADDR;
pub const IPV6_ORIGDSTADDR : ::c_int = 74;
pub const IPV6_RECVORIGDSTADDR : ::c_int = IPV6_ORIGDSTADDR;
+pub const IPV6_FLOWINFO: ::c_int = 11;
+pub const IPV6_FLOWLABEL_MGR: ::c_int = 32;
+pub const IPV6_FLOWINFO_SEND: ::c_int = 33;
+pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff;
+pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000;
pub const IUTF8: ::tcflag_t = 0x00004000;
pub const CMSPAR: ::tcflag_t = 0o10000000000;
@@ -1755,6 +1802,99 @@ pub const RT_CLASS_MAIN: u8 = 254;
pub const RT_CLASS_LOCAL: u8 = 255;
pub const RT_CLASS_MAX: u8 = 255;
+// linux/neighbor.h
+pub const NUD_NONE: u16 = 0x00;
+pub const NUD_INCOMPLETE: u16 = 0x01;
+pub const NUD_REACHABLE: u16 = 0x02;
+pub const NUD_STALE: u16 = 0x04;
+pub const NUD_DELAY: u16 = 0x08;
+pub const NUD_PROBE: u16 = 0x10;
+pub const NUD_FAILED: u16 = 0x20;
+pub const NUD_NOARP: u16 = 0x40;
+pub const NUD_PERMANENT: u16 = 0x80;
+
+pub const NTF_USE: u8 = 0x01;
+pub const NTF_SELF: u8 = 0x02;
+pub const NTF_MASTER: u8 = 0x04;
+pub const NTF_PROXY: u8 = 0x08;
+pub const NTF_ROUTER: u8 = 0x80;
+
+pub const NDA_UNSPEC: ::c_ushort = 0;
+pub const NDA_DST: ::c_ushort = 1;
+pub const NDA_LLADDR: ::c_ushort = 2;
+pub const NDA_CACHEINFO: ::c_ushort = 3;
+pub const NDA_PROBES: ::c_ushort = 4;
+pub const NDA_VLAN: ::c_ushort = 5;
+pub const NDA_PORT: ::c_ushort = 6;
+pub const NDA_VNI: ::c_ushort = 7;
+pub const NDA_IFINDEX: ::c_ushort = 8;
+
+// linux/rtnetlink.h
+pub const TCA_UNSPEC: ::c_ushort = 0;
+pub const TCA_KIND: ::c_ushort = 1;
+pub const TCA_OPTIONS: ::c_ushort = 2;
+pub const TCA_STATS: ::c_ushort = 3;
+pub const TCA_XSTATS: ::c_ushort = 4;
+pub const TCA_RATE: ::c_ushort = 5;
+pub const TCA_FCNT: ::c_ushort = 6;
+pub const TCA_STATS2: ::c_ushort = 7;
+pub const TCA_STAB: ::c_ushort = 8;
+
+pub const RTM_F_NOTIFY: ::c_uint = 0x100;
+pub const RTM_F_CLONED: ::c_uint = 0x200;
+pub const RTM_F_EQUALIZE: ::c_uint = 0x400;
+pub const RTM_F_PREFIX: ::c_uint = 0x800;
+
+pub const RTA_UNSPEC: ::c_ushort = 0;
+pub const RTA_DST: ::c_ushort = 1;
+pub const RTA_SRC: ::c_ushort = 2;
+pub const RTA_IIF: ::c_ushort = 3;
+pub const RTA_OIF: ::c_ushort = 4;
+pub const RTA_GATEWAY: ::c_ushort = 5;
+pub const RTA_PRIORITY: ::c_ushort = 6;
+pub const RTA_PREFSRC: ::c_ushort = 7;
+pub const RTA_METRICS: ::c_ushort = 8;
+pub const RTA_MULTIPATH: ::c_ushort = 9;
+pub const RTA_PROTOINFO: ::c_ushort = 10; // No longer used
+pub const RTA_FLOW: ::c_ushort = 11;
+pub const RTA_CACHEINFO: ::c_ushort = 12;
+pub const RTA_SESSION: ::c_ushort = 13; // No longer used
+pub const RTA_MP_ALGO: ::c_ushort = 14; // No longer used
+pub const RTA_TABLE: ::c_ushort = 15;
+pub const RTA_MARK: ::c_ushort = 16;
+pub const RTA_MFC_STATS: ::c_ushort = 17;
+
+pub const RTN_UNSPEC: ::c_uchar = 0;
+pub const RTN_UNICAST: ::c_uchar = 1;
+pub const RTN_LOCAL: ::c_uchar = 2;
+pub const RTN_BROADCAST: ::c_uchar = 3;
+pub const RTN_ANYCAST: ::c_uchar = 4;
+pub const RTN_MULTICAST: ::c_uchar = 5;
+pub const RTN_BLACKHOLE: ::c_uchar = 6;
+pub const RTN_UNREACHABLE: ::c_uchar = 7;
+pub const RTN_PROHIBIT: ::c_uchar = 8;
+pub const RTN_THROW: ::c_uchar = 9;
+pub const RTN_NAT: ::c_uchar = 10;
+pub const RTN_XRESOLVE: ::c_uchar = 11;
+
+pub const RTPROT_UNSPEC: ::c_uchar = 0;
+pub const RTPROT_REDIRECT: ::c_uchar = 1;
+pub const RTPROT_KERNEL: ::c_uchar = 2;
+pub const RTPROT_BOOT: ::c_uchar = 3;
+pub const RTPROT_STATIC: ::c_uchar = 4;
+
+pub const RT_SCOPE_UNIVERSE: ::c_uchar = 0;
+pub const RT_SCOPE_SITE: ::c_uchar = 200;
+pub const RT_SCOPE_LINK: ::c_uchar = 253;
+pub const RT_SCOPE_HOST: ::c_uchar = 254;
+pub const RT_SCOPE_NOWHERE: ::c_uchar = 255;
+
+pub const RT_TABLE_UNSPEC: ::c_uchar = 0;
+pub const RT_TABLE_COMPAT: ::c_uchar = 252;
+pub const RT_TABLE_DEFAULT: ::c_uchar = 253;
+pub const RT_TABLE_MAIN: ::c_uchar = 254;
+pub const RT_TABLE_LOCAL: ::c_uchar = 255;
+
pub const RTMSG_OVERRUN: u32 = ::NLMSG_OVERRUN as u32;
pub const RTMSG_NEWDEVICE: u32 = 0x11;
pub const RTMSG_DELDEVICE: u32 = 0x12;
@@ -1800,6 +1940,62 @@ pub const ALG_SET_AEAD_AUTHSIZE: ::c_int = 5;
pub const ALG_OP_DECRYPT: ::c_int = 0;
pub const ALG_OP_ENCRYPT: ::c_int = 1;
+// uapi/linux/inotify.h
+pub const IN_ACCESS: ::uint32_t = 0x0000_0001;
+pub const IN_MODIFY: ::uint32_t = 0x0000_0002;
+pub const IN_ATTRIB: ::uint32_t = 0x0000_0004;
+pub const IN_CLOSE_WRITE: ::uint32_t = 0x0000_0008;
+pub const IN_CLOSE_NOWRITE: ::uint32_t = 0x0000_0010;
+pub const IN_CLOSE: ::uint32_t = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE);
+pub const IN_OPEN: ::uint32_t = 0x0000_0020;
+pub const IN_MOVED_FROM: ::uint32_t = 0x0000_0040;
+pub const IN_MOVED_TO: ::uint32_t = 0x0000_0080;
+pub const IN_MOVE: ::uint32_t = (IN_MOVED_FROM | IN_MOVED_TO);
+pub const IN_CREATE: ::uint32_t = 0x0000_0100;
+pub const IN_DELETE: ::uint32_t = 0x0000_0200;
+pub const IN_DELETE_SELF: ::uint32_t = 0x0000_0400;
+pub const IN_MOVE_SELF: ::uint32_t = 0x0000_0800;
+pub const IN_UNMOUNT: ::uint32_t = 0x0000_2000;
+pub const IN_Q_OVERFLOW: ::uint32_t = 0x0000_4000;
+pub const IN_IGNORED: ::uint32_t = 0x0000_8000;
+pub const IN_ONLYDIR: ::uint32_t = 0x0100_0000;
+pub const IN_DONT_FOLLOW: ::uint32_t = 0x0200_0000;
+// pub const IN_EXCL_UNLINK: ::uint32_t = 0x0400_0000;
+
+// pub const IN_MASK_CREATE: ::uint32_t = 0x1000_0000;
+// pub const IN_MASK_ADD: ::uint32_t = 0x2000_0000;
+pub const IN_ISDIR: ::uint32_t = 0x4000_0000;
+pub const IN_ONESHOT: ::uint32_t = 0x8000_0000;
+
+pub const IN_ALL_EVENTS: ::uint32_t = (
+ IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE |
+ IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM |
+ IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF |
+ IN_MOVE_SELF
+);
+
+pub const IN_CLOEXEC: ::c_int = O_CLOEXEC;
+pub const IN_NONBLOCK: ::c_int = O_NONBLOCK;
+
+pub const FUTEX_WAIT: ::c_int = 0;
+pub const FUTEX_WAKE: ::c_int = 1;
+pub const FUTEX_FD: ::c_int = 2;
+pub const FUTEX_REQUEUE: ::c_int = 3;
+pub const FUTEX_CMP_REQUEUE: ::c_int = 4;
+pub const FUTEX_WAKE_OP: ::c_int = 5;
+pub const FUTEX_LOCK_PI: ::c_int = 6;
+pub const FUTEX_UNLOCK_PI: ::c_int = 7;
+pub const FUTEX_TRYLOCK_PI: ::c_int = 8;
+pub const FUTEX_WAIT_BITSET: ::c_int = 9;
+pub const FUTEX_WAKE_BITSET: ::c_int = 10;
+pub const FUTEX_WAIT_REQUEUE_PI: ::c_int = 11;
+pub const FUTEX_CMP_REQUEUE_PI: ::c_int = 12;
+
+pub const FUTEX_PRIVATE_FLAG: ::c_int = 128;
+pub const FUTEX_CLOCK_REALTIME: ::c_int = 256;
+pub const FUTEX_CMD_MASK: ::c_int =
+ !(FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME);
+
f! {
pub fn CMSG_NXTHDR(mhdr: *const msghdr,
cmsg: *const cmsghdr) -> *mut cmsghdr {
@@ -1899,6 +2095,11 @@ f! {
}
extern {
+ #[cfg_attr(not(target_env = "musl"),
+ link_name = "__xpg_strerror_r")]
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn abs(i: ::c_int) -> ::c_int;
pub fn atof(s: *const ::c_char) -> ::c_double;
pub fn labs(i: ::c_long) -> ::c_long;
@@ -2229,7 +2430,7 @@ extern {
count: ::size_t) -> ::ssize_t;
pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
@@ -2385,6 +2586,11 @@ extern {
stream: *mut ::FILE
) -> ::size_t;
pub fn inotify_rm_watch(fd: ::c_int, wd: ::c_int) -> ::c_int;
+ pub fn inotify_init() -> ::c_int;
+ pub fn inotify_init1(flags: ::c_int) -> ::c_int;
+ pub fn inotify_add_watch(fd: ::c_int,
+ path: *const ::c_char,
+ mask: ::uint32_t) -> ::c_int;
}
cfg_if! {
diff --git a/src/unix/notbsd/linux/musl/b32/mips.rs b/src/unix/notbsd/linux/musl/b32/mips.rs
index b0694d1ea8..37430af5f9 100644
--- a/src/unix/notbsd/linux/musl/b32/mips.rs
+++ b/src/unix/notbsd/linux/musl/b32/mips.rs
@@ -514,7 +514,6 @@ pub const SYS_mknod: ::c_long = 4000 + 14;
pub const SYS_chmod: ::c_long = 4000 + 15;
pub const SYS_lchown: ::c_long = 4000 + 16;
pub const SYS_break: ::c_long = 4000 + 17;
-pub const SYS_unused18: ::c_long = 4000 + 18;
pub const SYS_lseek: ::c_long = 4000 + 19;
pub const SYS_getpid: ::c_long = 4000 + 20;
pub const SYS_mount: ::c_long = 4000 + 21;
@@ -524,7 +523,6 @@ pub const SYS_getuid: ::c_long = 4000 + 24;
pub const SYS_stime: ::c_long = 4000 + 25;
pub const SYS_ptrace: ::c_long = 4000 + 26;
pub const SYS_alarm: ::c_long = 4000 + 27;
-pub const SYS_unused28: ::c_long = 4000 + 28;
pub const SYS_pause: ::c_long = 4000 + 29;
pub const SYS_utime: ::c_long = 4000 + 30;
pub const SYS_stty: ::c_long = 4000 + 31;
@@ -555,7 +553,6 @@ pub const SYS_fcntl: ::c_long = 4000 + 55;
pub const SYS_mpx: ::c_long = 4000 + 56;
pub const SYS_setpgid: ::c_long = 4000 + 57;
pub const SYS_ulimit: ::c_long = 4000 + 58;
-pub const SYS_unused59: ::c_long = 4000 + 59;
pub const SYS_umask: ::c_long = 4000 + 60;
pub const SYS_chroot: ::c_long = 4000 + 61;
pub const SYS_ustat: ::c_long = 4000 + 62;
@@ -578,9 +575,7 @@ pub const SYS_gettimeofday: ::c_long = 4000 + 78;
pub const SYS_settimeofday: ::c_long = 4000 + 79;
pub const SYS_getgroups: ::c_long = 4000 + 80;
pub const SYS_setgroups: ::c_long = 4000 + 81;
-pub const SYS_reserved82: ::c_long = 4000 + 82;
pub const SYS_symlink: ::c_long = 4000 + 83;
-pub const SYS_unused84: ::c_long = 4000 + 84;
pub const SYS_readlink: ::c_long = 4000 + 85;
pub const SYS_uselib: ::c_long = 4000 + 86;
pub const SYS_swapon: ::c_long = 4000 + 87;
@@ -605,7 +600,6 @@ pub const SYS_getitimer: ::c_long = 4000 + 105;
pub const SYS_stat: ::c_long = 4000 + 106;
pub const SYS_lstat: ::c_long = 4000 + 107;
pub const SYS_fstat: ::c_long = 4000 + 108;
-pub const SYS_unused109: ::c_long = 4000 + 109;
pub const SYS_iopl: ::c_long = 4000 + 110;
pub const SYS_vhangup: ::c_long = 4000 + 111;
pub const SYS_idle: ::c_long = 4000 + 112;
@@ -645,7 +639,6 @@ pub const SYS_writev: ::c_long = 4000 + 146;
pub const SYS_cacheflush: ::c_long = 4000 + 147;
pub const SYS_cachectl: ::c_long = 4000 + 148;
pub const SYS_sysmips: ::c_long = 4000 + 149;
-pub const SYS_unused150: ::c_long = 4000 + 150;
pub const SYS_getsid: ::c_long = 4000 + 151;
pub const SYS_fdatasync: ::c_long = 4000 + 152;
pub const SYS__sysctl: ::c_long = 4000 + 153;
@@ -714,7 +707,6 @@ pub const SYS_mincore: ::c_long = 4000 + 217;
pub const SYS_madvise: ::c_long = 4000 + 218;
pub const SYS_getdents64: ::c_long = 4000 + 219;
pub const SYS_fcntl64: ::c_long = 4000 + 220;
-pub const SYS_reserved221: ::c_long = 4000 + 221;
pub const SYS_gettid: ::c_long = 4000 + 222;
pub const SYS_readahead: ::c_long = 4000 + 223;
pub const SYS_setxattr: ::c_long = 4000 + 224;
diff --git a/src/unix/notbsd/linux/musl/mod.rs b/src/unix/notbsd/linux/musl/mod.rs
index 4f4a3d868a..f230064c9e 100644
--- a/src/unix/notbsd/linux/musl/mod.rs
+++ b/src/unix/notbsd/linux/musl/mod.rs
@@ -279,6 +279,9 @@ pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209;
pub const EPOLLWAKEUP: ::c_int = 0x20000000;
+pub const SEEK_DATA: ::c_int = 3;
+pub const SEEK_HOLE: ::c_int = 4;
+
pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK;
pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK;
@@ -322,6 +325,8 @@ pub const SO_PEEK_OFF: ::c_int = 42;
pub const SO_BUSY_POLL: ::c_int = 46;
extern {
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn ptrace(request: ::c_int, ...) -> ::c_long;
pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
diff --git a/src/unix/notbsd/linux/other/b32/arm.rs b/src/unix/notbsd/linux/other/b32/arm.rs
index a70af4331f..7f00d9a113 100644
--- a/src/unix/notbsd/linux/other/b32/arm.rs
+++ b/src/unix/notbsd/linux/other/b32/arm.rs
@@ -136,9 +136,6 @@ pub const SO_RCVBUFFORCE: ::c_int = 33;
pub const FIOCLEX: ::c_ulong = 0x5451;
pub const FIONBIO: ::c_ulong = 0x5421;
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-
pub const MCL_CURRENT: ::c_int = 0x0001;
pub const MCL_FUTURE: ::c_int = 0x0002;
diff --git a/src/unix/notbsd/linux/other/b32/x86.rs b/src/unix/notbsd/linux/other/b32/x86.rs
index 563ac98ac3..e7c3b9a83a 100644
--- a/src/unix/notbsd/linux/other/b32/x86.rs
+++ b/src/unix/notbsd/linux/other/b32/x86.rs
@@ -212,6 +212,7 @@ s_no_extra_traits!{
pub uc_mcontext: mcontext_t,
pub uc_sigmask: ::sigset_t,
__private: [u8; 112],
+ __ssp: [::c_ulong; 4],
}
}
diff --git a/src/unix/notbsd/linux/other/b64/aarch64.rs b/src/unix/notbsd/linux/other/b64/aarch64.rs
index d6e37ff57b..3bd2e02eeb 100644
--- a/src/unix/notbsd/linux/other/b64/aarch64.rs
+++ b/src/unix/notbsd/linux/other/b64/aarch64.rs
@@ -786,7 +786,6 @@ pub const SYS_rt_tgsigqueueinfo: ::c_long = 240;
pub const SYS_perf_event_open: ::c_long = 241;
pub const SYS_accept4: ::c_long = 242;
pub const SYS_recvmmsg: ::c_long = 243;
-pub const SYS_arch_specific_syscall: ::c_long = 244;
pub const SYS_wait4: ::c_long = 260;
pub const SYS_prlimit64: ::c_long = 261;
pub const SYS_fanotify_init: ::c_long = 262;
@@ -818,7 +817,6 @@ pub const SYS_pwritev2: ::c_long = 287;
pub const SYS_pkey_mprotect: ::c_long = 288;
pub const SYS_pkey_alloc: ::c_long = 289;
pub const SYS_pkey_free: ::c_long = 290;
-pub const SYS_syscalls: ::c_long = 291;
#[link(name = "util")]
extern {
diff --git a/src/unix/notbsd/linux/other/b64/sparc64.rs b/src/unix/notbsd/linux/other/b64/sparc64.rs
index 325c7937fc..5d268658cc 100644
--- a/src/unix/notbsd/linux/other/b64/sparc64.rs
+++ b/src/unix/notbsd/linux/other/b64/sparc64.rs
@@ -495,7 +495,7 @@ pub const VEOL2: usize = 6;
pub const VMIN: usize = 4;
pub const IEXTEN: ::tcflag_t = 0x8000;
pub const TOSTOP: ::tcflag_t = 0x100;
-pub const FLUSHO: ::tcflag_t = 0x2000;
+pub const FLUSHO: ::tcflag_t = 0x1000;
pub const EXTPROC: ::tcflag_t = 0x10000;
pub const TCGETS: ::c_ulong = 0x40245408;
pub const TCSETS: ::c_ulong = 0x80245409;
diff --git a/src/unix/notbsd/linux/other/b64/x86_64.rs b/src/unix/notbsd/linux/other/b64/x86_64.rs
index d4f4ffc4da..79f27e083f 100644
--- a/src/unix/notbsd/linux/other/b64/x86_64.rs
+++ b/src/unix/notbsd/linux/other/b64/x86_64.rs
@@ -231,6 +231,7 @@ s_no_extra_traits! {
pub uc_mcontext: mcontext_t,
pub uc_sigmask: ::sigset_t,
__private: [u8; 512],
+ __ssp: [::c_ulonglong; 4],
}
}
diff --git a/src/unix/notbsd/linux/other/mod.rs b/src/unix/notbsd/linux/other/mod.rs
index d289f05385..e82ee4fa09 100644
--- a/src/unix/notbsd/linux/other/mod.rs
+++ b/src/unix/notbsd/linux/other/mod.rs
@@ -48,6 +48,12 @@ s! {
pub si_signo: ::c_int,
pub si_errno: ::c_int,
pub si_code: ::c_int,
+ #[deprecated(
+ since="0.2.54",
+ note="Please leave a comment on \
+ https://github.com/rust-lang/libc/pull/1316 if you're using \
+ this field"
+ )]
pub _pad: [::c_int; 29],
#[cfg(target_arch = "x86_64")]
_align: [u64; 0],
@@ -194,6 +200,19 @@ s! {
}
}
+impl siginfo_t {
+ pub unsafe fn si_addr(&self) -> *mut ::c_void {
+ #[repr(C)]
+ struct siginfo_sigfault {
+ _si_signo: ::c_int,
+ _si_errno: ::c_int,
+ _si_code: ::c_int,
+ si_addr: *mut ::c_void
+ }
+ (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr
+ }
+}
+
s_no_extra_traits! {
pub struct utmpx {
pub ut_type: ::c_short,
@@ -206,23 +225,19 @@ s_no_extra_traits! {
pub ut_exit: __exit_status,
#[cfg(any(target_arch = "aarch64",
- target_arch = "sparc64",
all(target_pointer_width = "32",
not(target_arch = "x86_64"))))]
pub ut_session: ::c_long,
#[cfg(any(target_arch = "aarch64",
- target_arch = "sparc64",
all(target_pointer_width = "32",
not(target_arch = "x86_64"))))]
pub ut_tv: ::timeval,
#[cfg(not(any(target_arch = "aarch64",
- target_arch = "sparc64",
all(target_pointer_width = "32",
not(target_arch = "x86_64")))))]
pub ut_session: ::int32_t,
#[cfg(not(any(target_arch = "aarch64",
- target_arch = "sparc64",
all(target_pointer_width = "32",
not(target_arch = "x86_64")))))]
pub ut_tv: __timeval,
@@ -358,6 +373,8 @@ pub const MAP_EXECUTABLE: ::c_int = 0x01000;
pub const MAP_POPULATE: ::c_int = 0x08000;
pub const MAP_NONBLOCK: ::c_int = 0x010000;
pub const MAP_STACK: ::c_int = 0x020000;
+pub const MAP_SHARED_VALIDATE: ::c_int = 0x3;
+pub const MAP_FIXED_NOREPLACE: ::c_int = 0x100000;
pub const ENOTSUP: ::c_int = EOPNOTSUPP;
pub const EUCLEAN: ::c_int = 117;
@@ -586,6 +603,41 @@ pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
+// linux/rtnetlink.h
+pub const TCA_PAD: ::c_ushort = 9;
+pub const TCA_DUMP_INVISIBLE: ::c_ushort = 10;
+pub const TCA_CHAIN: ::c_ushort = 11;
+pub const TCA_HW_OFFLOAD: ::c_ushort = 12;
+
+pub const RTM_F_LOOKUP_TABLE: ::c_uint = 0x1000;
+pub const RTM_F_FIB_MATCH: ::c_uint = 0x2000;
+
+pub const RTA_VIA: ::c_ushort = 18;
+pub const RTA_NEWDST: ::c_ushort = 19;
+pub const RTA_PREF: ::c_ushort = 20;
+pub const RTA_ENCAP_TYPE: ::c_ushort = 21;
+pub const RTA_ENCAP: ::c_ushort = 22;
+pub const RTA_EXPIRES: ::c_ushort = 23;
+pub const RTA_PAD: ::c_ushort = 24;
+pub const RTA_UID: ::c_ushort = 25;
+pub const RTA_TTL_PROPAGATE: ::c_ushort = 26;
+
+// linux/neighbor.h
+pub const NTF_EXT_LEARNED: u8 = 0x10;
+pub const NTF_OFFLOADED: u8 = 0x20;
+
+pub const NDA_MASTER: ::c_ushort = 9;
+pub const NDA_LINK_NETNSID: ::c_ushort = 10;
+pub const NDA_SRC_VNI: ::c_ushort = 11;
+
+// linux/if_addr.h
+pub const IFA_FLAGS: ::c_ushort = 8;
+
+pub const IFA_F_MANAGETEMPADDR: u32 = 0x100;
+pub const IFA_F_NOPREFIXROUTE: u32 = 0x200;
+pub const IFA_F_MCAUTOJOIN: u32 = 0x400;
+pub const IFA_F_STABLE_PRIVACY: u32 = 0x800;
+
pub const NETLINK_ROUTE: ::c_int = 0;
pub const NETLINK_UNUSED: ::c_int = 1;
pub const NETLINK_USERSOCK: ::c_int = 2;
@@ -669,24 +721,10 @@ pub const NFPROTO_INET: ::c_int = 1;
pub const NFPROTO_NETDEV: ::c_int = 5;
// linux/netfilter/nf_tables.h
-cfg_if!{
- if #[cfg(any(target_arch = "arm", target_arch = "powerpc",
- target_arch = "powerpc64", target_arch = "aarch64"))] {
- pub const NFT_TABLE_MAXNAMELEN: ::c_int = 32;
- pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 32;
- pub const NFT_SET_MAXNAMELEN: ::c_int = 32;
- pub const NFT_OBJ_MAXNAMELEN: ::c_int = 32;
- } else if #[cfg(target_arch = "sparc64")] {
- pub const NFT_TABLE_MAXNAMELEN: ::c_int = 32;
- pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 32;
- pub const NFT_SET_MAXNAMELEN: ::c_int = 32;
- } else {
- pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256;
- pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256;
- pub const NFT_SET_MAXNAMELEN: ::c_int = 256;
- pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256;
- }
-}
+pub const NFT_TABLE_MAXNAMELEN: ::c_int = 256;
+pub const NFT_CHAIN_MAXNAMELEN: ::c_int = 256;
+pub const NFT_SET_MAXNAMELEN: ::c_int = 256;
+pub const NFT_OBJ_MAXNAMELEN: ::c_int = 256;
pub const NFT_USERDATA_MAXLEN: ::c_int = 256;
pub const NFT_REG_VERDICT: ::c_int = 0;
@@ -745,11 +783,9 @@ cfg_if! {
pub const NFT_MSG_GETOBJ: ::c_int = 19;
pub const NFT_MSG_DELOBJ: ::c_int = 20;
pub const NFT_MSG_GETOBJ_RESET: ::c_int = 21;
- pub const NFT_MSG_MAX: ::c_int = 22;
- } else {
- pub const NFT_MSG_MAX: ::c_int = 18;
}
}
+pub const NFT_MSG_MAX: ::c_int = 25;
pub const NFT_SET_ANONYMOUS: ::c_int = 0x1;
pub const NFT_SET_CONSTANT: ::c_int = 0x2;
@@ -917,6 +953,8 @@ extern {
pub fn endutxent();
pub fn getpt() -> ::c_int;
pub fn mallopt(param: ::c_int, value: ::c_int) -> ::c_int;
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
}
#[link(name = "util")]
diff --git a/src/unix/notbsd/linux/s390x/mod.rs b/src/unix/notbsd/linux/s390x/mod.rs
index ebe9d41710..b9059687df 100644
--- a/src/unix/notbsd/linux/s390x/mod.rs
+++ b/src/unix/notbsd/linux/s390x/mod.rs
@@ -517,6 +517,8 @@ pub const MAP_NORESERVE: ::c_int = 0x04000;
pub const MAP_POPULATE: ::c_int = 0x08000;
pub const MAP_NONBLOCK: ::c_int = 0x010000;
pub const MAP_STACK: ::c_int = 0x020000;
+pub const MAP_SHARED_VALIDATE: ::c_int = 0x3;
+pub const MAP_FIXED_NOREPLACE: ::c_int = 0x100000;
pub const EDEADLOCK: ::c_int = 35;
pub const ENAMETOOLONG: ::c_int = 36;
@@ -782,10 +784,6 @@ pub const PTRACE_POKEUSER: ::c_uint = 6;
pub const PTRACE_CONT: ::c_uint = 7;
pub const PTRACE_KILL: ::c_uint = 8;
pub const PTRACE_SINGLESTEP: ::c_uint = 9;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
pub const PTRACE_ATTACH: ::c_uint = 16;
pub const PTRACE_DETACH: ::c_uint = 17;
pub const PTRACE_SYSCALL: ::c_uint = 24;
diff --git a/src/unix/notbsd/mod.rs b/src/unix/notbsd/mod.rs
index 13ddb292d3..ea1e7c69bb 100644
--- a/src/unix/notbsd/mod.rs
+++ b/src/unix/notbsd/mod.rs
@@ -1,5 +1,4 @@
pub type sa_family_t = u16;
-pub type pthread_key_t = ::c_uint;
pub type speed_t = ::c_uint;
pub type tcflag_t = ::c_uint;
pub type clockid_t = ::c_int;
@@ -208,13 +207,6 @@ s! {
pub ar_op: u16,
}
- pub struct inotify_event {
- pub wd: ::c_int,
- pub mask: ::uint32_t,
- pub cookie: ::uint32_t,
- pub len: ::uint32_t
- }
-
pub struct mmsghdr {
pub msg_hdr: ::msghdr,
pub msg_len: ::c_uint,
@@ -587,10 +579,8 @@ pub const MS_KERNMOUNT: ::c_ulong = 0x400000;
pub const MS_I_VERSION: ::c_ulong = 0x800000;
pub const MS_STRICTATIME: ::c_ulong = 0x1000000;
pub const MS_ACTIVE: ::c_ulong = 0x40000000;
-pub const MS_NOUSER: ::c_ulong = 0x80000000;
pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000;
pub const MS_MGC_MSK: ::c_ulong = 0xffff0000;
-pub const MS_RMT_MASK: ::c_ulong = 0x800051;
pub const EPERM: ::c_int = 1;
pub const ENOENT: ::c_int = 2;
@@ -807,7 +797,6 @@ pub const IP_RECVTOS: ::c_int = 13;
pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
pub const IP_TRANSPARENT: ::c_int = 19;
-pub const IPV6_FLOWINFO: ::c_int = 11;
pub const IPV6_UNICAST_HOPS: ::c_int = 16;
pub const IPV6_MULTICAST_IF: ::c_int = 17;
pub const IPV6_MULTICAST_HOPS: ::c_int = 18;
@@ -815,16 +804,11 @@ pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
pub const IPV6_V6ONLY: ::c_int = 26;
-pub const IPV6_FLOWLABEL_MGR: ::c_int = 32;
-pub const IPV6_FLOWINFO_SEND: ::c_int = 33;
pub const IPV6_RECVPKTINFO: ::c_int = 49;
pub const IPV6_PKTINFO: ::c_int = 50;
pub const IPV6_RECVTCLASS: ::c_int = 66;
pub const IPV6_TCLASS: ::c_int = 67;
-pub const IPV6_FLOWINFO_FLOWLABEL: ::c_int = 0x000fffff;
-pub const IPV6_FLOWINFO_PRIORITY: ::c_int = 0x0ff00000;
-
pub const TCP_NODELAY: ::c_int = 1;
pub const TCP_MAXSEG: ::c_int = 2;
pub const TCP_CORK: ::c_int = 3;
@@ -1167,45 +1151,6 @@ pub const ARPHRD_IEEE802154: u16 = 804;
pub const ARPHRD_VOID: u16 = 0xFFFF;
pub const ARPHRD_NONE: u16 = 0xFFFE;
-// uapi/linux/inotify.h
-pub const IN_ACCESS: ::uint32_t = 0x0000_0001;
-pub const IN_MODIFY: ::uint32_t = 0x0000_0002;
-pub const IN_ATTRIB: ::uint32_t = 0x0000_0004;
-pub const IN_CLOSE_WRITE: ::uint32_t = 0x0000_0008;
-pub const IN_CLOSE_NOWRITE: ::uint32_t = 0x0000_0010;
-pub const IN_CLOSE: ::uint32_t = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE);
-pub const IN_OPEN: ::uint32_t = 0x0000_0020;
-pub const IN_MOVED_FROM: ::uint32_t = 0x0000_0040;
-pub const IN_MOVED_TO: ::uint32_t = 0x0000_0080;
-pub const IN_MOVE: ::uint32_t = (IN_MOVED_FROM | IN_MOVED_TO);
-pub const IN_CREATE: ::uint32_t = 0x0000_0100;
-pub const IN_DELETE: ::uint32_t = 0x0000_0200;
-pub const IN_DELETE_SELF: ::uint32_t = 0x0000_0400;
-pub const IN_MOVE_SELF: ::uint32_t = 0x0000_0800;
-
-pub const IN_UNMOUNT: ::uint32_t = 0x0000_2000;
-pub const IN_Q_OVERFLOW: ::uint32_t = 0x0000_4000;
-pub const IN_IGNORED: ::uint32_t = 0x0000_8000;
-
-pub const IN_ONLYDIR: ::uint32_t = 0x0100_0000;
-pub const IN_DONT_FOLLOW: ::uint32_t = 0x0200_0000;
-// pub const IN_EXCL_UNLINK: ::uint32_t = 0x0400_0000;
-
-// pub const IN_MASK_CREATE: ::uint32_t = 0x1000_0000;
-// pub const IN_MASK_ADD: ::uint32_t = 0x2000_0000;
-pub const IN_ISDIR: ::uint32_t = 0x4000_0000;
-pub const IN_ONESHOT: ::uint32_t = 0x8000_0000;
-
-pub const IN_ALL_EVENTS: ::uint32_t = (
- IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE |
- IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM |
- IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF |
- IN_MOVE_SELF
-);
-
-pub const IN_CLOEXEC: ::c_int = O_CLOEXEC;
-pub const IN_NONBLOCK: ::c_int = O_NONBLOCK;
-
fn CMSG_ALIGN(len: usize) -> usize {
len + ::mem::size_of::<usize>() - 1 & !(::mem::size_of::<usize>() - 1)
}
@@ -1317,7 +1262,6 @@ extern {
pshared: ::c_int,
value: ::c_uint)
-> ::c_int;
-
pub fn fdatasync(fd: ::c_int) -> ::c_int;
pub fn mincore(addr: *mut ::c_void, len: ::size_t,
vec: *mut ::c_uchar) -> ::c_int;
@@ -1435,6 +1379,11 @@ extern {
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 login_tty(fd: ::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,
@@ -1458,11 +1407,6 @@ extern {
pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-> ::ssize_t;
pub fn uname(buf: *mut ::utsname) -> ::c_int;
- pub fn inotify_init() -> ::c_int;
- pub fn inotify_init1(flags: ::c_int) -> ::c_int;
- pub fn inotify_add_watch(fd: ::c_int,
- path: *const ::c_char,
- mask: ::uint32_t) -> ::c_int;
}
cfg_if! {
@@ -1479,7 +1423,3 @@ cfg_if! {
// Unknown target_os
}
}
- // pub fn forkpty(amaster: *mut ::c_int,
- // name: *mut ::c_char,
- // termp: *const termios,
- // winp: *const ::winsize) -> ::pid_t;
diff --git a/src/unix/redox/mod.rs b/src/unix/redox/mod.rs
new file mode 100644
index 0000000000..4131bb9cf3
--- /dev/null
+++ b/src/unix/redox/mod.rs
@@ -0,0 +1,593 @@
+pub type c_char = i8;
+pub type c_long = i64;
+pub type c_ulong = u64;
+pub type wchar_t = i32;
+
+pub type blkcnt_t = ::c_ulong;
+pub type blksize_t = ::c_long;
+pub type clock_t = ::c_long;
+pub type clockid_t = ::c_int;
+pub type dev_t = ::c_long;
+pub type fsblkcnt_t = ::c_ulong;
+pub type fsfilcnt_t = ::c_ulong;
+pub type ino_t = ::c_ulong;
+pub type mode_t = ::c_int;
+pub type nfds_t = ::c_ulong;
+pub type nlink_t = ::c_ulong;
+pub type off_t = ::c_long;
+pub type pthread_t = *mut ::c_void;
+pub type pthread_attr_t = *mut ::c_void;
+pub type pthread_cond_t = *mut ::c_void;
+pub type pthread_condattr_t = *mut ::c_void;
+// Must be usize due to libstd/sys_common/thread_local.rs,
+// should technically be *mut ::c_void
+pub type pthread_key_t = usize;
+pub type pthread_mutex_t = *mut ::c_void;
+pub type pthread_mutexattr_t = *mut ::c_void;
+pub type pthread_rwlock_t = *mut ::c_void;
+pub type pthread_rwlockattr_t = *mut ::c_void;
+pub type rlim_t = ::c_ulonglong;
+pub type sa_family_t = u16;
+pub type sem_t = *mut ::c_void;
+pub type sigset_t = ::c_ulong;
+pub type socklen_t = u32;
+pub type speed_t = u32;
+pub type suseconds_t = ::c_int;
+pub type tcflag_t = u32;
+pub type time_t = ::c_long;
+
+s! {
+ pub struct addrinfo {
+ pub ai_flags: ::c_int,
+ pub ai_family: ::c_int,
+ pub ai_socktype: ::c_int,
+ pub ai_protocol: ::c_int,
+ pub ai_addrlen: ::size_t,
+ pub ai_canonname: *mut ::c_char,
+ pub ai_addr: *mut ::sockaddr,
+ pub ai_next: *mut ::addrinfo,
+ }
+
+ pub struct dirent {
+ pub d_ino: ::ino_t,
+ pub d_off: ::off_t,
+ pub d_reclen: ::c_ushort,
+ pub d_type: ::c_uchar,
+ pub d_name: [::c_char; 256],
+ }
+
+ pub struct Dl_info {
+ pub dli_fname: *const ::c_char,
+ pub dli_fbase: *mut ::c_void,
+ pub dli_sname: *const ::c_char,
+ pub dli_saddr: *mut ::c_void,
+ }
+
+ pub struct epoll_event {
+ pub events: u32,
+ pub u64: u64,
+ pub _pad: u64,
+ }
+
+ pub struct fd_set {
+ fds_bits: [::c_ulong; ::FD_SETSIZE / ULONG_SIZE],
+ }
+
+ pub struct in_addr {
+ pub s_addr: ::in_addr_t,
+ }
+
+ pub struct ip_mreq {
+ pub imr_multiaddr: ::in_addr,
+ pub imr_interface: ::in_addr,
+ }
+
+ pub struct lconv {
+ pub currency_symbol: *const ::c_char,
+ pub decimal_point: *const ::c_char,
+ pub frac_digits: ::c_char,
+ pub grouping: *const ::c_char,
+ pub int_curr_symbol: *const ::c_char,
+ pub int_frac_digits: ::c_char,
+ pub mon_decimal_point: *const ::c_char,
+ pub mon_grouping: *const ::c_char,
+ pub mon_thousands_sep: *const ::c_char,
+ pub negative_sign: *const ::c_char,
+ pub n_cs_precedes: ::c_char,
+ pub n_sep_by_space: ::c_char,
+ pub n_sign_posn: ::c_char,
+ pub positive_sign: *const ::c_char,
+ pub p_cs_precedes: ::c_char,
+ pub p_sep_by_space: ::c_char,
+ pub p_sign_posn: ::c_char,
+ pub thousands_sep: *const ::c_char,
+ }
+
+ pub struct passwd {
+ pub pw_name: *mut ::c_char,
+ pub pw_passwd: *mut ::c_char,
+ pub pw_uid: ::uid_t,
+ pub pw_gid: ::gid_t,
+ pub pw_gecos: *mut ::c_char,
+ pub pw_dir: *mut ::c_char,
+ pub pw_shell: *mut ::c_char,
+ }
+
+ pub struct sigaction {
+ pub sa_handler: ::sighandler_t,
+ pub sa_flags: ::c_ulong,
+ pub sa_restorer: ::Option<extern fn()>,
+ pub sa_mask: ::sigset_t,
+ }
+
+ pub struct sockaddr {
+ pub sa_family: ::sa_family_t,
+ pub sa_data: [::c_char; 14],
+ }
+
+ pub struct sockaddr_in {
+ pub sin_family: ::sa_family_t,
+ pub sin_port: ::in_port_t,
+ pub sin_addr: ::in_addr,
+ pub sin_zero: [::c_char; 8],
+ }
+
+ pub struct sockaddr_in6 {
+ pub sin6_family: ::sa_family_t,
+ pub sin6_port: ::in_port_t,
+ pub sin6_flowinfo: u32,
+ pub sin6_addr: ::in6_addr,
+ pub sin6_scope_id: u32,
+ }
+
+ pub struct sockaddr_storage {
+ pub ss_family: ::sa_family_t,
+ __ss_padding: [
+ u8;
+ 128 -
+ ::core::mem::size_of::<sa_family_t>() -
+ ::core::mem::size_of::<c_ulong>()
+ ],
+ __ss_align: ::c_ulong,
+ }
+
+ pub struct sockaddr_un {
+ pub sun_family: ::sa_family_t,
+ pub sun_path: [::c_char; 108]
+ }
+
+ pub struct stat {
+ pub st_dev: ::dev_t,
+ pub st_ino: ::ino_t,
+ pub st_nlink: ::nlink_t,
+ pub st_mode: ::mode_t,
+ pub st_uid: ::uid_t,
+ pub st_gid: ::gid_t,
+ pub st_rdev: ::dev_t,
+ pub st_size: ::off_t,
+ pub st_blksize: ::blksize_t,
+ pub st_blocks: ::blkcnt_t,
+ pub st_atime: ::time_t,
+ pub st_atime_nsec: ::c_long,
+ pub st_mtime: ::time_t,
+ pub st_mtime_nsec: ::c_long,
+ pub st_ctime: ::time_t,
+ pub st_ctime_nsec: ::c_long,
+ _pad: [::c_char; 24],
+ }
+
+ pub struct statvfs {
+ pub f_bsize: ::c_ulong,
+ pub f_frsize: ::c_ulong,
+ pub f_blocks: ::fsblkcnt_t,
+ pub f_bfree: ::fsblkcnt_t,
+ pub f_bavail: ::fsblkcnt_t,
+ pub f_files: ::fsfilcnt_t,
+ pub f_ffree: ::fsfilcnt_t,
+ pub f_favail: ::fsfilcnt_t,
+ pub f_fsid: ::c_ulong,
+ pub f_flag: ::c_ulong,
+ pub f_namemax: ::c_ulong,
+ }
+
+ 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_line: ::cc_t,
+ pub c_cc: [::cc_t; ::NCCS],
+ pub c_ispeed: ::speed_t,
+ pub c_ospeed: ::speed_t,
+ }
+
+ pub struct tm {
+ pub tm_sec: ::c_int,
+ pub tm_min: ::c_int,
+ pub tm_hour: ::c_int,
+ pub tm_mday: ::c_int,
+ pub tm_mon: ::c_int,
+ pub tm_year: ::c_int,
+ pub tm_wday: ::c_int,
+ pub tm_yday: ::c_int,
+ pub tm_isdst: ::c_int,
+ pub tm_gmtoff: ::c_long,
+ pub tm_zone: *const ::c_char,
+ }
+}
+
+// TODO: relibc {
+ pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
+// }
+
+// dlfcn.h
+
+pub const RTLD_LAZY: ::c_int = 0x0001;
+pub const RTLD_NOW: ::c_int = 0x0002;
+pub const RTLD_GLOBAL: ::c_int = 0x0100;
+pub const RTLD_LOCAL: ::c_int = 0x0000;
+
+// errno.h
+pub const EPERM: ::c_int = 1;
+pub const ENOENT: ::c_int = 2;
+pub const ESRCH: ::c_int = 3;
+pub const EINTR: ::c_int = 4;
+pub const EIO: ::c_int = 5;
+pub const ENXIO: ::c_int = 6;
+pub const E2BIG: ::c_int = 7;
+pub const ENOEXEC: ::c_int = 8;
+pub const EBADF: ::c_int = 9;
+pub const ECHILD: ::c_int = 10;
+pub const EAGAIN: ::c_int = 11;
+pub const ENOMEM: ::c_int = 12;
+pub const EACCES: ::c_int = 13;
+pub const EFAULT: ::c_int = 14;
+pub const ENOTBLK: ::c_int = 15;
+pub const EBUSY: ::c_int = 16;
+pub const EEXIST: ::c_int = 17;
+pub const EXDEV: ::c_int = 18;
+pub const ENODEV: ::c_int = 19;
+pub const ENOTDIR: ::c_int = 20;
+pub const EISDIR: ::c_int = 21;
+pub const EINVAL: ::c_int = 22;
+pub const ENFILE: ::c_int = 23;
+pub const EMFILE: ::c_int = 24;
+pub const ENOTTY: ::c_int = 25;
+pub const ETXTBSY: ::c_int = 26;
+pub const EFBIG: ::c_int = 27;
+pub const ENOSPC: ::c_int = 28;
+pub const ESPIPE: ::c_int = 29;
+pub const EROFS: ::c_int = 30;
+pub const EMLINK: ::c_int = 31;
+pub const EPIPE: ::c_int = 32;
+pub const EDOM: ::c_int = 33;
+pub const ERANGE: ::c_int = 34;
+pub const EDEADLK: ::c_int = 35;
+pub const ENOSYS: ::c_int = 38;
+pub const EWOULDBLOCK: ::c_int = 41;
+pub const EADDRINUSE: ::c_int = 98;
+pub const EADDRNOTAVAIL: ::c_int = 99;
+pub const ECONNABORTED: ::c_int = 103;
+pub const ECONNRESET: ::c_int = 104;
+pub const ENOTCONN: ::c_int = 107;
+pub const ETIMEDOUT: ::c_int = 110;
+pub const ECONNREFUSED: ::c_int = 111;
+pub const EINPROGRESS: ::c_int = 115;
+
+// fcntl.h
+pub const F_DUPFD: ::c_int = 0;
+pub const F_GETFD: ::c_int = 1;
+pub const F_SETFD: ::c_int = 2;
+pub const F_GETFL: ::c_int = 3;
+pub const F_SETFL: ::c_int = 4;
+// TODO: relibc {
+ pub const F_DUPFD_CLOEXEC: ::c_int = ::F_DUPFD;
+// }
+pub const FD_CLOEXEC: ::c_int = 0x0100_0000;
+pub const O_RDONLY: ::c_int = 0x0001_0000;
+pub const O_WRONLY: ::c_int = 0x0002_0000;
+pub const O_RDWR: ::c_int = 0x0003_0000;
+pub const O_ACCMODE: ::c_int = 0x0003_0000;
+pub const O_NONBLOCK: ::c_int = 0x0004_0000;
+pub const O_APPEND: ::c_int = 0x0008_0000;
+pub const O_SHLOCK: ::c_int = 0x0010_0000;
+pub const O_EXLOCK: ::c_int = 0x0020_0000;
+pub const O_ASYNC: ::c_int = 0x0040_0000;
+pub const O_FSYNC: ::c_int = 0x0080_0000;
+pub const O_CLOEXEC: ::c_int = 0x0100_0000;
+pub const O_CREAT: ::c_int = 0x0200_0000;
+pub const O_TRUNC: ::c_int = 0x0400_0000;
+pub const O_EXCL: ::c_int = 0x0800_0000;
+pub const O_DIRECTORY: ::c_int = 0x1000_0000;
+pub const O_PATH: ::c_int = 0x2000_0000;
+pub const O_SYMLINK: ::c_int = 0x4000_0000;
+// Negative to allow it to be used as int
+// TODO: Fix negative values missing from includes
+pub const O_NOFOLLOW: ::c_int = -0x8000_0000;
+
+// netdb.h
+pub const EAI_SYSTEM: ::c_int = -11;
+
+// netinet/in.h
+// TODO: relibc {
+ pub const IP_TTL: ::c_int = 2;
+ pub const IPV6_UNICAST_HOPS: ::c_int = 16;
+ pub const IPV6_MULTICAST_IF: ::c_int = 17;
+ pub const IPV6_MULTICAST_HOPS: ::c_int = 18;
+ pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
+ pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
+ pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
+ pub const IPV6_V6ONLY: ::c_int = 26;
+ pub const IP_MULTICAST_IF: ::c_int = 32;
+ pub const IP_MULTICAST_TTL: ::c_int = 33;
+ pub const IP_MULTICAST_LOOP: ::c_int = 34;
+ pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
+ pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
+// }
+
+// netinet/tcp.h
+pub const TCP_NODELAY: ::c_int = 1;
+// TODO: relibc {
+ pub const TCP_KEEPIDLE: ::c_int = 1;
+// }
+
+// poll.h
+pub const POLLIN: ::c_short = 0x001;
+pub const POLLPRI: ::c_short = 0x002;
+pub const POLLOUT: ::c_short = 0x004;
+pub const POLLERR: ::c_short = 0x008;
+pub const POLLHUP: ::c_short = 0x010;
+pub const POLLNVAL: ::c_short = 0x020;
+
+// pthread.h
+pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
+pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
+pub const PTHREAD_MUTEX_INITIALIZER: ::pthread_mutex_t = -1isize as *mut _;
+pub const PTHREAD_COND_INITIALIZER: ::pthread_cond_t = -1isize as *mut _;
+pub const PTHREAD_RWLOCK_INITIALIZER: ::pthread_rwlock_t = -1isize as *mut _;
+pub const PTHREAD_STACK_MIN : ::size_t = 4096;
+
+// signal.h
+pub const SIG_BLOCK: ::c_int = 0;
+pub const SIG_UNBLOCK: ::c_int = 1;
+pub const SIG_SETMASK: ::c_int = 2;
+pub const SIGHUP: ::c_int = 1;
+pub const SIGINT: ::c_int = 2;
+pub const SIGQUIT: ::c_int = 3;
+pub const SIGILL: ::c_int = 4;
+pub const SIGTRAP: ::c_int = 5;
+pub const SIGABRT: ::c_int = 6;
+pub const SIGBUS: ::c_int = 7;
+pub const SIGFPE: ::c_int = 8;
+pub const SIGKILL: ::c_int = 9;
+pub const SIGUSR1: ::c_int = 10;
+pub const SIGSEGV: ::c_int = 11;
+pub const SIGUSR2: ::c_int = 12;
+pub const SIGPIPE: ::c_int = 13;
+pub const SIGALRM: ::c_int = 14;
+pub const SIGTERM: ::c_int = 15;
+pub const SIGSTKFLT: ::c_int = 16;
+pub const SIGCHLD: ::c_int = 17;
+pub const SIGCONT: ::c_int = 18;
+pub const SIGSTOP: ::c_int = 19;
+pub const SIGTSTP: ::c_int = 20;
+pub const SIGTTIN: ::c_int = 21;
+pub const SIGTTOU: ::c_int = 22;
+pub const SIGURG: ::c_int = 23;
+pub const SIGXCPU: ::c_int = 24;
+pub const SIGXFSZ: ::c_int = 25;
+pub const SIGVTALRM: ::c_int = 26;
+pub const SIGPROF: ::c_int = 27;
+pub const SIGWINCH: ::c_int = 28;
+pub const SIGIO: ::c_int = 29;
+pub const SIGPWR: ::c_int = 30;
+pub const SIGSYS: ::c_int = 31;
+pub const NSIG: ::c_int = 32;
+
+// sys/epoll.h
+pub const EPOLL_CLOEXEC: ::c_int = 0x0100_0000;
+pub const EPOLL_CTL_ADD: ::c_int = 1;
+pub const EPOLL_CTL_DEL: ::c_int = 2;
+pub const EPOLL_CTL_MOD: ::c_int = 3;
+pub const EPOLLIN: ::c_int = 1;
+pub const EPOLLPRI: ::c_int = 0;
+pub const EPOLLOUT: ::c_int = 2;
+pub const EPOLLRDNORM: ::c_int = 0;
+pub const EPOLLNVAL: ::c_int = 0;
+pub const EPOLLRDBAND: ::c_int = 0;
+pub const EPOLLWRNORM: ::c_int = 0;
+pub const EPOLLWRBAND: ::c_int = 0;
+pub const EPOLLMSG: ::c_int = 0;
+pub const EPOLLERR: ::c_int = 0;
+pub const EPOLLHUP: ::c_int = 0;
+pub const EPOLLRDHUP: ::c_int = 0;
+pub const EPOLLEXCLUSIVE: ::c_int = 0;
+pub const EPOLLWAKEUP: ::c_int = 0;
+pub const EPOLLONESHOT: ::c_int = 0;
+pub const EPOLLET: ::c_int = 0;
+
+// sys/stat.h
+pub const S_IFMT: ::c_int = 0o0_170_000;
+pub const S_IFDIR: ::c_int = 0o040_000;
+pub const S_IFCHR: ::c_int = 0o020_000;
+pub const S_IFBLK: ::c_int = 0o060_000;
+pub const S_IFREG: ::c_int = 0o100_000;
+pub const S_IFIFO: ::c_int = 0o010_000;
+pub const S_IFLNK: ::c_int = 0o120_000;
+pub const S_IFSOCK: ::c_int = 0o140_000;
+pub const S_IRWXU: ::c_int = 0o0_700;
+pub const S_IRUSR: ::c_int = 0o0_400;
+pub const S_IWUSR: ::c_int = 0o0_200;
+pub const S_IXUSR: ::c_int = 0o0_100;
+pub const S_IRWXG: ::c_int = 0o0_070;
+pub const S_IRGRP: ::c_int = 0o0_040;
+pub const S_IWGRP: ::c_int = 0o0_020;
+pub const S_IXGRP: ::c_int = 0o0_010;
+pub const S_IRWXO: ::c_int = 0o0_007;
+pub const S_IROTH: ::c_int = 0o0_004;
+pub const S_IWOTH: ::c_int = 0o0_002;
+pub const S_IXOTH: ::c_int = 0o0_001;
+
+// stdlib.h
+pub const EXIT_SUCCESS: ::c_int = 0;
+pub const EXIT_FAILURE: ::c_int = 1;
+
+// sys/ioctl.h
+// TODO: relibc {
+ pub const FIONBIO: ::c_ulong = 0x5421;
+ pub const FIOCLEX: ::c_ulong = 0x5451;
+// }
+pub const TCGETS: ::c_ulong = 0x5401;
+pub const TCSETS: ::c_ulong = 0x5402;
+pub const TCFLSH: ::c_ulong = 0x540B;
+pub const TIOCGPGRP: ::c_ulong = 0x540F;
+pub const TIOCSPGRP: ::c_ulong = 0x5410;
+pub const TIOCGWINSZ: ::c_ulong = 0x5413;
+pub const TIOCSWINSZ: ::c_ulong = 0x5414;
+
+// sys/select.h
+pub const FD_SETSIZE: usize = 1024;
+
+// sys/socket.h
+pub const AF_UNIX: ::c_int = 1;
+pub const AF_INET: ::c_int = 2;
+pub const AF_INET6: ::c_int = 10;
+pub const MSG_PEEK: ::c_int = 2;
+pub const SHUT_RD: ::c_int = 0;
+pub const SHUT_WR: ::c_int = 1;
+pub const SHUT_RDWR: ::c_int = 2;
+pub const SO_REUSEADDR: ::c_int = 2;
+pub const SO_ERROR: ::c_int = 4;
+pub const SO_BROADCAST: ::c_int = 6;
+pub const SO_SNDBUF: ::c_int = 7;
+pub const SO_RCVBUF: ::c_int = 8;
+pub const SO_KEEPALIVE: ::c_int = 9;
+pub const SO_LINGER: ::c_int = 13;
+pub const SO_REUSEPORT: ::c_int = 15;
+pub const SO_RCVTIMEO: ::c_int = 20;
+pub const SO_SNDTIMEO: ::c_int = 21;
+pub const SOCK_STREAM: ::c_int = 1;
+pub const SOCK_DGRAM: ::c_int = 2;
+pub const SOL_SOCKET: ::c_int = 1;
+
+// sys/wait.h
+pub const WNOHANG: ::c_int = 1;
+
+// termios.h
+pub const NCCS: usize = 32;
+
+// time.h
+pub const CLOCK_REALTIME: ::c_int = 1;
+pub const CLOCK_MONOTONIC: ::c_int = 4;
+
+// unistd.h
+pub const _SC_PAGESIZE: ::c_int = 30;
+pub const SEEK_SET: ::c_int = 0;
+pub const SEEK_CUR: ::c_int = 1;
+pub const SEEK_END: ::c_int = 2;
+pub const STDIN_FILENO: ::c_int = 0;
+pub const STDOUT_FILENO: ::c_int = 1;
+pub const STDERR_FILENO: ::c_int = 2;
+
+// wait.h
+pub fn WIFSTOPPED(status: ::c_int) -> bool {
+ (status & 0xff) == 0x7f
+}
+
+pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
+ (status >> 8) & 0xff
+}
+
+pub fn WIFCONTINUED(status: ::c_int) -> bool {
+ status == 0xffff
+}
+
+pub fn WIFSIGNALED(status: ::c_int) -> bool {
+ ((status & 0x7f) + 1) as i8 >= 2
+}
+
+pub fn WTERMSIG(status: ::c_int) -> ::c_int {
+ status & 0x7f
+}
+
+pub fn WIFEXITED(status: ::c_int) -> bool {
+ (status & 0x7f) == 0
+}
+
+pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
+ (status >> 8) & 0xff
+}
+
+pub fn WCOREDUMP(status: ::c_int) -> bool {
+ (status & 0x80) != 0
+}
+
+// intentionally not public, only used for fd_set
+cfg_if! {
+ if #[cfg(target_pointer_width = "32")] {
+ const ULONG_SIZE: usize = 32;
+ } else if #[cfg(target_pointer_width = "64")] {
+ const ULONG_SIZE: usize = 64;
+ } else {
+ // Unknown target_pointer_width
+ }
+}
+
+extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
+ // malloc.h
+ pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
+
+ // pthread.h
+ pub fn pthread_atfork(prepare: ::Option<unsafe extern fn()>,
+ parent: ::Option<unsafe extern fn()>,
+ child: ::Option<unsafe extern fn()>) -> ::c_int;
+ pub fn pthread_create(tid: *mut ::pthread_t,
+ attr: *const ::pthread_attr_t,
+ start: extern fn(*mut ::c_void) -> *mut ::c_void,
+ arg: *mut ::c_void) -> ::c_int;
+ pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
+ clock_id: ::clockid_t) -> ::c_int;
+
+ // signal.h
+ pub fn pthread_sigmask(how: ::c_int,
+ set: *const ::sigset_t,
+ oldset: *mut ::sigset_t) -> ::c_int;
+
+ // sys/epoll.h
+ pub fn epoll_create(size: ::c_int) -> ::c_int;
+ pub fn epoll_create1(flags: ::c_int) -> ::c_int;
+ pub fn epoll_wait(epfd: ::c_int,
+ events: *mut ::epoll_event,
+ maxevents: ::c_int,
+ timeout: ::c_int) -> ::c_int;
+ pub fn epoll_ctl(epfd: ::c_int,
+ op: ::c_int,
+ fd: ::c_int,
+ event: *mut ::epoll_event) -> ::c_int;
+
+ // sys/ioctl.h
+ pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
+
+ // sys/socket.h
+ pub fn bind(socket: ::c_int, address: *const ::sockaddr,
+ address_len: ::socklen_t) -> ::c_int;
+ pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
+ flags: ::c_int, addr: *mut ::sockaddr,
+ addrlen: *mut ::socklen_t) -> ::ssize_t;
+
+ // sys/uio.h
+ pub fn readv(fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int) -> ::ssize_t;
+ pub fn writev(fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int) -> ::ssize_t;
+
+ // time.h
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
+ pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int;
+}
diff --git a/src/unix/solarish/mod.rs b/src/unix/solarish/mod.rs
index ab36e5730f..062b2837db 100644
--- a/src/unix/solarish/mod.rs
+++ b/src/unix/solarish/mod.rs
@@ -1786,6 +1786,9 @@ f! {
}
extern {
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn sem_destroy(sem: *mut sem_t) -> ::c_int;
pub fn sem_init(sem: *mut sem_t,
pshared: ::c_int,
@@ -1800,6 +1803,8 @@ extern {
pub fn rand() -> ::c_int;
pub fn srand(seed: ::c_uint);
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::c_void) -> ::c_int;
pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int;
pub fn freeifaddrs(ifa: *mut ::ifaddrs);
@@ -1937,7 +1942,7 @@ extern {
-> ::c_int;
#[cfg_attr(any(target_os = "solaris", target_os = "illumos"),
link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
diff --git a/src/unix/uclibc/align.rs b/src/unix/uclibc/align.rs
index bcae2e6b0b..3307c9d169 100644
--- a/src/unix/uclibc/align.rs
+++ b/src/unix/uclibc/align.rs
@@ -1,6 +1,37 @@
macro_rules! expand_align {
() => {
s! {
+ #[cfg_attr(any(target_pointer_width = "32",
+ target_arch = "x86_64",
+ target_arch = "powerpc64",
+ target_arch = "mips64",
+ target_arch = "s390x",
+ target_arch = "sparc64"),
+ repr(align(4)))]
+ #[cfg_attr(not(any(target_pointer_width = "32",
+ target_arch = "x86_64",
+ target_arch = "powerpc64",
+ target_arch = "mips64",
+ target_arch = "s390x",
+ target_arch = "sparc64")),
+ repr(align(8)))]
+ pub struct pthread_mutexattr_t {
+ size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T],
+ }
+
+ #[repr(align(4))]
+ pub struct pthread_condattr_t {
+ size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T],
+ }
+ }
+
+ s_no_extra_traits! {
+ #[repr(align(8))]
+ #[allow(missing_debug_implementations)]
+ pub struct pthread_cond_t {
+ size: [u8; ::__SIZEOF_PTHREAD_COND_T],
+ }
+
#[cfg_attr(all(target_pointer_width = "32",
any(target_arch = "mips",
target_arch = "arm",
@@ -11,6 +42,7 @@ macro_rules! expand_align {
target_arch = "arm",
target_arch = "powerpc"))),
repr(align(8)))]
+ #[allow(missing_debug_implementations)]
pub struct pthread_mutex_t {
size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T],
}
@@ -25,37 +57,10 @@ macro_rules! expand_align {
target_arch = "arm",
target_arch = "powerpc"))),
repr(align(8)))]
+ #[allow(missing_debug_implementations)]
pub struct pthread_rwlock_t {
size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T],
}
-
- #[cfg_attr(any(target_pointer_width = "32",
- target_arch = "x86_64",
- target_arch = "powerpc64",
- target_arch = "mips64",
- target_arch = "s390x",
- target_arch = "sparc64"),
- repr(align(4)))]
- #[cfg_attr(not(any(target_pointer_width = "32",
- target_arch = "x86_64",
- target_arch = "powerpc64",
- target_arch = "mips64",
- target_arch = "s390x",
- target_arch = "sparc64")),
- repr(align(8)))]
- pub struct pthread_mutexattr_t {
- size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T],
- }
-
- #[repr(align(8))]
- pub struct pthread_cond_t {
- size: [u8; ::__SIZEOF_PTHREAD_COND_T],
- }
-
- #[repr(align(4))]
- pub struct pthread_condattr_t {
- size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T],
- }
}
}
}
diff --git a/src/unix/uclibc/mips/mips32/mod.rs b/src/unix/uclibc/mips/mips32/mod.rs
index 23b3854244..410ab70c44 100644
--- a/src/unix/uclibc/mips/mips32/mod.rs
+++ b/src/unix/uclibc/mips/mips32/mod.rs
@@ -247,7 +247,6 @@ pub const SYS_mknod: ::c_long = 4000 + 14;
pub const SYS_chmod: ::c_long = 4000 + 15;
pub const SYS_lchown: ::c_long = 4000 + 16;
pub const SYS_break: ::c_long = 4000 + 17;
-pub const SYS_unused18: ::c_long = 4000 + 18;
pub const SYS_lseek: ::c_long = 4000 + 19;
pub const SYS_getpid: ::c_long = 4000 + 20;
pub const SYS_mount: ::c_long = 4000 + 21;
@@ -257,7 +256,6 @@ pub const SYS_getuid: ::c_long = 4000 + 24;
pub const SYS_stime: ::c_long = 4000 + 25;
pub const SYS_ptrace: ::c_long = 4000 + 26;
pub const SYS_alarm: ::c_long = 4000 + 27;
-pub const SYS_unused28: ::c_long = 4000 + 28;
pub const SYS_pause: ::c_long = 4000 + 29;
pub const SYS_utime: ::c_long = 4000 + 30;
pub const SYS_stty: ::c_long = 4000 + 31;
@@ -288,7 +286,6 @@ pub const SYS_fcntl: ::c_long = 4000 + 55;
pub const SYS_mpx: ::c_long = 4000 + 56;
pub const SYS_setpgid: ::c_long = 4000 + 57;
pub const SYS_ulimit: ::c_long = 4000 + 58;
-pub const SYS_unused59: ::c_long = 4000 + 59;
pub const SYS_umask: ::c_long = 4000 + 60;
pub const SYS_chroot: ::c_long = 4000 + 61;
pub const SYS_ustat: ::c_long = 4000 + 62;
@@ -311,9 +308,7 @@ pub const SYS_gettimeofday: ::c_long = 4000 + 78;
pub const SYS_settimeofday: ::c_long = 4000 + 79;
pub const SYS_getgroups: ::c_long = 4000 + 80;
pub const SYS_setgroups: ::c_long = 4000 + 81;
-pub const SYS_reserved82: ::c_long = 4000 + 82;
pub const SYS_symlink: ::c_long = 4000 + 83;
-pub const SYS_unused84: ::c_long = 4000 + 84;
pub const SYS_readlink: ::c_long = 4000 + 85;
pub const SYS_uselib: ::c_long = 4000 + 86;
pub const SYS_swapon: ::c_long = 4000 + 87;
@@ -338,7 +333,6 @@ pub const SYS_getitimer: ::c_long = 4000 + 105;
pub const SYS_stat: ::c_long = 4000 + 106;
pub const SYS_lstat: ::c_long = 4000 + 107;
pub const SYS_fstat: ::c_long = 4000 + 108;
-pub const SYS_unused109: ::c_long = 4000 + 109;
pub const SYS_iopl: ::c_long = 4000 + 110;
pub const SYS_vhangup: ::c_long = 4000 + 111;
pub const SYS_idle: ::c_long = 4000 + 112;
@@ -379,7 +373,6 @@ pub const SYS_writev: ::c_long = 4000 + 146;
pub const SYS_cacheflush: ::c_long = 4000 + 147;
pub const SYS_cachectl: ::c_long = 4000 + 148;
pub const SYS_sysmips: ::c_long = 4000 + 149;
-pub const SYS_unused150: ::c_long = 4000 + 150;
pub const SYS_getsid: ::c_long = 4000 + 151;
pub const SYS_fdatasync: ::c_long = 4000 + 152;
pub const SYS__sysctl: ::c_long = 4000 + 153;
@@ -450,7 +443,6 @@ pub const SYS_mincore: ::c_long = 4000 + 217;
pub const SYS_madvise: ::c_long = 4000 + 218;
pub const SYS_getdents64: ::c_long = 4000 + 219;
pub const SYS_fcntl64: ::c_long = 4000 + 220;
-pub const SYS_reserved221: ::c_long = 4000 + 221;
pub const SYS_gettid: ::c_long = 4000 + 222;
pub const SYS_readahead: ::c_long = 4000 + 223;
pub const SYS_setxattr: ::c_long = 4000 + 224;
diff --git a/src/unix/uclibc/mod.rs b/src/unix/uclibc/mod.rs
index d2735dba8d..9a430a9fa9 100644
--- a/src/unix/uclibc/mod.rs
+++ b/src/unix/uclibc/mod.rs
@@ -66,20 +66,6 @@ s! {
pub sin6_scope_id: u32,
}
- pub struct sockaddr_un {
- pub sun_family: sa_family_t,
- pub sun_path: [::c_char; 108]
- }
-
- pub struct sockaddr_storage {
- pub ss_family: sa_family_t,
- __ss_align: ::size_t,
- #[cfg(target_pointer_width = "32")]
- __ss_pad2: [u8; 128 - 2 * 4],
- #[cfg(target_pointer_width = "64")]
- __ss_pad2: [u8; 128 - 2 * 8],
- }
-
pub struct addrinfo {
pub ai_flags: ::c_int,
pub ai_family: ::c_int,
@@ -140,15 +126,6 @@ s! {
pub dli_saddr: *mut ::c_void,
}
- pub struct utsname {
- pub sysname: [::c_char; 65],
- pub nodename: [::c_char; 65],
- pub release: [::c_char; 65],
- pub version: [::c_char; 65],
- pub machine: [::c_char; 65],
- pub domainname: [::c_char; 65]
- }
-
pub struct lconv {
pub decimal_point: *mut ::c_char,
pub thousands_sep: *mut ::c_char,
@@ -189,22 +166,6 @@ s! {
__unused1: [::c_int; 12]
}
- pub struct dirent {
- pub d_ino: ::ino_t,
- pub d_off: ::off_t,
- pub d_reclen: ::c_ushort,
- pub d_type: ::c_uchar,
- pub d_name: [::c_char; 256],
- }
-
- pub struct dirent64 {
- pub d_ino: ::ino64_t,
- pub d_off: ::off64_t,
- pub d_reclen: ::c_ushort,
- pub d_type: ::c_uchar,
- pub d_name: [::c_char; 256],
- }
-
pub struct rlimit64 {
pub rlim_cur: rlim64_t,
pub rlim_max: rlim64_t,
@@ -358,10 +319,55 @@ s_no_extra_traits! {
any(target_arch = "x86", target_arch = "x86_64"),
repr(packed)
)]
+ #[allow(missing_debug_implementations)]
pub struct epoll_event {
pub events: ::uint32_t,
pub u64: ::uint64_t,
}
+
+ #[allow(missing_debug_implementations)]
+ pub struct sockaddr_un {
+ pub sun_family: sa_family_t,
+ pub sun_path: [::c_char; 108]
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct sockaddr_storage {
+ pub ss_family: sa_family_t,
+ __ss_align: ::size_t,
+ #[cfg(target_pointer_width = "32")]
+ __ss_pad2: [u8; 128 - 2 * 4],
+ #[cfg(target_pointer_width = "64")]
+ __ss_pad2: [u8; 128 - 2 * 8],
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct utsname {
+ pub sysname: [::c_char; 65],
+ pub nodename: [::c_char; 65],
+ pub release: [::c_char; 65],
+ pub version: [::c_char; 65],
+ pub machine: [::c_char; 65],
+ pub domainname: [::c_char; 65]
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct dirent {
+ pub d_ino: ::ino_t,
+ pub d_off: ::off_t,
+ pub d_reclen: ::c_ushort,
+ pub d_type: ::c_uchar,
+ pub d_name: [::c_char; 256],
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct dirent64 {
+ pub d_ino: ::ino64_t,
+ pub d_off: ::off64_t,
+ pub d_reclen: ::c_ushort,
+ pub d_type: ::c_uchar,
+ pub d_name: [::c_char; 256],
+ }
}
// intentionally not public, only used for fd_set
@@ -1481,6 +1487,11 @@ f! {
}
extern {
+ #[cfg_attr(target_os = "linux",
+ link_name = "__xpg_strerror_r")]
+ pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
+ buflen: ::size_t) -> ::c_int;
+
pub fn sem_destroy(sem: *mut sem_t) -> ::c_int;
pub fn sem_init(sem: *mut sem_t,
pshared: ::c_int,
@@ -1494,6 +1505,8 @@ extern {
pub fn srand(seed: ::c_uint);
pub fn fdatasync(fd: ::c_int) -> ::c_int;
+ pub fn gettimeofday(tp: *mut ::timeval,
+ tz: *mut ::timezone) -> ::c_int;
pub fn mincore(addr: *mut ::c_void, len: ::size_t,
vec: *mut ::c_uchar) -> ::c_int;
pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int;
@@ -1831,7 +1844,7 @@ extern {
pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-> ::ssize_t;
#[cfg_attr(target_os = "solaris", link_name = "__posix_getgrgid_r")]
- pub fn getgrgid_r(uid: ::uid_t,
+ pub fn getgrgid_r(gid: ::gid_t,
grp: *mut ::group,
buf: *mut ::c_char,
buflen: ::size_t,
diff --git a/src/unix/uclibc/x86_64/align.rs b/src/unix/uclibc/x86_64/align.rs
index 5a97c19fb9..8d4bbd59b0 100644
--- a/src/unix/uclibc/x86_64/align.rs
+++ b/src/unix/uclibc/x86_64/align.rs
@@ -12,20 +12,6 @@ macro_rules! expand_align {
__size: [::c_char; 32],
}
- #[cfg_attr(all(target_pointer_width = "32",
- any(target_arch = "mips",
- target_arch = "arm",
- target_arch = "powerpc")),
- repr(align(4)))]
- #[cfg_attr(all(any(target_pointer_width = "64",
- not(any(target_arch = "mips",
- target_arch = "arm",
- target_arch = "powerpc")))),
- repr(align(8)))]
- pub struct pthread_mutex_t { // ToDo
- size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T],
- }
-
#[cfg_attr(any(target_pointer_width = "32",
target_arch = "x86_64",
target_arch = "powerpc64",
@@ -44,15 +30,33 @@ macro_rules! expand_align {
size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T],
}
- #[repr(align(8))]
- pub struct pthread_cond_t { // ToDo
- size: [u8; ::__SIZEOF_PTHREAD_COND_T],
- }
-
#[repr(align(4))]
pub struct pthread_condattr_t { // ToDo
size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T],
}
+ }
+
+ s_no_extra_traits! {
+ #[cfg_attr(all(target_pointer_width = "32",
+ any(target_arch = "mips",
+ target_arch = "arm",
+ target_arch = "powerpc")),
+ repr(align(4)))]
+ #[cfg_attr(all(any(target_pointer_width = "64",
+ not(any(target_arch = "mips",
+ target_arch = "arm",
+ target_arch = "powerpc")))),
+ repr(align(8)))]
+ #[allow(missing_debug_implementations)]
+ pub struct pthread_mutex_t { // ToDo
+ size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T],
+ }
+
+ #[repr(align(8))]
+ #[allow(missing_debug_implementations)]
+ pub struct pthread_cond_t { // ToDo
+ size: [u8; ::__SIZEOF_PTHREAD_COND_T],
+ }
#[cfg_attr(all(target_pointer_width = "32",
any(target_arch = "mips",
@@ -64,6 +68,7 @@ macro_rules! expand_align {
target_arch = "arm",
target_arch = "powerpc"))),
repr(align(8)))]
+ #[allow(missing_debug_implementations)]
pub struct pthread_rwlock_t { // ToDo
size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T],
}
diff --git a/src/unix/uclibc/x86_64/l4re.rs b/src/unix/uclibc/x86_64/l4re.rs
index 4f5811d17d..16ec0ef966 100644
--- a/src/unix/uclibc/x86_64/l4re.rs
+++ b/src/unix/uclibc/x86_64/l4re.rs
@@ -27,6 +27,7 @@ s! {
}
#[cfg(target_os = "l4re")]
+#[allow(missing_debug_implementations)]
pub struct pthread_attr_t {
pub __detachstate: ::c_int,
pub __schedpolicy: ::c_int,
diff --git a/src/unix/uclibc/x86_64/mod.rs b/src/unix/uclibc/x86_64/mod.rs
index 0afa7dc77b..a8bb0794aa 100644
--- a/src/unix/uclibc/x86_64/mod.rs
+++ b/src/unix/uclibc/x86_64/mod.rs
@@ -20,22 +20,6 @@ pub type time_t = ::c_int;
pub type wchar_t = ::c_int;
s! {
- pub struct dirent {
- pub d_ino: ::ino64_t,
- pub d_off: ::off64_t,
- pub d_reclen: u16,
- pub d_type: u8,
- pub d_name: [::c_char; 256],
- }
-
- pub struct dirent64 {
- pub d_ino: ::ino64_t,
- pub d_off: ::off64_t,
- pub d_reclen: u16,
- pub d_type: u8,
- pub d_name: [::c_char; 256],
- }
-
pub struct ipc_perm {
pub __key: ::key_t,
pub uid: ::uid_t,
@@ -252,6 +236,25 @@ s! {
}
}
+s_no_extra_traits! {
+ #[allow(missing_debug_implementations)]
+ pub struct dirent {
+ pub d_ino: ::ino64_t,
+ pub d_off: ::off64_t,
+ pub d_reclen: u16,
+ pub d_type: u8,
+ pub d_name: [::c_char; 256],
+ }
+ #[allow(missing_debug_implementations)]
+ pub struct dirent64 {
+ pub d_ino: ::ino64_t,
+ pub d_off: ::off64_t,
+ pub d_reclen: u16,
+ pub d_type: u8,
+ pub d_name: [::c_char; 256],
+ }
+}
+
// constants
pub const EADDRINUSE: ::c_int = 98; // Address already in use
pub const EADDRNOTAVAIL: ::c_int = 99; // Cannot assign requested address
diff --git a/src/wasi.rs b/src/wasi.rs
new file mode 100644
index 0000000000..b93486129f
--- /dev/null
+++ b/src/wasi.rs
@@ -0,0 +1,1336 @@
+pub use ffi::c_void;
+
+pub type c_char = i8;
+pub type c_uchar = u8;
+pub type c_int = i32;
+pub type c_uint = u32;
+pub type c_short = i16;
+pub type c_ushort = u16;
+pub type c_long = i32;
+pub type c_ulong = u32;
+pub type c_longlong = i64;
+pub type c_ulonglong = u64;
+pub type intmax_t = i64;
+pub type uintmax_t = u64;
+pub type size_t = usize;
+pub type ssize_t = isize;
+pub type ptrdiff_t = isize;
+pub type intptr_t = isize;
+pub type uintptr_t = usize;
+pub type off_t = i64;
+pub type pid_t = i32;
+pub type int8_t = i8;
+pub type uint8_t = u8;
+pub type int16_t = i16;
+pub type uint16_t = u16;
+pub type int32_t = i32;
+pub type uint32_t = u32;
+pub type int64_t = i64;
+pub type uint64_t = u64;
+pub type clock_t = c_longlong;
+pub type time_t = c_longlong;
+pub type c_double = f64;
+pub type c_float = f32;
+pub type ino_t = u64;
+pub type sigset_t = c_uchar;
+pub type suseconds_t = c_longlong;
+pub type mode_t = u32;
+pub type dev_t = u64;
+pub type uid_t = u32;
+pub type gid_t = u32;
+pub type nlink_t = u64;
+pub type blksize_t = c_long;
+pub type blkcnt_t = i64;
+pub type nfds_t = c_ulong;
+
+pub type __wasi_advice_t = u8;
+pub type __wasi_clockid_t = u32;
+pub type __wasi_device_t = u64;
+pub type __wasi_dircookie_t = u64;
+pub type __wasi_errno_t = u16;
+pub type __wasi_eventrwflags_t = u16;
+pub type __wasi_eventtype_t = u8;
+pub type __wasi_exitcode_t = u32;
+pub type __wasi_fd_t = u32;
+pub type __wasi_fdflags_t = u16;
+pub type __wasi_filedelta_t = i64;
+pub type __wasi_filesize_t = u64;
+pub type __wasi_filetype_t = u8;
+pub type __wasi_fstflags_t = u16;
+pub type __wasi_inode_t = u64;
+pub type __wasi_linkcount_t = u32;
+pub type __wasi_lookupflags_t = u32;
+pub type __wasi_oflags_t = u16;
+pub type __wasi_riflags_t = u16;
+pub type __wasi_rights_t = u64;
+pub type __wasi_roflags_t = u16;
+pub type __wasi_sdflags_t = u8;
+pub type __wasi_siflags_t = u16;
+pub type __wasi_signal_t = u8;
+pub type __wasi_subclockflags_t = u16;
+pub type __wasi_timestamp_t = u64;
+pub type __wasi_userdata_t = u64;
+pub type __wasi_whence_t = u8;
+pub type __wasi_preopentype_t = u8;
+
+#[allow(missing_copy_implementations)]
+#[cfg_attr(feature = "extra_traits", derive(Debug))]
+pub enum FILE {}
+#[allow(missing_copy_implementations)]
+#[cfg_attr(feature = "extra_traits", derive(Debug))]
+pub enum DIR {}
+#[allow(missing_copy_implementations)]
+#[cfg_attr(feature = "extra_traits", derive(Debug))]
+pub enum __locale_struct {}
+
+pub type locale_t = *mut __locale_struct;
+
+s! {
+ #[repr(align(8))]
+ pub struct fpos_t {
+ data: [u8; 16],
+ }
+
+ pub struct tm {
+ pub tm_sec: c_int,
+ pub tm_min: c_int,
+ pub tm_hour: c_int,
+ pub tm_mday: c_int,
+ pub tm_mon: c_int,
+ pub tm_year: c_int,
+ pub tm_wday: c_int,
+ pub tm_yday: c_int,
+ pub tm_isdst: c_int,
+ pub __tm_gmtoff: c_int,
+ pub __tm_zone: *const c_char,
+ pub __tm_nsec: c_int,
+ }
+
+ pub struct timeval {
+ pub tv_sec: time_t,
+ pub tv_usec: suseconds_t,
+ }
+
+ pub struct timespec {
+ pub tv_sec: time_t,
+ pub tv_nsec: c_long,
+ }
+
+ pub struct tms {
+ pub tms_utime: clock_t,
+ pub tms_stime: clock_t,
+ pub tms_cutime: clock_t,
+ pub tms_cstime: clock_t,
+ }
+
+ pub struct itimerspec {
+ pub it_interval: timespec,
+ pub it_value: timespec,
+ }
+
+ pub struct iovec {
+ pub iov_base: *mut c_void,
+ pub iov_len: size_t,
+ }
+
+ pub struct lconv {
+ pub decimal_point: *mut c_char,
+ pub thousands_sep: *mut c_char,
+ pub grouping: *mut c_char,
+ pub int_curr_symbol: *mut c_char,
+ pub currency_symbol: *mut c_char,
+ pub mon_decimal_point: *mut c_char,
+ pub mon_thousands_sep: *mut c_char,
+ pub mon_grouping: *mut c_char,
+ pub positive_sign: *mut c_char,
+ pub negative_sign: *mut c_char,
+ pub int_frac_digits: c_char,
+ pub frac_digits: c_char,
+ pub p_cs_precedes: c_char,
+ pub p_sep_by_space: c_char,
+ pub n_cs_precedes: c_char,
+ pub n_sep_by_space: c_char,
+ pub p_sign_posn: c_char,
+ pub n_sign_posn: c_char,
+ pub int_p_cs_precedes: c_char,
+ pub int_p_sep_by_space: c_char,
+ pub int_n_cs_precedes: c_char,
+ pub int_n_sep_by_space: c_char,
+ pub int_p_sign_posn: c_char,
+ pub int_n_sign_posn: c_char,
+ }
+
+ pub struct pollfd {
+ pub fd: c_int,
+ pub events: c_short,
+ pub revents: c_short,
+ }
+
+ pub struct rusage {
+ pub ru_utime: timeval,
+ pub ru_stime: timeval,
+ }
+
+ pub struct stat {
+ pub st_dev: dev_t,
+ pub st_ino: ino_t,
+ pub st_nlink: nlink_t,
+ pub st_mode: mode_t,
+ pub st_uid: uid_t,
+ pub st_gid: gid_t,
+ __pad0: c_uint,
+ pub st_rdev: dev_t,
+ pub st_size: off_t,
+ pub st_blksize: blksize_t,
+ pub st_blocks: blkcnt_t,
+ pub st_atim: timespec,
+ pub st_mtim: timespec,
+ pub st_ctim: timespec,
+ __reserved: [c_longlong; 3],
+ }
+
+ pub struct __wasi_dirent_t {
+ pub d_next: __wasi_dircookie_t,
+ pub d_ino: __wasi_inode_t,
+ pub d_namlen: u32,
+ pub d_type: __wasi_filetype_t,
+ }
+
+ pub struct __wasi_event_u_fd_readwrite_t {
+ pub nbytes: __wasi_filesize_t,
+ pub flags: __wasi_eventrwflags_t,
+ }
+
+ pub struct __wasi_fdstat_t {
+ pub fs_filetype: __wasi_filetype_t,
+ pub fs_flags: __wasi_fdflags_t,
+ pub fs_rights_base: __wasi_rights_t,
+ pub fs_rights_inheriting: __wasi_rights_t,
+ }
+
+ pub struct __wasi_filestat_t {
+ pub st_dev: __wasi_device_t,
+ pub st_ino: __wasi_inode_t,
+ pub st_filetype: __wasi_filetype_t,
+ pub st_nlink: __wasi_linkcount_t,
+ pub st_size: __wasi_filesize_t,
+ pub st_atim: __wasi_timestamp_t,
+ pub st_mtim: __wasi_timestamp_t,
+ pub st_ctim: __wasi_timestamp_t,
+ }
+
+ pub struct __wasi_ciovec_t {
+ pub buf: *const ::c_void,
+ pub buf_len: size_t,
+ }
+
+ pub struct __wasi_iovec_t {
+ pub buf: *mut ::c_void,
+ pub buf_len: size_t,
+ }
+
+ pub struct __wasi_subscription_u_clock_t {
+ pub identifier: __wasi_userdata_t,
+ pub clock_id: __wasi_clockid_t,
+ pub timeout: __wasi_timestamp_t,
+ pub precision: __wasi_timestamp_t,
+ pub flags: __wasi_subclockflags_t,
+ }
+
+ pub struct __wasi_subscription_u_fd_readwrite_t {
+ pub fd: __wasi_fd_t,
+ }
+
+ pub struct __wasi_prestat_u_dir_t {
+ pub pr_name_len: size_t,
+ }
+}
+
+s_no_extra_traits! {
+ #[allow(missing_debug_implementations)]
+ pub struct __wasi_subscription_t {
+ pub userdata: __wasi_userdata_t,
+ pub type_: __wasi_eventtype_t,
+ pub u: __wasi_subscription_u,
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct __wasi_event_t {
+ pub userdata: __wasi_userdata_t,
+ pub error: __wasi_errno_t,
+ pub type_: __wasi_eventtype_t,
+ pub u: __wasi_event_u,
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub union __wasi_event_u {
+ pub fd_readwrite: __wasi_event_u_fd_readwrite_t,
+ _bindgen_union_align: [u64; 2],
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub union __wasi_subscription_u {
+ pub clock: __wasi_subscription_u_clock_t,
+ pub fd_readwrite:
+ __wasi_subscription_u_fd_readwrite_t,
+ _bindgen_union_align: [u64; 5],
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub struct __wasi_prestat_t {
+ pub pr_type: __wasi_preopentype_t,
+ pub u: __wasi_prestat_u,
+ }
+
+ #[allow(missing_debug_implementations)]
+ pub union __wasi_prestat_u {
+ pub dir: __wasi_prestat_u_dir_t,
+ }
+
+}
+
+// Declare dirent outside of s! so that it doesn't implement Copy, Eq, Hash,
+// etc., since it contains a flexible array member with a dynamic size.
+#[repr(C)]
+#[allow(missing_copy_implementations)]
+#[cfg_attr(feature = "extra_traits", derive(Debug))]
+pub struct dirent {
+ pub d_ino: ino_t,
+ pub d_type: c_uchar,
+ /// d_name is declared in WASI libc as a flexible array member, which
+ /// can't be directly expressed in Rust. As an imperfect workaround,
+ /// declare it as a zero-length array instead.
+ pub d_name: [c_char; 0],
+}
+
+pub const EXIT_SUCCESS: c_int = 0;
+pub const EXIT_FAILURE: c_int = 1;
+pub const STDIN_FILENO: c_int = 0;
+pub const STDOUT_FILENO: c_int = 1;
+pub const STDERR_FILENO: c_int = 2;
+pub const SEEK_SET: c_int = 2;
+pub const SEEK_CUR: c_int = 0;
+pub const SEEK_END: c_int = 1;
+pub const _IOFBF: c_int = 0;
+pub const _IONBF: c_int = 2;
+pub const _IOLBF: c_int = 1;
+pub const FD_SETSIZE: size_t = 1024;
+pub const O_APPEND: c_int = __WASI_FDFLAG_APPEND as c_int;
+pub const O_DSYNC: c_int = __WASI_FDFLAG_DSYNC as c_int;
+pub const O_NONBLOCK: c_int = __WASI_FDFLAG_NONBLOCK as c_int;
+pub const O_RSYNC: c_int = __WASI_FDFLAG_RSYNC as c_int;
+pub const O_SYNC: c_int = __WASI_FDFLAG_SYNC as c_int;
+pub const O_CREAT: c_int = (__WASI_O_CREAT as c_int) << 12;
+pub const O_DIRECTORY: c_int = (__WASI_O_DIRECTORY as c_int) << 12;
+pub const O_EXCL: c_int = (__WASI_O_EXCL as c_int) << 12;
+pub const O_TRUNC: c_int = (__WASI_O_TRUNC as c_int) << 12;
+pub const O_NOFOLLOW: c_int = 0x01000000;
+pub const O_EXEC: c_int = 0x02000000;
+pub const O_RDONLY: c_int = 0x04000000;
+pub const O_SEARCH: c_int = 0x08000000;
+pub const O_WRONLY: c_int = 0x10000000;
+pub const O_RDWR: c_int = O_WRONLY | O_RDONLY;
+pub const O_ACCMODE: c_int = O_EXEC | O_RDWR | O_SEARCH;
+pub const POSIX_FADV_DONTNEED: c_int = __WASI_ADVICE_DONTNEED as c_int;
+pub const POSIX_FADV_NOREUSE: c_int = __WASI_ADVICE_NOREUSE as c_int;
+pub const POSIX_FADV_NORMAL: c_int = __WASI_ADVICE_NORMAL as c_int;
+pub const POSIX_FADV_RANDOM: c_int = __WASI_ADVICE_RANDOM as c_int;
+pub const POSIX_FADV_SEQUENTIAL: c_int = __WASI_ADVICE_SEQUENTIAL as c_int;
+pub const POSIX_FADV_WILLNEED: c_int = __WASI_ADVICE_WILLNEED as c_int;
+pub const AT_EACCESS: c_int = 0x0;
+pub const AT_SYMLINK_NOFOLLOW: c_int = 0x1;
+pub const AT_SYMLINK_FOLLOW: c_int = 0x2;
+pub const AT_REMOVEDIR: c_int = 0x4;
+
+pub const E2BIG: c_int = __WASI_E2BIG as c_int;
+pub const EACCES: c_int = __WASI_EACCES as c_int;
+pub const EADDRINUSE: c_int = __WASI_EADDRINUSE as c_int;
+pub const EADDRNOTAVAIL: c_int = __WASI_EADDRNOTAVAIL as c_int;
+pub const EAFNOSUPPORT: c_int = __WASI_EAFNOSUPPORT as c_int;
+pub const EAGAIN: c_int = __WASI_EAGAIN as c_int;
+pub const EALREADY: c_int = __WASI_EALREADY as c_int;
+pub const EBADF: c_int = __WASI_EBADF as c_int;
+pub const EBADMSG: c_int = __WASI_EBADMSG as c_int;
+pub const EBUSY: c_int = __WASI_EBUSY as c_int;
+pub const ECANCELED: c_int = __WASI_ECANCELED as c_int;
+pub const ECHILD: c_int = __WASI_ECHILD as c_int;
+pub const ECONNABORTED: c_int = __WASI_ECONNABORTED as c_int;
+pub const ECONNREFUSED: c_int = __WASI_ECONNREFUSED as c_int;
+pub const ECONNRESET: c_int = __WASI_ECONNRESET as c_int;
+pub const EDEADLK: c_int = __WASI_EDEADLK as c_int;
+pub const EDESTADDRREQ: c_int = __WASI_EDESTADDRREQ as c_int;
+pub const EDOM: c_int = __WASI_EDOM as c_int;
+pub const EDQUOT: c_int = __WASI_EDQUOT as c_int;
+pub const EEXIST: c_int = __WASI_EEXIST as c_int;
+pub const EFAULT: c_int = __WASI_EFAULT as c_int;
+pub const EFBIG: c_int = __WASI_EFBIG as c_int;
+pub const EHOSTUNREACH: c_int = __WASI_EHOSTUNREACH as c_int;
+pub const EIDRM: c_int = __WASI_EIDRM as c_int;
+pub const EILSEQ: c_int = __WASI_EILSEQ as c_int;
+pub const EINPROGRESS: c_int = __WASI_EINPROGRESS as c_int;
+pub const EINTR: c_int = __WASI_EINTR as c_int;
+pub const EINVAL: c_int = __WASI_EINVAL as c_int;
+pub const EIO: c_int = __WASI_EIO as c_int;
+pub const EISCONN: c_int = __WASI_EISCONN as c_int;
+pub const EISDIR: c_int = __WASI_EISDIR as c_int;
+pub const ELOOP: c_int = __WASI_ELOOP as c_int;
+pub const EMFILE: c_int = __WASI_EMFILE as c_int;
+pub const EMLINK: c_int = __WASI_EMLINK as c_int;
+pub const EMSGSIZE: c_int = __WASI_EMSGSIZE as c_int;
+pub const EMULTIHOP: c_int = __WASI_EMULTIHOP as c_int;
+pub const ENAMETOOLONG: c_int = __WASI_ENAMETOOLONG as c_int;
+pub const ENETDOWN: c_int = __WASI_ENETDOWN as c_int;
+pub const ENETRESET: c_int = __WASI_ENETRESET as c_int;
+pub const ENETUNREACH: c_int = __WASI_ENETUNREACH as c_int;
+pub const ENFILE: c_int = __WASI_ENFILE as c_int;
+pub const ENOBUFS: c_int = __WASI_ENOBUFS as c_int;
+pub const ENODEV: c_int = __WASI_ENODEV as c_int;
+pub const ENOENT: c_int = __WASI_ENOENT as c_int;
+pub const ENOEXEC: c_int = __WASI_ENOEXEC as c_int;
+pub const ENOLCK: c_int = __WASI_ENOLCK as c_int;
+pub const ENOLINK: c_int = __WASI_ENOLINK as c_int;
+pub const ENOMEM: c_int = __WASI_ENOMEM as c_int;
+pub const ENOMSG: c_int = __WASI_ENOMSG as c_int;
+pub const ENOPROTOOPT: c_int = __WASI_ENOPROTOOPT as c_int;
+pub const ENOSPC: c_int = __WASI_ENOSPC as c_int;
+pub const ENOSYS: c_int = __WASI_ENOSYS as c_int;
+pub const ENOTCONN: c_int = __WASI_ENOTCONN as c_int;
+pub const ENOTDIR: c_int = __WASI_ENOTDIR as c_int;
+pub const ENOTEMPTY: c_int = __WASI_ENOTEMPTY as c_int;
+pub const ENOTRECOVERABLE: c_int = __WASI_ENOTRECOVERABLE as c_int;
+pub const ENOTSOCK: c_int = __WASI_ENOTSOCK as c_int;
+pub const ENOTSUP: c_int = __WASI_ENOTSUP as c_int;
+pub const ENOTTY: c_int = __WASI_ENOTTY as c_int;
+pub const ENXIO: c_int = __WASI_ENXIO as c_int;
+pub const EOVERFLOW: c_int = __WASI_EOVERFLOW as c_int;
+pub const EOWNERDEAD: c_int = __WASI_EOWNERDEAD as c_int;
+pub const EPERM: c_int = __WASI_EPERM as c_int;
+pub const EPIPE: c_int = __WASI_EPIPE as c_int;
+pub const EPROTO: c_int = __WASI_EPROTO as c_int;
+pub const EPROTONOSUPPORT: c_int = __WASI_EPROTONOSUPPORT as c_int;
+pub const EPROTOTYPE: c_int = __WASI_EPROTOTYPE as c_int;
+pub const ERANGE: c_int = __WASI_ERANGE as c_int;
+pub const EROFS: c_int = __WASI_EROFS as c_int;
+pub const ESPIPE: c_int = __WASI_ESPIPE as c_int;
+pub const ESRCH: c_int = __WASI_ESRCH as c_int;
+pub const ESTALE: c_int = __WASI_ESTALE as c_int;
+pub const ETIMEDOUT: c_int = __WASI_ETIMEDOUT as c_int;
+pub const ETXTBSY: c_int = __WASI_ETXTBSY as c_int;
+pub const EXDEV: c_int = __WASI_EXDEV as c_int;
+pub const ENOTCAPABLE: c_int = __WASI_ENOTCAPABLE as c_int;
+pub const EOPNOTSUPP: c_int = ENOTSUP;
+pub const EWOULDBLOCK: c_int = EAGAIN;
+
+pub const __WASI_ADVICE_NORMAL: u8 = 0;
+pub const __WASI_ADVICE_SEQUENTIAL: u8 = 1;
+pub const __WASI_ADVICE_RANDOM: u8 = 2;
+pub const __WASI_ADVICE_WILLNEED: u8 = 3;
+pub const __WASI_ADVICE_DONTNEED: u8 = 4;
+pub const __WASI_ADVICE_NOREUSE: u8 = 5;
+pub const __WASI_CLOCK_REALTIME: u32 = 0;
+pub const __WASI_CLOCK_MONOTONIC: u32 = 1;
+pub const __WASI_CLOCK_PROCESS_CPUTIME_ID: u32 = 2;
+pub const __WASI_CLOCK_THREAD_CPUTIME_ID: u32 = 3;
+pub const __WASI_DIRCOOKIE_START: u64 = 0;
+pub const __WASI_ESUCCESS: u16 = 0;
+pub const __WASI_E2BIG: u16 = 1;
+pub const __WASI_EACCES: u16 = 2;
+pub const __WASI_EADDRINUSE: u16 = 3;
+pub const __WASI_EADDRNOTAVAIL: u16 = 4;
+pub const __WASI_EAFNOSUPPORT: u16 = 5;
+pub const __WASI_EAGAIN: u16 = 6;
+pub const __WASI_EALREADY: u16 = 7;
+pub const __WASI_EBADF: u16 = 8;
+pub const __WASI_EBADMSG: u16 = 9;
+pub const __WASI_EBUSY: u16 = 10;
+pub const __WASI_ECANCELED: u16 = 11;
+pub const __WASI_ECHILD: u16 = 12;
+pub const __WASI_ECONNABORTED: u16 = 13;
+pub const __WASI_ECONNREFUSED: u16 = 14;
+pub const __WASI_ECONNRESET: u16 = 15;
+pub const __WASI_EDEADLK: u16 = 16;
+pub const __WASI_EDESTADDRREQ: u16 = 17;
+pub const __WASI_EDOM: u16 = 18;
+pub const __WASI_EDQUOT: u16 = 19;
+pub const __WASI_EEXIST: u16 = 20;
+pub const __WASI_EFAULT: u16 = 21;
+pub const __WASI_EFBIG: u16 = 22;
+pub const __WASI_EHOSTUNREACH: u16 = 23;
+pub const __WASI_EIDRM: u16 = 24;
+pub const __WASI_EILSEQ: u16 = 25;
+pub const __WASI_EINPROGRESS: u16 = 26;
+pub const __WASI_EINTR: u16 = 27;
+pub const __WASI_EINVAL: u16 = 28;
+pub const __WASI_EIO: u16 = 29;
+pub const __WASI_EISCONN: u16 = 30;
+pub const __WASI_EISDIR: u16 = 31;
+pub const __WASI_ELOOP: u16 = 32;
+pub const __WASI_EMFILE: u16 = 33;
+pub const __WASI_EMLINK: u16 = 34;
+pub const __WASI_EMSGSIZE: u16 = 35;
+pub const __WASI_EMULTIHOP: u16 = 36;
+pub const __WASI_ENAMETOOLONG: u16 = 37;
+pub const __WASI_ENETDOWN: u16 = 38;
+pub const __WASI_ENETRESET: u16 = 39;
+pub const __WASI_ENETUNREACH: u16 = 40;
+pub const __WASI_ENFILE: u16 = 41;
+pub const __WASI_ENOBUFS: u16 = 42;
+pub const __WASI_ENODEV: u16 = 43;
+pub const __WASI_ENOENT: u16 = 44;
+pub const __WASI_ENOEXEC: u16 = 45;
+pub const __WASI_ENOLCK: u16 = 46;
+pub const __WASI_ENOLINK: u16 = 47;
+pub const __WASI_ENOMEM: u16 = 48;
+pub const __WASI_ENOMSG: u16 = 49;
+pub const __WASI_ENOPROTOOPT: u16 = 50;
+pub const __WASI_ENOSPC: u16 = 51;
+pub const __WASI_ENOSYS: u16 = 52;
+pub const __WASI_ENOTCONN: u16 = 53;
+pub const __WASI_ENOTDIR: u16 = 54;
+pub const __WASI_ENOTEMPTY: u16 = 55;
+pub const __WASI_ENOTRECOVERABLE: u16 = 56;
+pub const __WASI_ENOTSOCK: u16 = 57;
+pub const __WASI_ENOTSUP: u16 = 58;
+pub const __WASI_ENOTTY: u16 = 59;
+pub const __WASI_ENXIO: u16 = 60;
+pub const __WASI_EOVERFLOW: u16 = 61;
+pub const __WASI_EOWNERDEAD: u16 = 62;
+pub const __WASI_EPERM: u16 = 63;
+pub const __WASI_EPIPE: u16 = 64;
+pub const __WASI_EPROTO: u16 = 65;
+pub const __WASI_EPROTONOSUPPORT: u16 = 66;
+pub const __WASI_EPROTOTYPE: u16 = 67;
+pub const __WASI_ERANGE: u16 = 68;
+pub const __WASI_EROFS: u16 = 69;
+pub const __WASI_ESPIPE: u16 = 70;
+pub const __WASI_ESRCH: u16 = 71;
+pub const __WASI_ESTALE: u16 = 72;
+pub const __WASI_ETIMEDOUT: u16 = 73;
+pub const __WASI_ETXTBSY: u16 = 74;
+pub const __WASI_EXDEV: u16 = 75;
+pub const __WASI_ENOTCAPABLE: u16 = 76;
+pub const __WASI_EVENT_FD_READWRITE_HANGUP: u16 = 0x0001;
+pub const __WASI_EVENTTYPE_CLOCK: u8 = 0;
+pub const __WASI_EVENTTYPE_FD_READ: u8 = 1;
+pub const __WASI_EVENTTYPE_FD_WRITE: u8 = 2;
+pub const __WASI_FDFLAG_APPEND: u16 = 0x0001;
+pub const __WASI_FDFLAG_DSYNC: u16 = 0x0002;
+pub const __WASI_FDFLAG_NONBLOCK: u16 = 0x0004;
+pub const __WASI_FDFLAG_RSYNC: u16 = 0x0008;
+pub const __WASI_FDFLAG_SYNC: u16 = 0x0010;
+pub const __WASI_FILETYPE_UNKNOWN: u8 = 0;
+pub const __WASI_FILETYPE_BLOCK_DEVICE: u8 = 1;
+pub const __WASI_FILETYPE_CHARACTER_DEVICE: u8 = 2;
+pub const __WASI_FILETYPE_DIRECTORY: u8 = 3;
+pub const __WASI_FILETYPE_REGULAR_FILE: u8 = 4;
+pub const __WASI_FILETYPE_SOCKET_DGRAM: u8 = 5;
+pub const __WASI_FILETYPE_SOCKET_STREAM: u8 = 6;
+pub const __WASI_FILETYPE_SYMBOLIC_LINK: u8 = 7;
+pub const __WASI_FILESTAT_SET_ATIM: u16 = 0x0001;
+pub const __WASI_FILESTAT_SET_ATIM_NOW: u16 = 0x0002;
+pub const __WASI_FILESTAT_SET_MTIM: u16 = 0x0004;
+pub const __WASI_FILESTAT_SET_MTIM_NOW: u16 = 0x0008;
+pub const __WASI_LOOKUP_SYMLINK_FOLLOW: u32 = 0x00000001;
+pub const __WASI_O_CREAT: u16 = 0x0001;
+pub const __WASI_O_DIRECTORY: u16 = 0x0002;
+pub const __WASI_O_EXCL: u16 = 0x0004;
+pub const __WASI_O_TRUNC: u16 = 0x0008;
+pub const __WASI_PREOPENTYPE_DIR: u8 = 0;
+pub const __WASI_SOCK_RECV_PEEK: u16 = 0x0001;
+pub const __WASI_SOCK_RECV_WAITALL: u16 = 0x0002;
+pub const __WASI_RIGHT_FD_DATASYNC: u64 = 0x0000000000000001;
+pub const __WASI_RIGHT_FD_READ: u64 = 0x0000000000000002;
+pub const __WASI_RIGHT_FD_SEEK: u64 = 0x0000000000000004;
+pub const __WASI_RIGHT_FD_FDSTAT_SET_FLAGS: u64 = 0x0000000000000008;
+pub const __WASI_RIGHT_FD_SYNC: u64 = 0x0000000000000010;
+pub const __WASI_RIGHT_FD_TELL: u64 = 0x0000000000000020;
+pub const __WASI_RIGHT_FD_WRITE: u64 = 0x0000000000000040;
+pub const __WASI_RIGHT_FD_ADVISE: u64 = 0x0000000000000080;
+pub const __WASI_RIGHT_FD_ALLOCATE: u64 = 0x0000000000000100;
+pub const __WASI_RIGHT_PATH_CREATE_DIRECTORY: u64 = 0x0000000000000200;
+pub const __WASI_RIGHT_PATH_CREATE_FILE: u64 = 0x0000000000000400;
+pub const __WASI_RIGHT_PATH_LINK_SOURCE: u64 = 0x0000000000000800;
+pub const __WASI_RIGHT_PATH_LINK_TARGET: u64 = 0x0000000000001000;
+pub const __WASI_RIGHT_PATH_OPEN: u64 = 0x0000000000002000;
+pub const __WASI_RIGHT_FD_READDIR: u64 = 0x0000000000004000;
+pub const __WASI_RIGHT_PATH_READLINK: u64 = 0x0000000000008000;
+pub const __WASI_RIGHT_PATH_RENAME_SOURCE: u64 = 0x0000000000010000;
+pub const __WASI_RIGHT_PATH_RENAME_TARGET: u64 = 0x0000000000020000;
+pub const __WASI_RIGHT_PATH_FILESTAT_GET: u64 = 0x0000000000040000;
+pub const __WASI_RIGHT_PATH_FILESTAT_SET_SIZE: u64 = 0x0000000000080000;
+pub const __WASI_RIGHT_PATH_FILESTAT_SET_TIMES: u64 = 0x0000000000100000;
+pub const __WASI_RIGHT_FD_FILESTAT_GET: u64 = 0x0000000000200000;
+pub const __WASI_RIGHT_FD_FILESTAT_SET_SIZE: u64 = 0x0000000000400000;
+pub const __WASI_RIGHT_FD_FILESTAT_SET_TIMES: u64 = 0x0000000000800000;
+pub const __WASI_RIGHT_PATH_SYMLINK: u64 = 0x0000000001000000;
+pub const __WASI_RIGHT_PATH_REMOVE_DIRECTORY: u64 = 0x0000000002000000;
+pub const __WASI_RIGHT_PATH_UNLINK_FILE: u64 = 0x0000000004000000;
+pub const __WASI_RIGHT_POLL_FD_READWRITE: u64 = 0x0000000008000000;
+pub const __WASI_RIGHT_SOCK_SHUTDOWN: u64 = 0x0000000010000000;
+pub const __WASI_SOCK_RECV_DATA_TRUNCATED: u16 = 0x0001;
+pub const __WASI_SHUT_RD: u8 = 0x01;
+pub const __WASI_SHUT_WR: u8 = 0x02;
+pub const __WASI_SIGHUP: u8 = 1;
+pub const __WASI_SIGINT: u8 = 2;
+pub const __WASI_SIGQUIT: u8 = 3;
+pub const __WASI_SIGILL: u8 = 4;
+pub const __WASI_SIGTRAP: u8 = 5;
+pub const __WASI_SIGABRT: u8 = 6;
+pub const __WASI_SIGBUS: u8 = 7;
+pub const __WASI_SIGFPE: u8 = 8;
+pub const __WASI_SIGKILL: u8 = 9;
+pub const __WASI_SIGUSR1: u8 = 10;
+pub const __WASI_SIGSEGV: u8 = 11;
+pub const __WASI_SIGUSR2: u8 = 12;
+pub const __WASI_SIGPIPE: u8 = 13;
+pub const __WASI_SIGALRM: u8 = 14;
+pub const __WASI_SIGTERM: u8 = 15;
+pub const __WASI_SIGCHLD: u8 = 16;
+pub const __WASI_SIGCONT: u8 = 17;
+pub const __WASI_SIGSTOP: u8 = 18;
+pub const __WASI_SIGTSTP: u8 = 19;
+pub const __WASI_SIGTTIN: u8 = 20;
+pub const __WASI_SIGTTOU: u8 = 21;
+pub const __WASI_SIGURG: u8 = 22;
+pub const __WASI_SIGXCPU: u8 = 23;
+pub const __WASI_SIGXFSZ: u8 = 24;
+pub const __WASI_SIGVTALRM: u8 = 25;
+pub const __WASI_SIGPROF: u8 = 26;
+pub const __WASI_SIGWINCH: u8 = 27;
+pub const __WASI_SIGPOLL: u8 = 28;
+pub const __WASI_SIGPWR: u8 = 29;
+pub const __WASI_SIGSYS: u8 = 30;
+pub const __WASI_SUBSCRIPTION_CLOCK_ABSTIME: u16 = 0x0001;
+pub const __WASI_WHENCE_CUR: u8 = 0;
+pub const __WASI_WHENCE_END: u8 = 1;
+pub const __WASI_WHENCE_SET: u8 = 2;
+
+#[cfg_attr(
+ feature = "rustc-dep-of-std",
+ link(name = "c", kind = "static", cfg(target_feature = "crt-static"))
+)]
+#[cfg_attr(
+ feature = "rustc-dep-of-std",
+ link(name = "c", cfg(not(target_feature = "crt-static")))
+)]
+extern {
+ pub fn _Exit(code: c_int) -> !;
+ pub fn _exit(code: c_int) -> !;
+ pub fn abort() -> !;
+ pub fn aligned_alloc(a: size_t, b: size_t) -> *mut c_void;
+ pub fn calloc(amt: size_t, amt2: size_t) -> *mut c_void;
+ pub fn exit(code: c_int) -> !;
+ pub fn free(ptr: *mut c_void);
+ pub fn getenv(s: *const c_char) -> *mut c_char;
+ pub fn malloc(amt: size_t) -> *mut c_void;
+ pub fn malloc_usable_size(ptr: *mut c_void) -> size_t;
+ pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void;
+ pub fn rand() -> c_int;
+ pub fn read(fd: c_int, ptr: *mut c_void, size: size_t) -> ssize_t;
+ pub fn realloc(ptr: *mut c_void, amt: size_t) -> *mut c_void;
+ pub fn setenv(k: *const c_char, v: *const c_char, a: c_int) -> c_int;
+ pub fn unsetenv(k: *const c_char) -> c_int;
+ pub fn clearenv() -> ::c_int;
+ pub fn write(fd: c_int, ptr: *const c_void, size: size_t) -> ssize_t;
+ pub static mut environ: *mut *mut c_char;
+ pub fn fopen(a: *const c_char, b: *const c_char) -> *mut FILE;
+ pub fn freopen(
+ a: *const c_char,
+ b: *const c_char,
+ f: *mut FILE,
+ ) -> *mut FILE;
+ pub fn fclose(f: *mut FILE) -> c_int;
+ pub fn remove(a: *const c_char) -> c_int;
+ pub fn rename(a: *const c_char, b: *const c_char) -> c_int;
+ pub fn feof(f: *mut FILE) -> c_int;
+ pub fn ferror(f: *mut FILE) -> c_int;
+ pub fn fflush(f: *mut FILE) -> c_int;
+ pub fn clearerr(f: *mut FILE);
+ pub fn fseek(f: *mut FILE, b: c_long, c: c_int) -> c_int;
+ pub fn ftell(f: *mut FILE) -> c_long;
+ pub fn rewind(f: *mut FILE);
+ pub fn fgetpos(f: *mut FILE, pos: *mut fpos_t) -> c_int;
+ pub fn fsetpos(f: *mut FILE, pos: *const fpos_t) -> c_int;
+ pub fn fread(
+ buf: *mut c_void,
+ a: size_t,
+ b: size_t,
+ f: *mut FILE,
+ ) -> size_t;
+ pub fn fwrite(
+ buf: *const c_void,
+ a: size_t,
+ b: size_t,
+ f: *mut FILE,
+ ) -> size_t;
+ pub fn fgetc(f: *mut FILE) -> c_int;
+ pub fn getc(f: *mut FILE) -> c_int;
+ pub fn getchar() -> c_int;
+ pub fn ungetc(a: c_int, f: *mut FILE) -> c_int;
+ pub fn fputc(a: c_int, f: *mut FILE) -> c_int;
+ pub fn putc(a: c_int, f: *mut FILE) -> c_int;
+ pub fn putchar(a: c_int) -> c_int;
+ pub fn fputs(a: *const c_char, f: *mut FILE) -> c_int;
+ pub fn puts(a: *const c_char) -> c_int;
+ pub fn perror(a: *const c_char);
+ pub fn srand(a: c_uint);
+ pub fn atexit(a: extern fn()) -> c_int;
+ pub fn at_quick_exit(a: extern fn()) -> c_int;
+ pub fn quick_exit(a: c_int) -> !;
+ pub fn posix_memalign(a: *mut *mut c_void, b: size_t, c: size_t) -> c_int;
+ pub fn rand_r(a: *mut c_uint) -> c_int;
+ pub fn random() -> c_long;
+ pub fn srandom(a: c_uint);
+ pub fn putenv(a: *mut c_char) -> c_int;
+ pub fn clock() -> clock_t;
+ pub fn time(a: *mut time_t) -> time_t;
+ pub fn difftime(a: time_t, b: time_t) -> c_double;
+ pub fn mktime(a: *mut tm) -> time_t;
+ pub fn strftime(
+ a: *mut c_char,
+ b: size_t,
+ c: *const c_char,
+ d: *const tm,
+ ) -> size_t;
+ pub fn gmtime(a: *const time_t) -> *mut tm;
+ pub fn gmtime_r(a: *const time_t, b: *mut tm) -> *mut tm;
+ pub fn localtime_r(a: *const time_t, b: *mut tm) -> *mut tm;
+ pub fn asctime_r(a: *const tm, b: *mut c_char) -> *mut c_char;
+ pub fn ctime_r(a: *const time_t, b: *mut c_char) -> *mut c_char;
+
+ pub fn nanosleep(a: *const timespec, b: *mut timespec) -> c_int;
+ // pub fn clock_getres(a: clockid_t, b: *mut timespec) -> c_int;
+ // pub fn clock_gettime(a: clockid_t, b: *mut timespec) -> c_int;
+ // pub fn clock_nanosleep(
+ // a: clockid_t,
+ // a2: c_int,
+ // b: *const timespec,
+ // c: *mut timespec,
+ // ) -> c_int;
+
+ pub fn isalnum(c: c_int) -> c_int;
+ pub fn isalpha(c: c_int) -> c_int;
+ pub fn iscntrl(c: c_int) -> c_int;
+ pub fn isdigit(c: c_int) -> c_int;
+ pub fn isgraph(c: c_int) -> c_int;
+ pub fn islower(c: c_int) -> c_int;
+ pub fn isprint(c: c_int) -> c_int;
+ pub fn ispunct(c: c_int) -> c_int;
+ pub fn isspace(c: c_int) -> c_int;
+ pub fn isupper(c: c_int) -> c_int;
+ pub fn isxdigit(c: c_int) -> c_int;
+ pub fn tolower(c: c_int) -> c_int;
+ pub fn toupper(c: c_int) -> c_int;
+ pub fn setvbuf(
+ stream: *mut FILE,
+ buffer: *mut c_char,
+ mode: c_int,
+ size: size_t,
+ ) -> c_int;
+ pub fn setbuf(stream: *mut FILE, buf: *mut c_char);
+ pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE)
+ -> *mut c_char;
+ pub fn atoi(s: *const c_char) -> c_int;
+ pub fn atof(s: *const c_char) -> c_double;
+ pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double;
+ pub fn strtol(
+ s: *const c_char,
+ endp: *mut *mut c_char,
+ base: c_int,
+ ) -> c_long;
+ pub fn strtoul(
+ s: *const c_char,
+ endp: *mut *mut c_char,
+ base: c_int,
+ ) -> c_ulong;
+
+ pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
+ pub fn strncpy(
+ dst: *mut c_char,
+ src: *const c_char,
+ n: size_t,
+ ) -> *mut c_char;
+ pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char;
+ pub fn strncat(
+ s: *mut c_char,
+ ct: *const c_char,
+ n: size_t,
+ ) -> *mut c_char;
+ pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int;
+ pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int;
+ pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
+ pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char;
+ pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char;
+ pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t;
+ pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t;
+ pub fn strdup(cs: *const c_char) -> *mut c_char;
+ pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char;
+ pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
+ pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int;
+ pub fn strncasecmp(
+ s1: *const c_char,
+ s2: *const c_char,
+ n: size_t,
+ ) -> c_int;
+ pub fn strlen(cs: *const c_char) -> size_t;
+ pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t;
+ pub fn strerror(n: c_int) -> *mut c_char;
+ pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char;
+ pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t;
+
+ pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
+ pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int;
+ pub fn memcpy(
+ dest: *mut c_void,
+ src: *const c_void,
+ n: size_t,
+ ) -> *mut c_void;
+ pub fn memmove(
+ dest: *mut c_void,
+ src: *const c_void,
+ n: size_t,
+ ) -> *mut c_void;
+ pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void;
+
+ pub fn fprintf(
+ stream: *mut ::FILE,
+ format: *const ::c_char,
+ ...
+ ) -> ::c_int;
+ pub fn printf(format: *const ::c_char, ...) -> ::c_int;
+ pub fn snprintf(
+ s: *mut ::c_char,
+ n: ::size_t,
+ format: *const ::c_char,
+ ...
+ ) -> ::c_int;
+ pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int;
+ pub fn fscanf(
+ stream: *mut ::FILE,
+ format: *const ::c_char,
+ ...
+ ) -> ::c_int;
+ pub fn scanf(format: *const ::c_char, ...) -> ::c_int;
+ pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...)
+ -> ::c_int;
+ pub fn getchar_unlocked() -> ::c_int;
+ pub fn putchar_unlocked(c: ::c_int) -> ::c_int;
+
+ pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int;
+ pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int;
+ pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int;
+ pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int;
+ pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE;
+ pub fn fileno(stream: *mut ::FILE) -> ::c_int;
+ pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int;
+ pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int;
+ pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int;
+ pub fn opendir(dirname: *const c_char) -> *mut ::DIR;
+ pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
+ pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent;
+ pub fn closedir(dirp: *mut ::DIR) -> ::c_int;
+ pub fn rewinddir(dirp: *mut ::DIR);
+ pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
+
+ pub fn openat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ flags: ::c_int,
+ ...
+ ) -> ::c_int;
+ pub fn fstatat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ buf: *mut stat,
+ flags: ::c_int,
+ ) -> ::c_int;
+ pub fn linkat(
+ olddirfd: ::c_int,
+ oldpath: *const ::c_char,
+ newdirfd: ::c_int,
+ newpath: *const ::c_char,
+ flags: ::c_int,
+ ) -> ::c_int;
+ pub fn mkdirat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ mode: ::mode_t,
+ ) -> ::c_int;
+ pub fn readlinkat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ buf: *mut ::c_char,
+ bufsiz: ::size_t,
+ ) -> ::ssize_t;
+ pub fn renameat(
+ olddirfd: ::c_int,
+ oldpath: *const ::c_char,
+ newdirfd: ::c_int,
+ newpath: *const ::c_char,
+ ) -> ::c_int;
+ pub fn symlinkat(
+ target: *const ::c_char,
+ newdirfd: ::c_int,
+ linkpath: *const ::c_char,
+ ) -> ::c_int;
+ pub fn unlinkat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ flags: ::c_int,
+ ) -> ::c_int;
+
+ pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int;
+ pub fn close(fd: ::c_int) -> ::c_int;
+ pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long;
+ pub fn getopt(
+ argc: ::c_int,
+ argv: *const *mut c_char,
+ optstr: *const c_char,
+ ) -> ::c_int;
+ pub fn isatty(fd: ::c_int) -> ::c_int;
+ pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int;
+ pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t;
+ pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long;
+ pub fn pause() -> ::c_int;
+ pub fn rmdir(path: *const c_char) -> ::c_int;
+ pub fn sleep(secs: ::c_uint) -> ::c_uint;
+ pub fn unlink(c: *const c_char) -> ::c_int;
+ pub fn pread(
+ fd: ::c_int,
+ buf: *mut ::c_void,
+ count: ::size_t,
+ offset: off_t,
+ ) -> ::ssize_t;
+ pub fn pwrite(
+ fd: ::c_int,
+ buf: *const ::c_void,
+ count: ::size_t,
+ offset: off_t,
+ ) -> ::ssize_t;
+
+ pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int;
+
+ pub fn fsync(fd: ::c_int) -> ::c_int;
+ pub fn fdatasync(fd: ::c_int) -> ::c_int;
+
+ pub fn symlink(path1: *const c_char, path2: *const c_char) -> ::c_int;
+
+ pub fn truncate(path: *const c_char, length: off_t) -> ::c_int;
+ pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int;
+
+ pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int;
+
+ pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::c_void) -> ::c_int;
+ pub fn times(buf: *mut ::tms) -> ::clock_t;
+
+ pub fn strerror_r(
+ errnum: ::c_int,
+ buf: *mut c_char,
+ buflen: ::size_t,
+ ) -> ::c_int;
+
+ pub fn usleep(secs: ::c_uint) -> ::c_int;
+ pub fn send(
+ socket: ::c_int,
+ buf: *const ::c_void,
+ len: ::size_t,
+ flags: ::c_int,
+ ) -> ::ssize_t;
+ pub fn recv(
+ socket: ::c_int,
+ buf: *mut ::c_void,
+ len: ::size_t,
+ flags: ::c_int,
+ ) -> ::ssize_t;
+ pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int;
+ pub fn setlocale(
+ category: ::c_int,
+ locale: *const ::c_char,
+ ) -> *mut ::c_char;
+ pub fn localeconv() -> *mut lconv;
+
+ pub fn readlink(
+ path: *const c_char,
+ buf: *mut c_char,
+ bufsz: ::size_t,
+ ) -> ::ssize_t;
+
+ pub fn timegm(tm: *mut ::tm) -> time_t;
+
+ pub fn sysconf(name: ::c_int) -> ::c_long;
+
+ pub fn fseeko(
+ stream: *mut ::FILE,
+ offset: ::off_t,
+ whence: ::c_int,
+ ) -> ::c_int;
+ pub fn ftello(stream: *mut ::FILE) -> ::off_t;
+ pub fn posix_fallocate(
+ fd: ::c_int,
+ offset: ::off_t,
+ len: ::off_t,
+ ) -> ::c_int;
+
+ pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
+ pub fn getline(
+ lineptr: *mut *mut c_char,
+ n: *mut size_t,
+ stream: *mut FILE,
+ ) -> ssize_t;
+
+ pub fn faccessat(
+ dirfd: ::c_int,
+ pathname: *const ::c_char,
+ mode: ::c_int,
+ flags: ::c_int,
+ ) -> ::c_int;
+ pub fn writev(
+ fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int,
+ ) -> ::ssize_t;
+ pub fn readv(
+ fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int,
+ ) -> ::ssize_t;
+ pub fn pwritev(
+ fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int,
+ offset: ::off_t,
+ ) -> ::ssize_t;
+ pub fn preadv(
+ fd: ::c_int,
+ iov: *const ::iovec,
+ iovcnt: ::c_int,
+ offset: ::off_t,
+ ) -> ::ssize_t;
+ pub fn posix_fadvise(
+ fd: ::c_int,
+ offset: ::off_t,
+ len: ::off_t,
+ advise: ::c_int,
+ ) -> ::c_int;
+ pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int;
+ pub fn utimensat(
+ dirfd: ::c_int,
+ path: *const ::c_char,
+ times: *const ::timespec,
+ flag: ::c_int,
+ ) -> ::c_int;
+ pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int;
+ pub fn memrchr(
+ cx: *const ::c_void,
+ c: ::c_int,
+ n: ::size_t,
+ ) -> *mut ::c_void;
+ pub fn abs(i: c_int) -> c_int;
+ pub fn labs(i: c_long) -> c_long;
+ 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 sched_yield() -> ::c_int;
+
+ pub fn __wasilibc_register_preopened_fd(
+ fd: c_int,
+ path: *const c_char,
+ ) -> c_int;
+ pub fn __wasilibc_fd_renumber(fd: c_int, newfd: c_int) -> c_int;
+ pub fn __wasilibc_unlinkat(fd: c_int, path: *const c_char) -> c_int;
+ pub fn __wasilibc_rmdirat(fd: c_int, path: *const c_char) -> c_int;
+ pub fn __wasilibc_init_preopen();
+ pub fn __wasilibc_find_relpath(
+ path: *const c_char,
+ rights_base: __wasi_rights_t,
+ rights_inheriting: __wasi_rights_t,
+ relative_path: *mut *const c_char,
+ ) -> c_int;
+ pub fn __wasilibc_tell(fd: c_int) -> ::off_t;
+
+ pub fn arc4random() -> u32;
+ pub fn arc4random_buf(a: *mut c_void, b: size_t);
+ pub fn arc4random_uniform(a: u32) -> u32;
+}
+
+#[link(wasm_import_module = "wasi_unstable")]
+extern {
+ #[link_name = "clock_res_get"]
+ pub fn __wasi_clock_res_get(
+ clock_id: __wasi_clockid_t,
+ resolution: *mut __wasi_timestamp_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "clock_time_get"]
+ pub fn __wasi_clock_time_get(
+ clock_id: __wasi_clockid_t,
+ precision: __wasi_timestamp_t,
+ time: *mut __wasi_timestamp_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_close"]
+ pub fn __wasi_fd_close(fd: __wasi_fd_t) -> __wasi_errno_t;
+ #[link_name = "fd_datasync"]
+ pub fn __wasi_fd_datasync(fd: __wasi_fd_t) -> __wasi_errno_t;
+ #[link_name = "fd_pread"]
+ pub fn __wasi_fd_pread(
+ fd: __wasi_fd_t,
+ iovs: *const __wasi_iovec_t,
+ iovs_len: size_t,
+ offset: __wasi_filesize_t,
+ nread: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_pwrite"]
+ pub fn __wasi_fd_pwrite(
+ fd: __wasi_fd_t,
+ iovs: *const __wasi_ciovec_t,
+ iovs_len: size_t,
+ offset: __wasi_filesize_t,
+ nwritten: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_read"]
+ pub fn __wasi_fd_read(
+ fd: __wasi_fd_t,
+ iovs: *const __wasi_iovec_t,
+ iovs_len: size_t,
+ nread: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_renumber"]
+ pub fn __wasi_fd_renumber(
+ from: __wasi_fd_t,
+ to: __wasi_fd_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_seek"]
+ pub fn __wasi_fd_seek(
+ fd: __wasi_fd_t,
+ offset: __wasi_filedelta_t,
+ whence: __wasi_whence_t,
+ newoffset: *mut __wasi_filesize_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_tell"]
+ pub fn __wasi_fd_tell(
+ fd: __wasi_fd_t,
+ newoffset: *mut __wasi_filesize_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_fdstat_get"]
+ pub fn __wasi_fd_fdstat_get(
+ fd: __wasi_fd_t,
+ buf: *mut __wasi_fdstat_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_fdstat_set_flags"]
+ pub fn __wasi_fd_fdstat_set_flags(
+ fd: __wasi_fd_t,
+ flags: __wasi_fdflags_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_fdstat_set_rights"]
+ pub fn __wasi_fd_fdstat_set_rights(
+ fd: __wasi_fd_t,
+ fs_rights_base: __wasi_rights_t,
+ fs_rights_inheriting: __wasi_rights_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_sync"]
+ pub fn __wasi_fd_sync(fd: __wasi_fd_t) -> __wasi_errno_t;
+ #[link_name = "fd_write"]
+ pub fn __wasi_fd_write(
+ fd: __wasi_fd_t,
+ iovs: *const __wasi_ciovec_t,
+ iovs_len: size_t,
+ nwritten: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_advise"]
+ pub fn __wasi_fd_advise(
+ fd: __wasi_fd_t,
+ offset: __wasi_filesize_t,
+ len: __wasi_filesize_t,
+ advice: __wasi_advice_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_allocate"]
+ pub fn __wasi_fd_allocate(
+ fd: __wasi_fd_t,
+ offset: __wasi_filesize_t,
+ len: __wasi_filesize_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_create_directory"]
+ pub fn __wasi_path_create_directory(
+ fd: __wasi_fd_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_link"]
+ pub fn __wasi_path_link(
+ old_fd: __wasi_fd_t,
+ old_flags: __wasi_lookupflags_t,
+ old_path: *const ::c_char,
+ old_path_len: size_t,
+ new_fd: __wasi_fd_t,
+ new_path: *const ::c_char,
+ new_path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_open"]
+ pub fn __wasi_path_open(
+ dirfd: __wasi_fd_t,
+ dirflags: __wasi_lookupflags_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ oflags: __wasi_oflags_t,
+ fs_rights_base: __wasi_rights_t,
+ fs_rights_inheriting: __wasi_rights_t,
+ fs_flags: __wasi_fdflags_t,
+ fd: *mut __wasi_fd_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_readdir"]
+ pub fn __wasi_fd_readdir(
+ fd: __wasi_fd_t,
+ buf: *mut ::c_void,
+ buf_len: size_t,
+ cookie: __wasi_dircookie_t,
+ bufused: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_readlink"]
+ pub fn __wasi_path_readlink(
+ fd: __wasi_fd_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ buf: *mut ::c_char,
+ buf_len: size_t,
+ bufused: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_rename"]
+ pub fn __wasi_path_rename(
+ old_fd: __wasi_fd_t,
+ old_path: *const ::c_char,
+ old_path_len: size_t,
+ new_fd: __wasi_fd_t,
+ new_path: *const ::c_char,
+ new_path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_filestat_get"]
+ pub fn __wasi_fd_filestat_get(
+ fd: __wasi_fd_t,
+ buf: *mut __wasi_filestat_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_filestat_set_times"]
+ pub fn __wasi_fd_filestat_set_times(
+ fd: __wasi_fd_t,
+ st_atim: __wasi_timestamp_t,
+ st_mtim: __wasi_timestamp_t,
+ fstflags: __wasi_fstflags_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_filestat_set_size"]
+ pub fn __wasi_fd_filestat_set_size(
+ fd: __wasi_fd_t,
+ st_size: __wasi_filesize_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_filestat_get"]
+ pub fn __wasi_path_filestat_get(
+ fd: __wasi_fd_t,
+ flags: __wasi_lookupflags_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ buf: *mut __wasi_filestat_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_filestat_set_times"]
+ pub fn __wasi_path_filestat_set_times(
+ fd: __wasi_fd_t,
+ flags: __wasi_lookupflags_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ st_atim: __wasi_timestamp_t,
+ st_mtim: __wasi_timestamp_t,
+ fstflags: __wasi_fstflags_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_symlink"]
+ pub fn __wasi_path_symlink(
+ old_path: *const ::c_char,
+ old_path_len: size_t,
+ fd: __wasi_fd_t,
+ new_path: *const ::c_char,
+ new_path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_unlink_file"]
+ pub fn __wasi_path_unlink_file(
+ fd: __wasi_fd_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "path_remove_directory"]
+ pub fn __wasi_path_remove_directory(
+ fd: __wasi_fd_t,
+ path: *const ::c_char,
+ path_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "poll_oneoff"]
+ pub fn __wasi_poll_oneoff(
+ in_: *const __wasi_subscription_t,
+ out: *mut __wasi_event_t,
+ nsubscriptions: size_t,
+ nevents: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "proc_exit"]
+ pub fn __wasi_proc_exit(rval: __wasi_exitcode_t);
+ #[link_name = "proc_raise"]
+ pub fn __wasi_proc_raise(sig: __wasi_signal_t) -> __wasi_errno_t;
+ #[link_name = "random_get"]
+ pub fn __wasi_random_get(
+ buf: *mut ::c_void,
+ buf_len: size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "sock_recv"]
+ pub fn __wasi_sock_recv(
+ sock: __wasi_fd_t,
+ ri_data: *const __wasi_iovec_t,
+ ri_data_len: size_t,
+ ri_flags: __wasi_riflags_t,
+ ro_datalen: *mut size_t,
+ ro_flags: *mut __wasi_roflags_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "sock_send"]
+ pub fn __wasi_sock_send(
+ sock: __wasi_fd_t,
+ si_data: *const __wasi_ciovec_t,
+ si_data_len: size_t,
+ si_flags: __wasi_siflags_t,
+ so_datalen: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "sock_shutdown"]
+ pub fn __wasi_sock_shutdown(
+ sock: __wasi_fd_t,
+ how: __wasi_sdflags_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "sched_yield"]
+ pub fn __wasi_sched_yield() -> __wasi_errno_t;
+ #[link_name = "args_get"]
+ pub fn __wasi_args_get(
+ argv: *mut *mut c_char,
+ argv_buf: *mut c_char,
+ ) -> __wasi_errno_t;
+ #[link_name = "args_sizes_get"]
+ pub fn __wasi_args_sizes_get(
+ argc: *mut size_t,
+ argv_buf_size: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "environ_get"]
+ pub fn __wasi_environ_get(
+ environ: *mut *mut c_char,
+ environ_buf: *mut c_char,
+ ) -> __wasi_errno_t;
+ #[link_name = "environ_sizes_get"]
+ pub fn __wasi_environ_sizes_get(
+ environ_count: *mut size_t,
+ environ_buf_size: *mut size_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_prestat_get"]
+ pub fn __wasi_fd_prestat_get(
+ fd: __wasi_fd_t,
+ buf: *mut __wasi_prestat_t,
+ ) -> __wasi_errno_t;
+ #[link_name = "fd_prestat_dir_name"]
+ pub fn __wasi_fd_prestat_dir_name(
+ fd: __wasi_fd_t,
+ path: *mut c_char,
+ path_len: size_t,
+ ) -> __wasi_errno_t;
+}