1 #[cfg(not(target_env = "musl"))] 2 use crate::Result; 3 #[cfg(not(target_env = "musl"))] 4 use crate::errno::Errno; 5 #[cfg(not(target_env = "musl"))] 6 use std::mem; 7 use crate::sys::signal::SigSet; 8 9 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] 10 pub struct UContext { 11 context: libc::ucontext_t, 12 } 13 14 impl UContext { 15 #[cfg(not(target_env = "musl"))] get() -> Result<UContext>16 pub fn get() -> Result<UContext> { 17 let mut context = mem::MaybeUninit::<libc::ucontext_t>::uninit(); 18 let res = unsafe { libc::getcontext(context.as_mut_ptr()) }; 19 Errno::result(res).map(|_| unsafe { 20 UContext { context: context.assume_init()} 21 }) 22 } 23 24 #[cfg(not(target_env = "musl"))] set(&self) -> Result<()>25 pub fn set(&self) -> Result<()> { 26 let res = unsafe { 27 libc::setcontext(&self.context as *const libc::ucontext_t) 28 }; 29 Errno::result(res).map(drop) 30 } 31 sigmask_mut(&mut self) -> &mut SigSet32 pub fn sigmask_mut(&mut self) -> &mut SigSet { 33 unsafe { 34 &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t as *mut SigSet) 35 } 36 } 37 sigmask(&self) -> &SigSet38 pub fn sigmask(&self) -> &SigSet { 39 unsafe { 40 &*(&self.context.uc_sigmask as *const libc::sigset_t as *const SigSet) 41 } 42 } 43 } 44