Skip to content

Commit

Permalink
Merge #1703
Browse files Browse the repository at this point in the history
1703: add haiku support r=rtzoeller a=hoanga

hello,

the following changeset(s) adds support for compiling on haiku.

below is an sample run showing compilation

```sh
> uname -a
Haiku shredder 1 hrev56040 Apr 22 2022 06:24:48 x86_64 x86_64 Haiku

> cargo build
   Compiling autocfg v1.1.0
   Compiling libc v0.2.123
   Compiling bitflags v1.3.2
   Compiling cfg-if v1.0.0
   Compiling memoffset v0.6.5
   Compiling nix v0.24.1 (/boot/home/src/git/rust-libs/nix)
    Finished dev [unoptimized + debuginfo] target(s) in 11.09s

```

and some results from running ```cargo test```:

```sh

running 32 tests
test sys::select::tests::fdset_clear ... ok
test sys::select::tests::fdset_insert ... ok
test sys::select::tests::fdset_highest ... ok
test sys::select::tests::fdset_fds ... ok
test sys::select::tests::fdset_remove ... ok
test sys::signal::tests::test_clear ... ok
test sys::select::tests::test_select ... ok
test sys::select::tests::test_select_nfds2 ... ok
test sys::signal::tests::test_contains ... ok
test sys::select::tests::test_select_nfds ... ok
test sys::signal::tests::test_extend ... ok
test sys::signal::tests::test_from_and_into_iterator ... ok
test sys::signal::tests::test_from_str_invalid_value ... ok
test sys::signal::tests::test_from_str_round_trips ... ok
test sys::signal::tests::test_sigaction ... ok
test sys::signal::tests::test_sigwait ... ok
test sys::signal::tests::test_thread_signal_set_mask ... ok
test sys::statvfs::test::fstatvfs_call ... ok
test sys::statvfs::test::statvfs_call ... ok
test sys::termios::test::try_from ... ok
test sys::signal::tests::test_thread_signal_swap ... ok
test sys::signal::tests::test_thread_signal_block ... ok
test sys::signal::tests::test_thread_signal_unblock ... ok
test sys::time::test::test_timespec ... ok
test sys::time::test::test_timespec_from ... ok
test sys::time::test::test_timespec_neg ... ok
test sys::time::test::test_timespec_fmt ... ok
test sys::time::test::test_timespec_ord ... ok
test sys::time::test::test_timeval ... ok
test sys::time::test::test_timeval_neg ... ok
test sys::time::test::test_timeval_fmt ... ok
test sys::time::test::test_timeval_ord ... ok

test result: ok. 32 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running test/test.rs (target/debug/deps/test-6e8a70ba3d8f7447)

running 73 tests
test sys::test_pthread::test_pthread_kill_none ... ok
test sys::test_pthread::test_pthread_self ... ok
test sys::test_select::test_pselect_nfds2 ... ok
test sys::test_select::test_pselect ... ok
test sys::test_signal::test_kill_none ... ok
test sys::test_signal::test_killpg_none ... ok
test sys::test_signal::test_old_sigaction_flags ... ok
test sys::test_signal::test_signal ... ok
test sys::test_signal::test_sigprocmask ... ok
test sys::test_signal::test_signal_sigaction ... ok
test sys::test_signal::test_sigprocmask_noop ... ok
test sys::test_select::test_fdset_negative_fd::contains - should panic ... ok
test sys::test_select::test_fdset_negative_fd::remove - should panic ... ok
test sys::test_select::test_fdset_negative_fd::insert - should panic ... ok
test sys::test_select::test_fdset_too_large_fd::contains - should panic ... ok
test sys::test_select::test_fdset_too_large_fd::insert - should panic ... ok
test sys::test_select::test_fdset_too_large_fd::remove - should panic ... ok
test sys::test_wait::test_wait_exit ... ok
test sys::test_wait::test_waitid_pid ... ok
test sys::test_uio::test_readv ... ok
test sys::test_wait::test_waitstatus_from_raw ... FAILED
test sys::test_wait::test_waitstatus_pid ... ok
test sys::test_uio::test_writev ... ok
test test_net::test_if_nametoindex ... ok
test test_dir::rewind ... ok
test test_poll::test_pollfd_events ... ok
test test_poll::test_pollfd_fd ... ok
test sys::test_uio::test_pwrite ... ok
test sys::test_uio::test_pread ... ok
test test_fcntl::test_readlink ... ok
test test_fcntl::test_openat ... ok
test test_dir::read ... ok
test test_stat::test_fstatat ... ok
test test_stat::test_mkdirat_fail ... ok
test test_time::test_clock_gettime ... ok
test test_stat::test_fchmod ... ok
test test_stat::test_fchmodat ... ok
test test_time::test_clock_id_now ... ok
test test_fcntl::test_renameat ... ok
test test_stat::test_mkdirat_success_path ... ok
test test_stat::test_stat_and_fstat ... ok
test test_unistd::test_execvpe::test_cstr_ref ... ok
test test_unistd::test_access_not_existing ... ok
test test_unistd::test_execvpe::test_cstring ... ok
test test_unistd::test_access_file_exists ... ok
test test_stat::test_stat_fstat_lstat ... ok
test test_unistd::test_fchdir ... ok
test test_unistd::test_fork_and_waitpid ... ok
test test_unistd::test_fchown ... ok
test test_unistd::test_chown ... ok
test test_unistd::test_getpid ... ok
test test_unistd::test_getsid ... ok
test test_unistd::test_fpathconf_limited ... ok
test test_unistd::test_lseek ... ok
test test_unistd::test_mkfifo_directory ... ok
test test_unistd::test_fchownat ... ok
test test_unistd::test_mkstemp_directory ... ok
test test_unistd::test_pathconf_limited ... ok
test test_unistd::test_pipe ... ok
test test_unistd::test_sysconf_limited ... ok
test test_unistd::test_mkfifo ... ok
test test_unistd::test_ttyname_not_pty ... ok
test test_unistd::test_ftruncate ... ok
test test_unistd::test_mkstemp ... ok
test test_poll::test_poll ... ok
test test_unistd::test_wait ... ok
test test_unistd::test_unlinkat_dir_removedir ... ok
test test_unistd::test_unlinkat_file ... ok
test test_unistd::test_unlinkat_dir_noremovedir ... ok
test test_unistd::test_truncate ... ok
test test_unistd::test_getcwd ... ok
test test_unistd::test_alarm ... ok
test test_unistd::test_canceling_alarm ... ok

failures:

---- sys::test_wait::test_waitstatus_from_raw stdout ----
thread 'sys::test_wait::test_waitstatus_from_raw' panicked at 'assertion failed: `(left == right)`
  left: `Ok(Exited(Pid(1), 2))`,
 right: `Ok(Signaled(Pid(1), SIGINT, false))`', test/sys/test_wait.rs:93:5


failures:
    sys::test_wait::test_waitstatus_from_raw

test result: FAILED. 72 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.06s

error: test failed, to rerun pass '--test test'
```

Co-authored-by: Al Hoang <[email protected]>
  • Loading branch information
bors[bot] and Al Hoang authored May 15, 2022
2 parents 69738c0 + d02e274 commit 1647189
Show file tree
Hide file tree
Showing 30 changed files with 424 additions and 124 deletions.
3 changes: 3 additions & 0 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,9 @@ task:
- name: Linux armv7 uclibceabihf
env:
TARGET: armv7-unknown-linux-uclibceabihf
- name: Haiku x86_64
env:
TARGET: x86_64-unknown-haiku
setup_script:
- rustup component add rust-src
<< : *BUILD
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ This project adheres to [Semantic Versioning](https://semver.org/).
- impl From<SockaddrIn> for std::net::SocketAddrV4 and
impl From<SockaddrIn6> for std::net::SocketAddrV6.
(#[1711](https://github.com/nix-rust/nix/pull/1711))
- Fixed compilation and updated support on Haiku
- Added support for the `x86_64-unknown-haiku` target.
(#[1703](https://github.com/nix-rust/nix/pull/1703))

### Changed

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ Tier 3:
* armv7-unknown-linux-uclibceabihf
* x86_64-fuchsia
* x86_64-unknown-dragonfly
* x86_64-unknown-haiku
* x86_64-unknown-linux-gnux32
* x86_64-unknown-openbsd
* x86_64-unknown-redox
Expand Down
1 change: 1 addition & 0 deletions bors.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ status = [
"iOS aarch64",
"iOS x86_64",
"Illumos",
"Haiku x86_64",
]

# Set bors's timeout to 1 hour
Expand Down
6 changes: 3 additions & 3 deletions src/dir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ impl Entry {
/// notably, some Linux filesystems don't implement this. The caller should use `stat` or
/// `fstat` if this returns `None`.
pub fn file_type(&self) -> Option<Type> {
#[cfg(not(any(target_os = "illumos", target_os = "solaris")))]
#[cfg(not(any(target_os = "illumos", target_os = "solaris", target_os = "haiku")))]
match self.0.d_type {
libc::DT_FIFO => Some(Type::Fifo),
libc::DT_CHR => Some(Type::CharacterDevice),
Expand All @@ -238,8 +238,8 @@ impl Entry {
/* libc::DT_UNKNOWN | */ _ => None,
}

// illumos and Solaris systems do not have the d_type member at all:
#[cfg(any(target_os = "illumos", target_os = "solaris"))]
// illumos, Solaris, and Haiku systems do not have the d_type member at all:
#[cfg(any(target_os = "illumos", target_os = "solaris", target_os = "haiku"))]
None
}
}
209 changes: 198 additions & 11 deletions src/errno.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ cfg_if! {
unsafe fn errno_location() -> *mut c_int {
libc::___errno()
}
} else if #[cfg(any(target_os = "haiku",))] {
unsafe fn errno_location() -> *mut c_int {
libc::_errnop()
}
}
}

Expand Down Expand Up @@ -201,6 +205,7 @@ fn desc(errno: Errno) -> &'static str {
ENOMEM => "Out of memory",
EACCES => "Permission denied",
EFAULT => "Bad address",
#[cfg(not(target_os = "haiku"))]
ENOTBLK => "Block device required",
EBUSY => "Device or resource busy",
EEXIST => "File exists",
Expand Down Expand Up @@ -237,8 +242,11 @@ fn desc(errno: Errno) -> &'static str {
EPROTOTYPE => "Protocol wrong type for socket",
ENOPROTOOPT => "Protocol not available",
EPROTONOSUPPORT => "Protocol not supported",
#[cfg(not(target_os = "haiku"))]
ESOCKTNOSUPPORT => "Socket type not supported",
#[cfg(not(target_os = "haiku"))]
EPFNOSUPPORT => "Protocol family not supported",
#[cfg(not(target_os = "haiku"))]
EAFNOSUPPORT => "Address family not supported by protocol",
EADDRINUSE => "Address already in use",
EADDRNOTAVAIL => "Cannot assign requested address",
Expand All @@ -251,6 +259,7 @@ fn desc(errno: Errno) -> &'static str {
EISCONN => "Transport endpoint is already connected",
ENOTCONN => "Transport endpoint is not connected",
ESHUTDOWN => "Cannot send after transport endpoint shutdown",
#[cfg(not(target_os = "haiku"))]
ETOOMANYREFS => "Too many references: cannot splice",
ETIMEDOUT => "Connection timed out",
ECONNREFUSED => "Connection refused",
Expand Down Expand Up @@ -409,7 +418,7 @@ fn desc(errno: Errno) -> &'static str {
EBADMSG => "Trying to read unreadable message",

#[cfg(any(target_os = "linux", target_os = "android",
target_os = "fuchsia"))]
target_os = "fuchsia", target_os = "haiku"))]
EOVERFLOW => "Value too large for defined data type",

#[cfg(any(target_os = "linux", target_os = "android",
Expand Down Expand Up @@ -516,7 +525,7 @@ fn desc(errno: Errno) -> &'static str {

#[cfg(any(target_os = "linux", target_os = "android",
target_os = "illumos", target_os = "solaris",
target_os = "fuchsia"))]
target_os = "fuchsia", target_os = "haiku"))]
ECANCELED => "Operation canceled",

#[cfg(any(target_os = "linux", target_os = "android",
Expand Down Expand Up @@ -587,24 +596,26 @@ fn desc(errno: Errno) -> &'static str {

#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "netbsd", target_os = "redox"))]
target_os = "netbsd", target_os = "redox",
target_os = "haiku"))]
EILSEQ => "Illegal byte sequence",

#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd"))]
target_os = "openbsd", target_os = "netbsd",
target_os = "haiku"))]
ENOATTR => "Attribute not found",

#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "redox"))]
target_os = "redox", target_os = "haiku"))]
EBADMSG => "Bad message",

#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "redox"))]
target_os = "redox", target_os = "haiku"))]
EPROTO => "Protocol error",

#[cfg(any(target_os = "macos", target_os = "freebsd",
Expand All @@ -620,7 +631,8 @@ fn desc(errno: Errno) -> &'static str {
#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "illumos", target_os = "solaris"))]
target_os = "illumos", target_os = "solaris",
target_os = "haiku"))]
ENOTSUP => "Operation not supported",

#[cfg(any(target_os = "macos", target_os = "freebsd",
Expand All @@ -638,14 +650,14 @@ fn desc(errno: Errno) -> &'static str {
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "redox", target_os = "illumos",
target_os = "solaris"))]
target_os = "solaris", target_os = "haiku"))]
EDQUOT => "Disc quota exceeded",

#[cfg(any(target_os = "macos", target_os = "freebsd",
target_os = "dragonfly", target_os = "ios",
target_os = "openbsd", target_os = "netbsd",
target_os = "redox", target_os = "illumos",
target_os = "solaris"))]
target_os = "solaris", target_os = "haiku"))]
ESTALE => "Stale NFS file handle",

#[cfg(any(target_os = "macos", target_os = "freebsd",
Expand Down Expand Up @@ -714,15 +726,15 @@ fn desc(errno: Errno) -> &'static str {
EBADMACHO => "Malformed Macho file",

#[cfg(any(target_os = "macos", target_os = "ios",
target_os = "netbsd"))]
target_os = "netbsd", target_os = "haiku"))]
EMULTIHOP => "Reserved",

#[cfg(any(target_os = "macos", target_os = "ios",
target_os = "netbsd", target_os = "redox"))]
ENODATA => "No message available on STREAM",

#[cfg(any(target_os = "macos", target_os = "ios",
target_os = "netbsd"))]
target_os = "netbsd", target_os = "haiku"))]
ENOLINK => "Reserved",

#[cfg(any(target_os = "macos", target_os = "ios",
Expand Down Expand Up @@ -2725,3 +2737,178 @@ mod consts {
}
}
}

#[cfg(target_os = "haiku")]
mod consts {
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(i32)]
#[non_exhaustive]
pub enum Errno {
UnknownErrno = 0,
EPERM = libc::EPERM,
ENOENT = libc::ENOENT,
ESRCH = libc::ESRCH,
EINTR = libc::EINTR,
EIO = libc::EIO,
ENXIO = libc::ENXIO,
E2BIG = libc::E2BIG,
ENOEXEC = libc::ENOEXEC,
EBADF = libc::EBADF,
ECHILD = libc::ECHILD,
EDEADLK = libc::EDEADLK,
ENOMEM = libc::ENOMEM,
EACCES = libc::EACCES,
EFAULT = libc::EFAULT,
EBUSY = libc::EBUSY,
EEXIST = libc::EEXIST,
EXDEV = libc::EXDEV,
ENODEV = libc::ENODEV,
ENOTDIR = libc::ENOTDIR,
EISDIR = libc::EISDIR,
EINVAL = libc::EINVAL,
ENFILE = libc::ENFILE,
EMFILE = libc::EMFILE,
ENOTTY = libc::ENOTTY,
ETXTBSY = libc::ETXTBSY,
EFBIG = libc::EFBIG,
ENOSPC = libc::ENOSPC,
ESPIPE = libc::ESPIPE,
EROFS = libc::EROFS,
EMLINK = libc::EMLINK,
EPIPE = libc::EPIPE,
EDOM = libc::EDOM,
ERANGE = libc::ERANGE,
EAGAIN = libc::EAGAIN,
EINPROGRESS = libc::EINPROGRESS,
EALREADY = libc::EALREADY,
ENOTSOCK = libc::ENOTSOCK,
EDESTADDRREQ = libc::EDESTADDRREQ,
EMSGSIZE = libc::EMSGSIZE,
EPROTOTYPE = libc::EPROTOTYPE,
ENOPROTOOPT = libc::ENOPROTOOPT,
EPROTONOSUPPORT = libc::EPROTONOSUPPORT,
ENOTSUP = libc::ENOTSUP,
EADDRINUSE = libc::EADDRINUSE,
EADDRNOTAVAIL = libc::EADDRNOTAVAIL,
ENETDOWN = libc::ENETDOWN,
ENETUNREACH = libc::ENETUNREACH,
ENETRESET = libc::ENETRESET,
ECONNABORTED = libc::ECONNABORTED,
ECONNRESET = libc::ECONNRESET,
ENOBUFS = libc::ENOBUFS,
EISCONN = libc::EISCONN,
ENOTCONN = libc::ENOTCONN,
ESHUTDOWN = libc::ESHUTDOWN,
ETIMEDOUT = libc::ETIMEDOUT,
ECONNREFUSED = libc::ECONNREFUSED,
ELOOP = libc::ELOOP,
ENAMETOOLONG = libc::ENAMETOOLONG,
EHOSTDOWN = libc::EHOSTDOWN,
EHOSTUNREACH = libc::EHOSTUNREACH,
ENOTEMPTY = libc::ENOTEMPTY,
EDQUOT = libc::EDQUOT,
ESTALE = libc::ESTALE,
ENOLCK = libc::ENOLCK,
ENOSYS = libc::ENOSYS,
EIDRM = libc::EIDRM,
ENOMSG = libc::ENOMSG,
EOVERFLOW = libc::EOVERFLOW,
ECANCELED = libc::ECANCELED,
EILSEQ = libc::EILSEQ,
ENOATTR = libc::ENOATTR,
EBADMSG = libc::EBADMSG,
EMULTIHOP = libc::EMULTIHOP,
ENOLINK = libc::ENOLINK,
EPROTO = libc::EPROTO,
}

impl Errno {
pub const EWOULDBLOCK: Errno = Errno::EAGAIN;
pub const EDEADLOCK: Errno = Errno::EDEADLK;
pub const EOPNOTSUPP: Errno = Errno::ENOTSUP;
}

pub const fn from_i32(e: i32) -> Errno {
use self::Errno::*;

match e {
libc::EPERM => EPERM,
libc::ENOENT => ENOENT,
libc::ESRCH => ESRCH,
libc::EINTR => EINTR,
libc::EIO => EIO,
libc::ENXIO => ENXIO,
libc::E2BIG => E2BIG,
libc::ENOEXEC => ENOEXEC,
libc::EBADF => EBADF,
libc::ECHILD => ECHILD,
libc::EDEADLK => EDEADLK,
libc::ENOMEM => ENOMEM,
libc::EACCES => EACCES,
libc::EFAULT => EFAULT,
libc::EBUSY => EBUSY,
libc::EEXIST => EEXIST,
libc::EXDEV => EXDEV,
libc::ENODEV => ENODEV,
libc::ENOTDIR => ENOTDIR,
libc::EISDIR => EISDIR,
libc::EINVAL => EINVAL,
libc::ENFILE => ENFILE,
libc::EMFILE => EMFILE,
libc::ENOTTY => ENOTTY,
libc::ETXTBSY => ETXTBSY,
libc::EFBIG => EFBIG,
libc::ENOSPC => ENOSPC,
libc::ESPIPE => ESPIPE,
libc::EROFS => EROFS,
libc::EMLINK => EMLINK,
libc::EPIPE => EPIPE,
libc::EDOM => EDOM,
libc::ERANGE => ERANGE,
libc::EAGAIN => EAGAIN,
libc::EINPROGRESS => EINPROGRESS,
libc::EALREADY => EALREADY,
libc::ENOTSOCK => ENOTSOCK,
libc::EDESTADDRREQ => EDESTADDRREQ,
libc::EMSGSIZE => EMSGSIZE,
libc::EPROTOTYPE => EPROTOTYPE,
libc::ENOPROTOOPT => ENOPROTOOPT,
libc::EPROTONOSUPPORT => EPROTONOSUPPORT,
libc::ENOTSUP => ENOTSUP,
libc::EADDRINUSE => EADDRINUSE,
libc::EADDRNOTAVAIL => EADDRNOTAVAIL,
libc::ENETDOWN => ENETDOWN,
libc::ENETUNREACH => ENETUNREACH,
libc::ENETRESET => ENETRESET,
libc::ECONNABORTED => ECONNABORTED,
libc::ECONNRESET => ECONNRESET,
libc::ENOBUFS => ENOBUFS,
libc::EISCONN => EISCONN,
libc::ENOTCONN => ENOTCONN,
libc::ESHUTDOWN => ESHUTDOWN,
libc::ETIMEDOUT => ETIMEDOUT,
libc::ECONNREFUSED => ECONNREFUSED,
libc::ELOOP => ELOOP,
libc::ENAMETOOLONG => ENAMETOOLONG,
libc::EHOSTDOWN => EHOSTDOWN,
libc::EHOSTUNREACH => EHOSTUNREACH,
libc::ENOTEMPTY => ENOTEMPTY,
libc::EDQUOT => EDQUOT,
libc::ESTALE => ESTALE,
libc::ENOLCK => ENOLCK,
libc::ENOSYS => ENOSYS,
libc::EIDRM => EIDRM,
libc::ENOMSG => ENOMSG,
libc::EOVERFLOW => EOVERFLOW,
libc::ECANCELED => ECANCELED,
libc::EILSEQ => EILSEQ,
libc::ENOATTR => ENOATTR,
libc::EBADMSG => EBADMSG,
libc::EMULTIHOP => EMULTIHOP,
libc::ENOLINK => ENOLINK,
libc::EPROTO => EPROTO,
_ => UnknownErrno,
}
}
}

4 changes: 2 additions & 2 deletions src/fcntl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ libc_bitflags!(
/// Open the file in append-only mode.
O_APPEND;
/// Generate a signal when input or output becomes possible.
#[cfg(not(any(target_os = "illumos", target_os = "solaris")))]
#[cfg(not(any(target_os = "illumos", target_os = "solaris", target_os = "haiku")))]
#[cfg_attr(docsrs, doc(cfg(all())))]
O_ASYNC;
/// Closes the file descriptor once an `execve` call is made.
Expand Down Expand Up @@ -128,7 +128,7 @@ libc_bitflags!(
#[cfg_attr(docsrs, doc(cfg(all())))]
O_NOCTTY;
/// Same as `O_NONBLOCK`.
#[cfg(not(target_os = "redox"))]
#[cfg(not(any(target_os = "redox", target_os = "haiku")))]
#[cfg_attr(docsrs, doc(cfg(all())))]
O_NDELAY;
/// `open()` will fail if the given path is a symbolic link.
Expand Down
1 change: 1 addition & 0 deletions src/features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ mod os {
#[cfg(any(target_os = "macos",
target_os = "ios",
target_os = "fuchsia",
target_os = "haiku",
target_os = "solaris"))]
mod os {
/// Check if the OS supports atomic close-on-exec for sockets
Expand Down
Loading

0 comments on commit 1647189

Please sign in to comment.