The pr #1870 introduced safe_f! macro, which made some functions like
WIFEXITED and WEXITSTATUS const and safe on linux_like platform only,
which causes inconsistency when trying to use those functions in crates
compiled across multiple platforms, as using unsafe on those functions
will generate unused_unsafe warning on linux platforms and lack of
unsafe block will fail compilation on non-linux platforms.
To avoid the inconsistency, this commit applies the same macro for all
the same functions on other platforms too.
memmem is a non-standard extension, first added in GNU libc and later
ported to other systems. Support for it is non-uniform, thus it was only
added to platforms that seem to support it.
This constant is not stable across OS versions, so it cannot be used in
any backwards- or forwards- compatible way. It's typically used to size
arrays in the kernel and in debugging utilities that are closely tied to
the OS version. Since libc is ignorant about OS versions, we shouldn't
even be defining it.
sigevent structs on most platforms have padding or unused fields. Rather
than display those in the Debug impl by deriving it, manually implement
all extra_traits instead ignoring those fields.
* Change the type of FIONCLEX on apple platforms from c_uint to c_ulong
* Add FIONCLEX, FIONREAD, FIOASYNC, FIOSETOWN and FIOGETOWN
for DragonFly and OpenBSD
Deprecate fixed width integer type aliases
cc @emilio - I think it makes sense to ensure that the latest released version of bindgen works properly with this change. That is, that even when asked to use C types from, e.g., `libc::`, it does not use aliases for the fixed-width integer C types (e.g. `libc::int64_t`) but uses Rust primitive types instead (e.g. `u64`).
Closes#1304 .
Broader sendmmsg() / recvmmsg() support
As a prerequisite for getting `sendmmsg()` / `recvmmsg()` into nix ( https://github.com/nix-rust/nix/pull/1017 ), support for non-linux platforms needs to be added in libc.
The initial commits in this PR will just be to test out target support via CI.
This PR fixes the build on all platforms and all Rust version down to the
minimum Rust version supported by libc: Rust 1.13.0.
The `build.rs` is extended with logic to detect the newer Rust features used by
`libc` since Rust 1.13.0:
* Rust 1.19.0: `untagged_unions`. APIs using untagged unions are gated on
`cfg(libc_unions)` and not available on older Rust versions.
* Rust 1.25.0: `repr(align)`. Because `repr(align)` cannot be parsed by older
Rust versions, all uses of `repr(align)` are split into `align.rs` and
`no_align.rs` modules, which are gated on the `cfg(libc_align)` at the top
level. These modules sometimes contain macros that are expanded at the top
level to avoid privacy issues (`pub(crate)` is not available in older Rust
versions). Closes#1242 .
* Rust : `const` `mem::size_of`. These uses are worked around with hardcoded
constants on older Rust versions.
Also, `repr(packed)` structs cannot automatically `derive()` some traits like
`Debug`. These have been moved into `s_no_extra_traits!` and the lint of missing
`Debug` implementations on public items is silenced for these. We can manually
implement the `extra_traits` for these in a follow up PR. This is tracked
in #1243. Also, `extra_traits` does not enable `align` manually anymore.
Since `f64::to_bits` is not available in older Rust versions, its usage
has been replaced with a `transmute` to an `u64` which is what that method
does under the hood.
Closes#1232 .