aboutsummaryrefslogtreecommitdiff
path: root/src/sys/unix/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/unix/mod.rs')
-rw-r--r--src/sys/unix/mod.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/sys/unix/mod.rs b/src/sys/unix/mod.rs
new file mode 100644
index 0000000..96d7f4d
--- /dev/null
+++ b/src/sys/unix/mod.rs
@@ -0,0 +1,74 @@
+/// Helper macro to execute a system call that returns an `io::Result`.
+//
+// Macro must be defined before any modules that uses them.
+#[allow(unused_macros)]
+macro_rules! syscall {
+ ($fn: ident ( $($arg: expr),* $(,)* ) ) => {{
+ let res = unsafe { libc::$fn($($arg, )*) };
+ if res == -1 {
+ Err(std::io::Error::last_os_error())
+ } else {
+ Ok(res)
+ }
+ }};
+}
+
+cfg_os_poll! {
+ mod net;
+
+ mod selector;
+ pub(crate) use self::selector::{event, Event, Events, Selector};
+
+ mod sourcefd;
+ pub use self::sourcefd::SourceFd;
+
+ mod waker;
+ pub(crate) use self::waker::Waker;
+
+ cfg_tcp! {
+ pub(crate) mod tcp;
+ }
+
+ cfg_udp! {
+ pub(crate) mod udp;
+ }
+
+ cfg_uds! {
+ pub(crate) mod uds;
+ pub use self::uds::SocketAddr;
+ }
+
+ cfg_net! {
+ use std::io;
+
+ // Both `kqueue` and `epoll` don't need to hold any user space state.
+ pub(crate) struct IoSourceState;
+
+ impl IoSourceState {
+ pub fn new() -> IoSourceState {
+ IoSourceState
+ }
+
+ pub fn do_io<T, F, R>(&self, f: F, io: &T) -> io::Result<R>
+ where
+ F: FnOnce(&T) -> io::Result<R>,
+ {
+ // We don't hold state, so we can just call the function and
+ // return.
+ f(io)
+ }
+ }
+ }
+}
+
+cfg_not_os_poll! {
+ cfg_uds! {
+ mod uds;
+ pub use self::uds::SocketAddr;
+ }
+
+ cfg_any_os_util! {
+ mod sourcefd;
+ pub use self::sourcefd::SourceFd;
+ }
+}