nix/
ucontext.rs

1#[cfg(not(target_env = "musl"))]
2use crate::Result;
3#[cfg(not(target_env = "musl"))]
4use crate::errno::Errno;
5#[cfg(not(target_env = "musl"))]
6use std::mem;
7use crate::sys::signal::SigSet;
8
9#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
10pub struct UContext {
11    context: libc::ucontext_t,
12}
13
14impl UContext {
15    #[cfg(not(target_env = "musl"))]
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"))]
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
32    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
38    pub fn sigmask(&self) -> &SigSet {
39        unsafe {
40            &*(&self.context.uc_sigmask as *const libc::sigset_t as *const SigSet)
41        }
42    }
43}