blob: a5b8cc75cb3303055cd4d5c64dfb2396fa76c851 [file] [log] [blame]
Andrew Walbran12f61402020-10-14 11:10:53 +01001use libc;
2#[cfg(not(target_env = "musl"))]
3use crate::Result;
4#[cfg(not(target_env = "musl"))]
5use crate::errno::Errno;
6#[cfg(not(target_env = "musl"))]
7use std::mem;
8use crate::sys::signal::SigSet;
9
10#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
11pub struct UContext {
12 context: libc::ucontext_t,
13}
14
15impl 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}