summaryrefslogtreecommitdiff
path: root/src/sys/event.rs
diff options
context:
space:
mode:
authorSteve Lau <stevelauc@outlook.com>2022-12-11 12:19:58 +0800
committerSteve Lau <stevelauc@outlook.com>2022-12-11 12:19:58 +0800
commit27d1844952386a52f190935f8fde1cc967f1e01f (patch)
treeee9b3ce6afcad38bf99ef8913e036ef6cbaa1f26 /src/sys/event.rs
parentdf5877c46a2b2d1aad6069b8ab8c9d1961a1650b (diff)
downloadnix-27d1844952386a52f190935f8fde1cc967f1e01f.zip
feat: I/O safety for 'sys/memfd' & 'sys/event' & 'sys/eventfd'
Diffstat (limited to 'src/sys/event.rs')
-rw-r--r--src/sys/event.rs16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/sys/event.rs b/src/sys/event.rs
index d8ad628e..f21ba173 100644
--- a/src/sys/event.rs
+++ b/src/sys/event.rs
@@ -8,7 +8,7 @@ use libc::{c_int, c_long, intptr_t, time_t, timespec, uintptr_t};
use libc::{c_long, intptr_t, size_t, time_t, timespec, uintptr_t};
use std::convert::TryInto;
use std::mem;
-use std::os::unix::io::RawFd;
+use std::os::unix::io::{AsFd, AsRawFd, FromRawFd, OwnedFd};
use std::ptr;
// Redefine kevent in terms of programmer-friendly enums and bitfields.
@@ -207,10 +207,10 @@ libc_bitflags!(
}
);
-pub fn kqueue() -> Result<RawFd> {
+pub fn kqueue() -> Result<OwnedFd> {
let res = unsafe { libc::kqueue() };
- Errno::result(res)
+ Errno::result(res).map(|fd| unsafe { OwnedFd::from_raw_fd(fd) })
}
// KEvent can't derive Send because on some operating systems, udata is defined
@@ -267,8 +267,8 @@ impl KEvent {
}
}
-pub fn kevent(
- kq: RawFd,
+pub fn kevent<Fd: AsFd>(
+ kq: Fd,
changelist: &[KEvent],
eventlist: &mut [KEvent],
timeout_ms: usize,
@@ -293,15 +293,15 @@ type type_of_nchanges = c_int;
#[cfg(target_os = "netbsd")]
type type_of_nchanges = size_t;
-pub fn kevent_ts(
- kq: RawFd,
+pub fn kevent_ts<Fd: AsFd>(
+ kq: Fd,
changelist: &[KEvent],
eventlist: &mut [KEvent],
timeout_opt: Option<timespec>,
) -> Result<usize> {
let res = unsafe {
libc::kevent(
- kq,
+ kq.as_fd().as_raw_fd(),
changelist.as_ptr() as *const libc::kevent,
changelist.len() as type_of_nchanges,
eventlist.as_mut_ptr() as *mut libc::kevent,