use nix::sys::ptrace::traceme;
use std::sync::atomic::{AtomicBool, Ordering};
thread_local!(pub static TRACEME_DONE: AtomicBool = const { AtomicBool::new(false) });
#[inline(always)]
pub fn ptraceme_or_die() {
let res = traceme();
TRACEME_DONE.with(|traceme_done| {
if !traceme_done.load(Ordering::SeqCst) {
match res {
Ok(_) => traceme_done.store(true, Ordering::SeqCst),
Err(_) => the_end(),
}
} else if res.is_ok() {
the_end()
}
});
}
#[inline(always)]
fn the_end() {
panic!("ptracer detected!");
}