Skip to content

Commit

Permalink
Add Solaris operating system support
Browse files Browse the repository at this point in the history
  • Loading branch information
psumbera committed Sep 4, 2023
1 parent 9f21ce1 commit bc54006
Show file tree
Hide file tree
Showing 11 changed files with 56 additions and 28 deletions.
8 changes: 4 additions & 4 deletions src/poll.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#[cfg(all(unix, not(mio_unsupported_force_poll_poll)))]
#[cfg(all(unix, not(any(target_os = "solaris", mio_unsupported_force_poll_poll))))]
use std::os::unix::io::{AsRawFd, RawFd};
#[cfg(all(debug_assertions, not(target_os = "wasi")))]
use std::sync::atomic::{AtomicBool, Ordering};
Expand Down Expand Up @@ -423,7 +423,7 @@ impl Poll {
}
}

#[cfg(all(unix, not(mio_unsupported_force_poll_poll)))]
#[cfg(all(unix, not(any(target_os = "solaris", mio_unsupported_force_poll_poll))))]
impl AsRawFd for Poll {
fn as_raw_fd(&self) -> RawFd {
self.registry.as_raw_fd()
Expand Down Expand Up @@ -710,7 +710,7 @@ impl fmt::Debug for Registry {
}
}

#[cfg(all(unix, not(mio_unsupported_force_poll_poll)))]
#[cfg(all(unix, not(any(target_os = "solaris", mio_unsupported_force_poll_poll))))]
impl AsRawFd for Registry {
fn as_raw_fd(&self) -> RawFd {
self.selector.as_raw_fd()
Expand All @@ -720,7 +720,7 @@ impl AsRawFd for Registry {
cfg_os_poll! {
#[cfg(all(
unix,
not(mio_unsupported_force_poll_poll)
not(any(target_os = "solaris", mio_unsupported_force_poll_poll))
))]
#[test]
pub fn as_raw_fd() {
Expand Down
7 changes: 4 additions & 3 deletions src/sys/unix/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ cfg_os_poll! {

cfg_io_source! {
// Both `kqueue` and `epoll` don't need to hold any user space state.
#[cfg(not(mio_unsupported_force_poll_poll))]
#[cfg(not(any(target_os = "solaris", mio_unsupported_force_poll_poll)))]
mod stateless_io_source {
use std::io;
use std::os::unix::io::RawFd;
Expand Down Expand Up @@ -87,10 +87,10 @@ cfg_os_poll! {
}
}

#[cfg(not(mio_unsupported_force_poll_poll))]
#[cfg(not(any(target_os = "solaris", mio_unsupported_force_poll_poll)))]
pub(crate) use self::stateless_io_source::IoSourceState;

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
pub(crate) use self::selector::IoSourceState;
}

Expand All @@ -105,6 +105,7 @@ cfg_os_poll! {
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
))]
pub(crate) mod pipe;
}
Expand Down
3 changes: 2 additions & 1 deletion src/sys/unix/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub(crate) fn new_socket(domain: libc::c_int, socket_type: libc::c_int) -> io::R
target_os = "linux",
target_os = "netbsd",
target_os = "openbsd",
target_os = "solaris",
))]
let socket_type = socket_type | libc::SOCK_NONBLOCK | libc::SOCK_CLOEXEC;

Expand Down Expand Up @@ -139,7 +140,7 @@ pub(crate) fn socket_addr(addr: &SocketAddr) -> (SocketAddrCRepr, libc::socklen_
target_os = "espidf",
))]
sin6_len: 0,
#[cfg(target_os = "illumos")]
#[cfg(any(target_os = "illumos", target_os = "solaris"))]
__sin6_src_id: 0,
};

Expand Down
6 changes: 4 additions & 2 deletions src/sys/unix/pipe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub(crate) fn new_raw() -> io::Result<[RawFd; 2]> {
target_os = "openbsd",
target_os = "illumos",
target_os = "redox",
target_os = "solaris",
))]
unsafe {
if libc::pipe2(fds.as_mut_ptr(), libc::O_CLOEXEC | libc::O_NONBLOCK) != 0 {
Expand Down Expand Up @@ -64,6 +65,7 @@ pub(crate) fn new_raw() -> io::Result<[RawFd; 2]> {
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
target_os = "tvos",
target_os = "watchos",
target_os = "espidf",
Expand Down Expand Up @@ -556,7 +558,7 @@ impl IntoRawFd for Receiver {
}
}

#[cfg(not(target_os = "illumos"))]
#[cfg(not(any(target_os = "illumos", target_os = "solaris")))]
fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> {
let value = nonblocking as libc::c_int;
if unsafe { libc::ioctl(fd, libc::FIONBIO, &value) } == -1 {
Expand All @@ -566,7 +568,7 @@ fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> {
}
}

#[cfg(target_os = "illumos")]
#[cfg(any(target_os = "illumos", target_os = "solaris"))]
fn set_nonblocking(fd: RawFd, nonblocking: bool) -> io::Result<()> {
let flags = unsafe { libc::fcntl(fd, libc::F_GETFL) };
if flags < 0 {
Expand Down
12 changes: 6 additions & 6 deletions src/sys/unix/selector/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
any(
target_os = "android",
target_os = "illumos",
Expand All @@ -10,7 +10,7 @@
mod epoll;

#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
any(
target_os = "android",
target_os = "illumos",
Expand All @@ -20,14 +20,14 @@ mod epoll;
))]
pub(crate) use self::epoll::{event, Event, Events, Selector};

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
mod poll;

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
pub(crate) use self::poll::{event, Event, Events, IoSourceState, Selector};

#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
any(
target_os = "dragonfly",
target_os = "freebsd",
Expand All @@ -42,7 +42,7 @@ pub(crate) use self::poll::{event, Event, Events, IoSourceState, Selector};
mod kqueue;

#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
any(
target_os = "dragonfly",
target_os = "freebsd",
Expand Down
1 change: 1 addition & 0 deletions src/sys/unix/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ pub(crate) fn accept(listener: &net::TcpListener) -> io::Result<(net::TcpStream,
target_os = "linux",
target_os = "netbsd",
target_os = "openbsd",
target_os = "solaris",
))]
let stream = {
syscall!(accept4(
Expand Down
21 changes: 12 additions & 9 deletions src/sys/unix/waker.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
not(all(
not(mio_unsupported_force_waker_pipe),
any(
Expand All @@ -13,7 +13,7 @@
))]
mod fdbased {
#[cfg(all(
not(mio_unsupported_force_waker_pipe),
not(any(target_os = "solaris", mio_unsupported_force_waker_pipe)),
any(target_os = "linux", target_os = "android"),
))]
use crate::sys::unix::waker::eventfd::WakerInternal;
Expand All @@ -25,6 +25,7 @@ mod fdbased {
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
))]
use crate::sys::unix::waker::pipe::WakerInternal;
use crate::sys::Selector;
Expand All @@ -51,7 +52,7 @@ mod fdbased {
}

#[cfg(all(
not(mio_unsupported_force_poll_poll),
not(any(target_os = "solaris", mio_unsupported_force_poll_poll)),
not(all(
not(mio_unsupported_force_waker_pipe),
any(
Expand Down Expand Up @@ -112,7 +113,7 @@ mod eventfd {
}
}

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
pub fn ack_and_reset(&self) {
let _ = self.reset();
}
Expand All @@ -138,7 +139,7 @@ mod eventfd {
}

#[cfg(all(
mio_unsupported_force_poll_poll,
any(target_os = "solaris", mio_unsupported_force_poll_poll),
not(mio_unsupported_force_waker_pipe),
any(target_os = "linux", target_os = "android", target_os = "espidf")
))]
Expand Down Expand Up @@ -205,6 +206,7 @@ pub use self::kqueue::Waker;
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
))]
mod pipe {
use crate::sys::unix::pipe;
Expand Down Expand Up @@ -250,7 +252,7 @@ mod pipe {
}
}

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
pub fn ack_and_reset(&self) {
self.empty();
}
Expand All @@ -276,7 +278,7 @@ mod pipe {
}

#[cfg(all(
mio_unsupported_force_poll_poll,
any(target_os = "solaris", mio_unsupported_force_poll_poll),
any(
mio_unsupported_force_waker_pipe,
target_os = "aix",
Expand All @@ -285,11 +287,12 @@ mod pipe {
target_os = "netbsd",
target_os = "openbsd",
target_os = "redox",
target_os = "solaris",
)
))]
pub(crate) use self::pipe::WakerInternal;

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
mod poll {
use crate::sys::Selector;
use crate::Token;
Expand All @@ -315,5 +318,5 @@ mod poll {
}
}

#[cfg(mio_unsupported_force_poll_poll)]
#[cfg(any(target_os = "solaris", mio_unsupported_force_poll_poll))]
pub use self::poll::Waker;
9 changes: 8 additions & 1 deletion tests/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -572,6 +572,8 @@ fn connect_error() {
for event in &events {
if event.token() == Token(0) {
assert!(event.is_writable());
// Solaris poll(2) says POLLHUP and POLLOUT are mutually exclusive.
#[cfg(not(target_os = "solaris"))]
assert!(event.is_write_closed());
break 'outer;
}
Expand Down Expand Up @@ -698,7 +700,12 @@ fn write_shutdown() {
// Now, shutdown the write half of the socket.
socket.shutdown(Shutdown::Write).unwrap();

wait!(poll, is_readable, true);
// POLLRDHUP isn't supported on Solaris
if cfg!(target_os = "solaris") {
wait!(poll, is_readable, false);
} else {
wait!(poll, is_readable, true);
}
}

struct MyHandler {
Expand Down
12 changes: 10 additions & 2 deletions tests/tcp_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,7 @@ fn no_events_after_deregister() {
windows,
ignore = "fails on Windows; client read closed events are not triggered"
)]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn tcp_shutdown_client_read_close_event() {
let (mut poll, mut events) = init_with_poll();
let barrier = Arc::new(Barrier::new(2));
Expand Down Expand Up @@ -547,7 +548,12 @@ fn tcp_shutdown_client_read_close_event() {
#[test]
#[cfg_attr(windows, ignore = "fails; client write_closed events are not found")]
#[cfg_attr(
any(target_os = "android", target_os = "illumos", target_os = "linux"),
any(
target_os = "android",
target_os = "illumos",
target_os = "linux",
target_os = "solaris"
),
ignore = "fails; client write_closed events are not found"
)]
fn tcp_shutdown_client_write_close_event() {
Expand Down Expand Up @@ -581,6 +587,7 @@ fn tcp_shutdown_client_write_close_event() {
}

#[test]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn tcp_shutdown_server_write_close_event() {
let (mut poll, mut events) = init_with_poll();
let barrier = Arc::new(Barrier::new(2));
Expand Down Expand Up @@ -611,6 +618,7 @@ fn tcp_shutdown_server_write_close_event() {
}

#[test]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn tcp_reset_close_event() {
let (mut poll, mut events) = init_with_poll();

Expand Down Expand Up @@ -659,7 +667,7 @@ fn tcp_reset_close_event() {
ignore = "fails on Windows; client close events are not found"
)]
#[cfg_attr(
any(target_os = "illumos"),
any(target_os = "illumos", target_os = "solaris"),
ignore = "fails; client write_closed events are not found"
)]
fn tcp_shutdown_client_both_close_event() {
Expand Down
1 change: 1 addition & 0 deletions tests/unix_datagram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ fn unix_datagram_pair() {
}

#[test]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn unix_datagram_shutdown() {
let (mut poll, mut events) = init_with_poll();
let path1 = temp_file("unix_datagram_shutdown1");
Expand Down
4 changes: 4 additions & 0 deletions tests/unix_stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ fn unix_stream_peer_addr() {
}

#[test]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn unix_stream_shutdown_read() {
let (mut poll, mut events) = init_with_poll();
let (handle, remote_addr) = new_echo_listener(1, "unix_stream_shutdown_read");
Expand Down Expand Up @@ -326,6 +327,8 @@ fn unix_stream_shutdown_both() {
);

stream.shutdown(Shutdown::Both).unwrap();
// Solaris never returns POLLHUP for sockets.
#[cfg(not(target_os = "solaris"))]
expect_events(
&mut poll,
&mut events,
Expand Down Expand Up @@ -361,6 +364,7 @@ fn unix_stream_shutdown_both() {
}

#[test]
#[cfg_attr(target_os = "solaris", ignore = "POLLRDHUP isn't supported on Solaris")]
fn unix_stream_shutdown_listener_write() {
let (mut poll, mut events) = init_with_poll();
let barrier = Arc::new(Barrier::new(2));
Expand Down

0 comments on commit bc54006

Please sign in to comment.