Adds the ip_mreqn struct for the Fuchsia platform, as defined by ip(7).
Enables joining an IPv4 multicast group by NIC ID rather than by its
assigned IPv4 address.
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.
This change addresses two style errors found in PR review:
* indent and linebreak in CMSG_NXTHDR
* prefer `0 as *mut cmsghdr` over `core::ptr::nul_mut()`
This change defines and implements functions for the Fuchsia platform
corresponding to the C library CMSG_* macros, used for processing socket
control messages sent or received using the recv_msg(2)/send_msg(2)
syscalls.
These fuctions are not present in Fuchsia's libc, so they cannot be
used in a program today. If Fuchsia ever decides to add these functions
to their libc, they can be added back as necessary.
PR #849 just moved all of the Linux structures into `src/fuchsia`.
While this is good for the most part, we really don't want the `SYS_*`
constants exported on Fushia, as these are not Fuchsia's syscalls.
This also removes Linux-specific `GRND_*` constants.
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.
`nl_pad` field does not contain any actual data, so using it for
comparison or hashing doesn't make sense. Instead manually implement
extra traits ignoring this field.
The `pad` or `__reserved` fields are not always 0 on some platforms,
so when used in the `PartialEq` implementation being used, fails some
comparisons. This commit manually implements the extra traits to
correct this behavior.
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 .
Linux 4.18 added support for SIGSYS info in signalfd. Add the new
fields to signalfd_siginfo.
While the kernel has support for these new fields now, no libc has
shipped a release with the new signalfd fields.