diff options
Diffstat (limited to 'third_party/rust/nix/src/ucontext.rs')
-rw-r--r-- | third_party/rust/nix/src/ucontext.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/third_party/rust/nix/src/ucontext.rs b/third_party/rust/nix/src/ucontext.rs new file mode 100644 index 0000000000..b2a39f7699 --- /dev/null +++ b/third_party/rust/nix/src/ucontext.rs @@ -0,0 +1,47 @@ +#[cfg(not(target_env = "musl"))] +use crate::errno::Errno; +use crate::sys::signal::SigSet; +#[cfg(not(target_env = "musl"))] +use crate::Result; +#[cfg(not(target_env = "musl"))] +use std::mem; + +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub struct UContext { + context: libc::ucontext_t, +} + +impl UContext { + #[cfg(not(target_env = "musl"))] + pub fn get() -> Result<UContext> { + let mut context = mem::MaybeUninit::<libc::ucontext_t>::uninit(); + let res = unsafe { libc::getcontext(context.as_mut_ptr()) }; + Errno::result(res).map(|_| unsafe { + UContext { + context: context.assume_init(), + } + }) + } + + #[cfg(not(target_env = "musl"))] + pub fn set(&self) -> Result<()> { + let res = unsafe { + libc::setcontext(&self.context as *const libc::ucontext_t) + }; + Errno::result(res).map(drop) + } + + pub fn sigmask_mut(&mut self) -> &mut SigSet { + unsafe { + &mut *(&mut self.context.uc_sigmask as *mut libc::sigset_t + as *mut SigSet) + } + } + + pub fn sigmask(&self) -> &SigSet { + unsafe { + &*(&self.context.uc_sigmask as *const libc::sigset_t + as *const SigSet) + } + } +} |