summaryrefslogtreecommitdiffstats
path: root/third_party/rust/nix/src/ucontext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/nix/src/ucontext.rs')
-rw-r--r--third_party/rust/nix/src/ucontext.rs47
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)
+ }
+ }
+}