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