summaryrefslogtreecommitdiff
path: root/src/poll.rs
diff options
context:
space:
mode:
authorUtkarsh Kukreti <utkarshkukreti@gmail.com>2015-12-30 20:30:54 +0530
committerKamal Marhubi <kamal@marhubi.com>2016-01-25 17:50:39 -0500
commitcec5c6157b37c924b8a0139d5439fbc87d7becce (patch)
tree9d79663e29c1502ce4d514fa5e44c8c399365bc1 /src/poll.rs
parent5700e39180c30ac78598aed4ed94d3111658ec5e (diff)
downloadnix-cec5c6157b37c924b8a0139d5439fbc87d7becce.zip
Add everything from poll.h.
Diffstat (limited to 'src/poll.rs')
-rw-r--r--src/poll.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/poll.rs b/src/poll.rs
new file mode 100644
index 00000000..d43e358b
--- /dev/null
+++ b/src/poll.rs
@@ -0,0 +1,80 @@
+use libc::c_int;
+use {Error, Result};
+use errno::Errno;
+
+pub use self::ffi::PollFd;
+pub use self::ffi::consts::*;
+
+mod ffi {
+ use libc::c_int;
+ pub use self::consts::*;
+
+ #[derive(Clone, Copy, Debug)]
+ #[repr(C)]
+ pub struct PollFd {
+ pub fd: c_int,
+ pub events: EventFlags,
+ pub revents: EventFlags
+ }
+
+ #[cfg(target_os = "linux")]
+ pub mod consts {
+ use libc::{c_short, c_ulong};
+
+ bitflags! {
+ flags EventFlags: c_short {
+ const POLLIN = 0x001,
+ const POLLPRI = 0x002,
+ const POLLOUT = 0x004,
+ const POLLRDNORM = 0x040,
+ const POLLWRNORM = 0x100,
+ const POLLRDBAND = 0x080,
+ const POLLWRBAND = 0x200,
+ const POLLERR = 0x008,
+ const POLLHUP = 0x010,
+ const POLLNVAL = 0x020,
+ }
+ }
+
+ pub type nfds_t = c_ulong;
+ }
+
+ #[cfg(target_os = "macos")]
+ pub mod consts {
+ use libc::{c_short, c_uint};
+
+ bitflags! {
+ flags EventFlags: c_short {
+ const POLLIN = 0x0001,
+ const POLLPRI = 0x0002,
+ const POLLOUT = 0x0004,
+ const POLLRDNORM = 0x0040,
+ const POLLWRNORM = 0x0004,
+ const POLLRDBAND = 0x0080,
+ const POLLWRBAND = 0x0100,
+ const POLLERR = 0x0008,
+ const POLLHUP = 0x0010,
+ const POLLNVAL = 0x0020,
+ }
+ }
+
+ pub type nfds_t = c_uint;
+ }
+
+ #[allow(improper_ctypes)]
+ extern {
+ pub fn poll(fds: *mut PollFd, nfds: nfds_t, timeout: c_int) -> c_int;
+ }
+}
+
+pub fn poll(fds: &mut [PollFd], timeout: c_int) -> Result<c_int> {
+ let res = unsafe {
+ ffi::poll(fds.as_mut_ptr(), fds.len() as ffi::nfds_t, timeout)
+ };
+
+ if res < 0 {
+ return Err(Error::Sys(Errno::last()));
+ }
+
+ Ok(res)
+}