summaryrefslogtreecommitdiff
path: root/src/sys/signalfd.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/sys/signalfd.rs')
-rw-r--r--src/sys/signalfd.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/sys/signalfd.rs b/src/sys/signalfd.rs
index 5425a27b..6482eeb3 100644
--- a/src/sys/signalfd.rs
+++ b/src/sys/signalfd.rs
@@ -98,10 +98,15 @@ impl SignalFd {
}
pub fn read_signal(&mut self) -> Result<Option<siginfo>> {
- let mut buffer: [u8; SIGNALFD_SIGINFO_SIZE] = unsafe { mem::uninitialized() };
-
- match unistd::read(self.0, &mut buffer) {
- Ok(SIGNALFD_SIGINFO_SIZE) => Ok(Some(unsafe { mem::transmute(buffer) })),
+ let mut buffer = mem::MaybeUninit::<[u8; SIGNALFD_SIGINFO_SIZE]>::uninit();
+
+ let res = Errno::result(unsafe {
+ libc::read(self.0,
+ buffer.as_mut_ptr() as *mut libc::c_void,
+ SIGNALFD_SIGINFO_SIZE as libc::size_t)
+ }).map(|r| r as usize);
+ match res {
+ Ok(SIGNALFD_SIGINFO_SIZE) => Ok(Some(unsafe { mem::transmute(buffer.assume_init()) })),
Ok(_) => unreachable!("partial read on signalfd"),
Err(Error::Sys(Errno::EAGAIN)) => Ok(None),
Err(error) => Err(error)