stracers-core 0.1.0

Library for tracing system calls and signals
Documentation
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)
}

/// Wait for any traced child. Returns the status of whichever child stopped.
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)
}