From 887d89c2bb4465441d3704347a233598f25d718c Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jeremy@system76.com>
Date: Thu, 21 Feb 2019 20:40:03 -0700
Subject: [PATCH] Add epoll (WIP)

---
 src/header/fcntl/linux.rs          |  2 +
 src/header/fcntl/mod.rs            |  2 -
 src/header/fcntl/redox.rs          |  2 +
 src/header/mod.rs                  |  1 +
 src/header/sys_epoll/cbindgen.toml | 11 ++++++
 src/header/sys_epoll/linux.rs      |  3 ++
 src/header/sys_epoll/mod.rs        | 62 ++++++++++++++++++++++++++++++
 src/header/sys_epoll/redox.rs      |  3 ++
 8 files changed, 84 insertions(+), 2 deletions(-)
 create mode 100644 src/header/sys_epoll/cbindgen.toml
 create mode 100644 src/header/sys_epoll/linux.rs
 create mode 100644 src/header/sys_epoll/mod.rs
 create mode 100644 src/header/sys_epoll/redox.rs

diff --git a/src/header/fcntl/linux.rs b/src/header/fcntl/linux.rs
index 9e3a7a516..ae1bcc97e 100644
--- a/src/header/fcntl/linux.rs
+++ b/src/header/fcntl/linux.rs
@@ -13,3 +13,5 @@ pub const O_DIRECTORY: c_int = 0x1_0000;
 pub const O_NOFOLLOW: c_int = 0x2_0000;
 pub const O_CLOEXEC: c_int = 0x8_0000;
 pub const O_PATH: c_int = 0x20_0000;
+
+pub const FD_CLOEXEC: c_int = 0x8_0000;
diff --git a/src/header/fcntl/mod.rs b/src/header/fcntl/mod.rs
index c2178c4eb..1946c6beb 100644
--- a/src/header/fcntl/mod.rs
+++ b/src/header/fcntl/mod.rs
@@ -23,8 +23,6 @@ pub const F_GETLK: c_int = 5;
 pub const F_SETLK: c_int = 6;
 pub const F_SETLKW: c_int = 7;
 
-pub const FD_CLOEXEC: c_int = 0x0100_0000;
-
 pub const F_RDLCK: c_int = 0;
 pub const F_WRLCK: c_int = 1;
 pub const F_UNLCK: c_int = 2;
diff --git a/src/header/fcntl/redox.rs b/src/header/fcntl/redox.rs
index ddc189baa..b3a397b5d 100644
--- a/src/header/fcntl/redox.rs
+++ b/src/header/fcntl/redox.rs
@@ -18,3 +18,5 @@ pub const O_DIRECTORY: c_int = 0x1000_0000;
 pub const O_PATH: c_int = 0x2000_0000;
 pub const O_SYMLINK: c_int = 0x4000_0000;
 pub const O_NOFOLLOW: c_int = 0x8000_0000;
+
+pub const FD_CLOEXEC: c_int = 0x0100_0000;
diff --git a/src/header/mod.rs b/src/header/mod.rs
index 901238bfa..6b5403423 100644
--- a/src/header/mod.rs
+++ b/src/header/mod.rs
@@ -30,6 +30,7 @@ pub mod stdio;
 pub mod stdlib;
 pub mod string;
 pub mod strings;
+pub mod sys_epoll;
 pub mod sys_file;
 pub mod sys_ioctl;
 pub mod sys_mman;
diff --git a/src/header/sys_epoll/cbindgen.toml b/src/header/sys_epoll/cbindgen.toml
new file mode 100644
index 000000000..e162dbb4f
--- /dev/null
+++ b/src/header/sys_epoll/cbindgen.toml
@@ -0,0 +1,11 @@
+sys_includes = []
+include_guard = "_SYS_EPOLL_H"
+language = "C"
+style = "Tag"
+
+[defines]
+"target_os=linux" = "__linux__"
+"target_os=redox" = "__redox__"
+
+[enum]
+prefix_with_name = true
diff --git a/src/header/sys_epoll/linux.rs b/src/header/sys_epoll/linux.rs
new file mode 100644
index 000000000..af4972e70
--- /dev/null
+++ b/src/header/sys_epoll/linux.rs
@@ -0,0 +1,3 @@
+use platform::types::*;
+
+pub const EPOLL_CLOEXEC: c_int = 0x8_0000;
diff --git a/src/header/sys_epoll/mod.rs b/src/header/sys_epoll/mod.rs
new file mode 100644
index 000000000..c5ef76ef7
--- /dev/null
+++ b/src/header/sys_epoll/mod.rs
@@ -0,0 +1,62 @@
+//! sys/epoll.h implementation for Redox, following http://man7.org/linux/man-pages/man7/epoll.7.html
+
+use core::ptr;
+
+use header::signal::sigset_t;
+use platform::types::*;
+
+pub use self::sys::*;
+
+#[cfg(target_os = "linux")]
+#[path = "linux.rs"]
+pub mod sys;
+
+#[cfg(target_os = "redox")]
+#[path = "redox.rs"]
+pub mod sys;
+
+pub const EPOLL_CTL_ADD: c_int = 1;
+pub const EPOLL_CTL_DEL: c_int = 2;
+pub const EPOLL_CTL_MOD: c_int = 3;
+
+#[repr(C)]
+pub union epoll_data {
+    ptr: *mut c_void,
+    fd: c_int,
+    u32: u32,
+    u64: u64,
+}
+
+#[repr(C)]
+pub struct epoll_event {
+    events: u32,
+    data: epoll_data,
+}
+
+#[no_mangle]
+pub extern "C" fn epoll_create(_size: c_int) -> c_int {
+    epoll_create1(0)
+}
+
+#[no_mangle]
+pub extern "C" fn epoll_create1(flags: c_int) -> c_int {
+    unimplemented!()
+    //Sys::epoll_create1(flags)
+}
+
+#[no_mangle]
+pub extern "C" fn epoll_ctl(epfd: c_int, op: c_int, fd: c_int, event: *mut epoll_event) -> c_int {
+    unimplemented!()
+    //Sys::epoll_ctl(epfd, op, fd, event)
+}
+
+#[no_mangle]
+pub extern "C" fn epoll_wait(epfd: c_int, events: *mut epoll_event, maxevents: c_int, timeout: c_int) -> c_int {
+    epoll_pwait(epfd, events, maxevents, timeout, ptr::null())
+}
+
+#[no_mangle]
+pub extern "C" fn epoll_pwait(epfd: c_int, events: *mut epoll_event, maxevents: c_int, timeout: c_int, sigmask: *const sigset_t) -> c_int {
+    unimplemented!()
+    //Sys::epoll_pwait(epfd, events, maxevents, timeout, sigmask)
+}
diff --git a/src/header/sys_epoll/redox.rs b/src/header/sys_epoll/redox.rs
new file mode 100644
index 000000000..870f7f9d9
--- /dev/null
+++ b/src/header/sys_epoll/redox.rs
@@ -0,0 +1,3 @@
+use platform::types::*;
+
+pub const EPOLL_CLOEXEC: c_int = 0x0100_0000;
-- 
GitLab