1
Fork 0

Mark -1 as an available niche for file descriptors

Based on discussion from https://internals.rust-lang.org/t/can-the-standard-library-shrink-option-file/12768,
the file descriptor -1 is chosen based on the POSIX API designs that use it as a sentinel to report errors.
A bigger niche could've been chosen, particularly on Linux, but would not necessarily be portable.

This PR also adds a test case to ensure that the -1 niche
(which is kind of hacky and has no obvious test case) works correctly.
It requires the "upper" bound, which is actually -1, to be expressed in two's complement.
This commit is contained in:
Michael Howell 2020-07-27 21:25:36 -07:00
parent d32c320d7e
commit 59abdb6a7e
3 changed files with 25 additions and 5 deletions

View file

@ -12,6 +12,11 @@ use crate::sys_common::AsInner;
use libc::{c_int, c_void};
#[derive(Debug)]
#[rustc_layout_scalar_valid_range_start(0)]
// libstd/os/raw/mod.rs assures me that every libstd-supported platform has a
// 32-bit c_int. Below is -2, in two's complement, but that only works out
// because c_int is 32 bits.
#[rustc_layout_scalar_valid_range_end(0xFF_FF_FF_FE)]
pub struct FileDesc {
fd: c_int,
}
@ -63,7 +68,8 @@ const fn max_iov() -> usize {
impl FileDesc {
pub fn new(fd: c_int) -> FileDesc {
FileDesc { fd }
assert_ne!(fd, -1);
unsafe { FileDesc { fd } }
}
pub fn raw(&self) -> c_int {