Switch PalPtrace to Rusty error handling.
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
//! ptrace compatibility layer for Redox OS
|
||||
|
||||
use crate::platform::{types::*, PalPtrace, Sys};
|
||||
use crate::{
|
||||
error::ResultExt,
|
||||
platform::{types::*, PalPtrace, Sys},
|
||||
};
|
||||
use core::ffi::VaList;
|
||||
|
||||
pub const PTRACE_TRACEME: c_int = 0;
|
||||
@@ -25,5 +28,5 @@ pub const PTRACE_SYSEMU_SINGLESTEP: c_int = 32;
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn ptrace(request: c_int, mut __valist: ...) -> c_int {
|
||||
// Musl also just grabs the arguments from the varargs...
|
||||
Sys::ptrace(request, __valist.arg(), __valist.arg(), __valist.arg())
|
||||
Sys::ptrace(request, __valist.arg(), __valist.arg(), __valist.arg()).or_minus_one_errno()
|
||||
}
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
use super::{
|
||||
super::{types::*, PalPtrace},
|
||||
e, Sys,
|
||||
e_raw, Sys,
|
||||
};
|
||||
use crate::error::Result;
|
||||
|
||||
impl PalPtrace for Sys {
|
||||
fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int {
|
||||
unsafe { e(syscall!(PTRACE, request, pid, addr, data)) as c_int }
|
||||
unsafe fn ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
data: *mut c_void,
|
||||
) -> Result<c_int> {
|
||||
Ok(unsafe { e_raw(syscall!(PTRACE, request, pid, addr, data))? as c_int })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
use super::super::{types::*, Pal};
|
||||
use crate::{
|
||||
error::Result,
|
||||
platform::{types::*, Pal},
|
||||
};
|
||||
|
||||
pub trait PalPtrace: Pal {
|
||||
fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int;
|
||||
unsafe fn ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
data: *mut c_void,
|
||||
) -> Result<c_int>;
|
||||
}
|
||||
|
||||
@@ -11,8 +11,12 @@ use crate::header::arch_aarch64_user::user_regs_struct;
|
||||
use crate::header::arch_x64_user::user_regs_struct;
|
||||
use crate::{
|
||||
c_str::{CStr, CString},
|
||||
error::Errno,
|
||||
fs::File,
|
||||
header::{errno as errnoh, fcntl, signal, sys_ptrace},
|
||||
header::{
|
||||
errno::{self as errnoh, EIO},
|
||||
fcntl, signal, sys_ptrace,
|
||||
},
|
||||
io::{self, prelude::*},
|
||||
sync::Mutex,
|
||||
};
|
||||
@@ -104,7 +108,7 @@ pub fn get_session(
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
fn inner_ptrace(
|
||||
unsafe fn inner_ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
@@ -115,7 +119,7 @@ fn inner_ptrace(
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86")]
|
||||
fn inner_ptrace(
|
||||
unsafe fn inner_ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
@@ -126,7 +130,7 @@ fn inner_ptrace(
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
fn inner_ptrace(
|
||||
unsafe fn inner_ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
@@ -253,7 +257,13 @@ fn inner_ptrace(
|
||||
}
|
||||
|
||||
impl PalPtrace for Sys {
|
||||
fn ptrace(request: c_int, pid: pid_t, addr: *mut c_void, data: *mut c_void) -> c_int {
|
||||
inner_ptrace(request, pid, addr, data).unwrap_or(-1)
|
||||
unsafe fn ptrace(
|
||||
request: c_int,
|
||||
pid: pid_t,
|
||||
addr: *mut c_void,
|
||||
data: *mut c_void,
|
||||
) -> Result<c_int, Errno> {
|
||||
inner_ptrace(request, pid, addr, data)
|
||||
.map_err(|err| Errno(err.raw_os_error().unwrap_or(EIO)))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user