use nix::libc::user_regs_struct;
use nix::sys::ptrace;
use nix::sys::signal::Signal;
use nix::sys::wait::{WaitPidFlag, WaitStatus, waitpid};
use nix::unistd::Pid;
use std::io;
pub fn traceme() -> io::Result<()> {
ptrace::traceme().map_err(nix_to_io)
}
pub fn attach(pid: Pid) -> io::Result<()> {
ptrace::attach(pid).map_err(nix_to_io)
}
pub fn detach(pid: Pid, sig: Option<Signal>) -> io::Result<()> {
ptrace::detach(pid, sig).map_err(nix_to_io)
}
pub fn syscall_continue(pid: Pid, sig: Option<Signal>) -> io::Result<()> {
ptrace::syscall(pid, sig).map_err(nix_to_io)
}
pub fn get_registers(pid: Pid) -> io::Result<user_regs_struct> {
ptrace::getregs(pid).map_err(nix_to_io)
}
pub fn set_options(pid: Pid, options: ptrace::Options) -> io::Result<()> {
ptrace::setoptions(pid, options).map_err(nix_to_io)
}
pub fn wait(pid: Pid) -> io::Result<WaitStatus> {
waitpid(pid, None).map_err(nix_to_io)
}
pub fn wait_any() -> io::Result<WaitStatus> {
waitpid(None, Some(WaitPidFlag::__WALL)).map_err(nix_to_io)
}
pub fn get_event(pid: Pid) -> io::Result<i64> {
ptrace::getevent(pid).map_err(nix_to_io).map(|v| v as i64)
}
pub fn read_word(pid: Pid, addr: u64) -> io::Result<i64> {
ptrace::read(pid, addr as *mut _).map_err(nix_to_io)
}
fn nix_to_io(e: nix::Error) -> io::Error {
io::Error::from_raw_os_error(e as i32)
}