From 9d2493e8bf42bf0fd53b47c08ba9f8a3a0693e56 Mon Sep 17 00:00:00 2001
From: David Henningsson <diwic@ubuntu.com>
Date: Fri, 25 Dec 2015 22:06:44 +0100
Subject: [PATCH] Add poll API

Signed-off-by: David Henningsson <diwic@ubuntu.com>
---
 libc-test/build.rs             |  1 +
 src/unix/bsd/mod.rs            |  1 +
 src/unix/mod.rs                | 16 ++++++++++++++++
 src/unix/notbsd/android/mod.rs |  1 +
 src/unix/notbsd/linux/mod.rs   |  1 +
 5 files changed, 20 insertions(+)

diff --git a/libc-test/build.rs b/libc-test/build.rs
index f94f7051..0e6e550c 100644
--- a/libc-test/build.rs
+++ b/libc-test/build.rs
@@ -88,6 +88,7 @@ fn main() {
         cfg.header("sys/uio.h");
         cfg.header("sched.h");
         cfg.header("termios.h");
+        cfg.header("poll.h");
     }
 
     if android {
diff --git a/src/unix/bsd/mod.rs b/src/unix/bsd/mod.rs
index 144240d4..69208862 100644
--- a/src/unix/bsd/mod.rs
+++ b/src/unix/bsd/mod.rs
@@ -6,6 +6,7 @@ pub type blkcnt_t = i64;
 pub type socklen_t = u32;
 pub type sa_family_t = u8;
 pub type pthread_t = ::uintptr_t;
+pub type nfds_t = ::c_uint;
 
 s! {
     pub struct sockaddr {
diff --git a/src/unix/mod.rs b/src/unix/mod.rs
index 4060b4ee..6a05d82d 100644
--- a/src/unix/mod.rs
+++ b/src/unix/mod.rs
@@ -91,6 +91,12 @@ s! {
         pub iov_base: *mut ::c_void,
         pub iov_len: ::size_t,
     }
+
+    pub struct pollfd {
+        pub fd: ::c_int,
+        pub events: ::c_short,
+        pub revents: ::c_short,
+    }
 }
 
 pub const WNOHANG: ::c_int = 1;
@@ -117,6 +123,13 @@ pub const S_ISUID: ::c_int = 0x800;
 pub const S_ISGID: ::c_int = 0x400;
 pub const S_ISVTX: ::c_int = 0x200;
 
+pub const POLLIN: ::c_short = 0x1;
+pub const POLLPRI: ::c_short = 0x2;
+pub const POLLOUT: ::c_short = 0x4;
+pub const POLLERR: ::c_short = 0x8;
+pub const POLLHUP: ::c_short = 0x10;
+pub const POLLNVAL: ::c_short = 0x20;
+
 cfg_if! {
     if #[cfg(feature = "default")] {
         // cargo build, don't pull in anything extra as the libstd  dep
@@ -548,6 +561,9 @@ extern {
     #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
                link_name = "recvmsg$UNIX2003")]
     pub fn recvmsg(fd: ::c_int, msg: *mut msghdr, flags: ::c_int) -> ::ssize_t;
+    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
+               link_name = "poll$UNIX2003")]
+    pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int;
 }
 
 // TODO: get rid of this #[cfg(not(...))]
diff --git a/src/unix/notbsd/android/mod.rs b/src/unix/notbsd/android/mod.rs
index f00cebd0..032d3de3 100644
--- a/src/unix/notbsd/android/mod.rs
+++ b/src/unix/notbsd/android/mod.rs
@@ -22,6 +22,7 @@ pub type sigset_t = c_ulong;
 pub type time64_t = i64;
 pub type fsfilcnt_t = ::c_ulong;
 pub type fsblkcnt_t = ::c_ulong;
+pub type nfds_t = ::c_uint;
 
 s! {
     pub struct stat {
diff --git a/src/unix/notbsd/linux/mod.rs b/src/unix/notbsd/linux/mod.rs
index 512d5adc..b7de02b9 100644
--- a/src/unix/notbsd/linux/mod.rs
+++ b/src/unix/notbsd/linux/mod.rs
@@ -14,6 +14,7 @@ pub type fsfilcnt_t = ::c_ulong;
 pub type key_t = ::c_int;
 pub type shmatt_t = ::c_ulong;
 pub type mqd_t = ::c_int;
+pub type nfds_t = ::c_ulong;
 
 pub enum fpos64_t {} // TODO: fill this out with a struct
 
-- 
GitLab