The major users of this function are functions like gethostname, which
will always properly align their buffers. But out-of-crate consumers
could manually construct an unaligned buffer. Handle that correctly.
Enable Clippy's cast_ptr_alignment lint. It's disabled by default as it
reports many false positives, but it would've caught this problem.
Reported-by: Miri
Fixes: 1769
1764: Fix description of fchownat r=asomers a=valdaarhun
Based on the man page for `fchownat` and `lchown`, I have got the impression that with `FchownatFlags::NoFollowSymlink`, fchownat and lchown are identical. I couldn't find any documentation on `lchmod`.
Co-authored-by: valdaarhun <icegambit91@gmail.com>
1741: SigSet: A new unsafe helper method to create a SigSet from a sigset_t r=rtzoeller a=germag
Currently, the only way to create a `SigSet` from a `sigset_t` object
is by using pointer casts, like:
```
unsafe {
let sigset = *(&sigset as *const libc::sigset_t as *const SigSet)
};
```
This is un-ergonomic for library creators with interfaces to C.
So, let's add a new unsafe method that creates a `SigSet` from a
`libc::sigset_t` object.
We can't implement `From` since converting from `libc::sigset_t` to
`SigSet` is unsafe, because objects of type `libc::sigset_t` must be
initialized by calling either `sigemptyset(3)` or `sigfillset(3)`
before being used. In other case, the results are undefined.
We can't implement `TryFrom` either, because there is no way to check
if an object of type `libc::sigset_t` is initialized.
Signed-off-by: German Maglione <gmaglione@redhat.com>
Co-authored-by: German Maglione <gmaglione@redhat.com>
1763: Fix a buffer overflow in sys::socket::recvfrom r=posborne a=asomers
IPv4 and stream sockets are unaffected, but for datagram sockets of
other address types libc::recvfrom might overwrite part of the stack.
Fixes#1762
Co-authored-by: Alan Somers <asomers@gmail.com>
1761: Add non-standard Linux `SysconfVar` variants r=asomers a=stevenengler
Closes#1240.
You can find these options near the end of https://man7.org/linux/man-pages/man3/sysconf.3.html.
I can see that the libc crate defines these for Linux and Android, but I'm not sure if they're defined for any others as well.
Co-authored-by: Steven Engler <opara@cs.georgetown.edu>
This commit adds the `repr(transparent)` attribute to the `SigSet`
struct, to make sure that its representation is exactly like the
`sigset_t` struct from C, in all cases.
Signed-off-by: German Maglione <gmaglione@redhat.com>
Currently, the only way to create a `SigSet` from a `sigset_t` object
is by using pointer casts, like:
```
unsafe {
let sigset = *(&sigset as *const libc::sigset_t as *const SigSet)
};
```
This is un-ergonomic for library creators with interfaces to C.
So, let's add a new unsafe method that creates a `SigSet` from a
`libc::sigset_t` object.
We can't implement `From` since converting from `libc::sigset_t` to
`SigSet` is unsafe, because objects of type `libc::sigset_t` must be
initialized by calling either `sigemptyset(3)` or `sigfillset(3)`
before being used. In other case, the results are undefined.
We can't implement `TryFrom` either, because there is no way to check
if an object of type `libc::sigset_t` is initialized.
Signed-off-by: German Maglione <gmaglione@redhat.com>
1759: More docs for dir and mqueue r=rtzoeller a=asomers
Add doc comments for the `dir` and `mqueue` modules. Also, delete dead code in `mqueue`
1760: Add const constructors for TimeSpec and TimeVal r=rtzoeller a=asomers
These are basically the same as From<libc::timespec> and
From<libc::timeval>, but they're const and require less typing.
Co-authored-by: Alan Somers <asomers@gmail.com>
1752: Add missing DontRoute SockOpt r=asomers a=leoleoasd
I'm not sure, but according to [unix standard](https://pubs.opengroup.org/onlinepubs/7908799/xns/setsockopt.html), SO_DONTROUTE should appear in all unix systems.
Does this need a test?
Co-authored-by: Leo Lu <luyuxuanleo@gmail.com>
1745: Change gethostname to use a buffer of MaybeUninit values r=asomers a=nathaniel-daniel
Changing `gethostname` to accept a buffer of `MaybeUninit` bytes allows the user to avoid needlessly initializing a buffer. This is a breaking API change.
Co-authored-by: Nathaniel Daniel <nathaniel.daniel12@gmail.com>
1693: Document aliases for functions like getuid() r=asomers a=rtzoeller
Add the autocfg crate as a build dependency, and introduce `has_doc_alias` as a conditional compilation symbol.
Closes#1673.
Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
1748: Add format test to CI r=rtzoeller a=costinsin
To enforce uniformity for all PRs, the CI checks if the code
is formatted right using `cargo fmt` tool.
Results after implementing the format test in CicleCI, but before fixing the format errors: https://cirrus-ci.com/build/4684991404703744
Results after fixing the format errors: https://cirrus-ci.com/build/5423803479097344
Solves #770
Co-authored-by: Costin-Robert Sin <sin.costinrobert@gmail.com>
To enforce uniformity for all PRs, the CI checks if the code
is formatted rigth using `cargo fmt` tool.
Signed-off-by: Costin-Robert Sin <sin.costinrobert@gmail.com>
1747: Add getrusage wrapper r=rtzoeller a=kov
Includes an enum to specify what to get resource usage for, and a new
struct that provides a more readable view into libc::rusage, including
using TimeVal for user and system CPU time.
Signed-off-by: Gustavo Noronha Silva <gustavo@noronha.dev.br>
Co-authored-by: Gustavo Noronha Silva <gustavo@noronha.dev.br>
Includes an enum to specify what to get resource usage for, and a new
struct that provides a more readable view into libc::rusage, including
using TimeVal for user and system CPU time.
1746: Fix typo and minimise the use of `unsafe` blocks inside the `pipe` function r=rtzoeller a=costinsin
Some of the operations inside the pipe function are safe and should not be included inside an unsafe block.
Co-authored-by: Costin-Robert Sin <sin.costinrobert@gmail.com>
Some of the operations inside the pipe function are safe and should
not be included inside an unsafe block.
Signed-off-by: Costin-Robert Sin <sin.costinrobert@gmail.com>
1739: ppoll: make sigmask parameter optional r=rtzoeller a=stefano-garzarella
ppoll(2) supports 'sigmask' as NULL. In that case no signal mask
manipulation is performed.
Let's make `sigmask` parameter of `nix::poll::ppoll` optional
to allow that behaviour.
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Co-authored-by: Stefano Garzarella <sgarzare@redhat.com>
ppoll(2) supports 'sigmask' as NULL. In that case no signal mask
manipulation is performed.
Let's make `sigmask` parameter of `nix::poll::ppoll` optional
to allow that behaviour.
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
1736: Fix socket address family checks r=rtzoeller a=qwandor
The `SockaddrLike::from_raw` implementations for `VsockAddr` and `SysControlAddr` were checking against the wrong address family constant. This PR makes them consistent with the values matched against in `SockaddrStorage::from_raw`.
Co-authored-by: Andrew Walbran <qwandor@google.com>
1735: Cleanup cfg blocks r=asomers a=rtzoeller
Remove obsolete references to target_env = wasi, target_os = nacl, target_os = osx, and a typo'd target_os = fushsia that didn't compile when fixed.
- target_env = wasi is dead: https://github.com/rust-lang/rust/pull/60117
- target_os = nacl is dead: https://github.com/rust-lang/rust/pull/45041
- target_os = osx is dead, but I can't find a link.
Found while exploring `--check-cfg`, as mentioned in #1734.
Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
1737: Fix the test_acct test r=rtzoeller a=asomers
It has never actually executed its command, so the only reason that it
ever worked is that on most systems there are usually processes starting
and exiting all the time.
Co-authored-by: Alan Somers <asomers@gmail.com>
It has never actually executed its command, so the only reason that it
ever worked is that on most systems there are usually processes starting
and exiting all the time.
1729: Enable SockaddrStorage::{as_link_addr, as_link_addr_mut} on Linux. r=rtzoeller a=asomers
This was an oversight from #1684.
Fixes#1728
Co-authored-by: Alan Somers <asomers@gmail.com>
1730: Ignore doctests for unexported macros r=asomers a=zombiepigdragon
Due to rust-lang/rust#97030, cargo test will fail to doctest macros unless they are exported, breaking the examples for `libc_bitflags!` and `libc_enum!`.
Adds `ignore` to the examples for these macros to stop tests from failing.
`cargo test` already fails on cargo 1.62.0-beta.2, and the above issue makes it seem unlikely that this will be changed on the Rust side. If rust-lang/rust#96630 *does* get reverted, this PR can be closed/unmerged, although the test wasn't running beforehand, and it might be worth making this explicit regardless.
Co-authored-by: Alex Rawson <ajzecrom@gmail.com>