1
1
use std:: { mem, ptr} ;
2
2
use { Errno , Error , Result } ;
3
- use libc:: { c_void, c_long, siginfo_t} ;
3
+ use libc:: { self , c_void, c_long, siginfo_t} ;
4
4
use :: unistd:: Pid ;
5
5
6
6
pub mod ptrace {
7
7
use libc:: c_int;
8
8
9
- pub type PtraceRequest = c_int ;
9
+ cfg_if ! {
10
+ if #[ cfg( any( all( target_os = "linux" , arch = "s390x" ) ,
11
+ all( target_os = "linux" , target_env = "gnu" ) ) ) ] {
12
+ pub type PtraceRequest = :: libc:: c_uint;
13
+ } else {
14
+ pub type PtraceRequest = c_int;
15
+ }
16
+ }
10
17
11
18
pub const PTRACE_TRACEME : PtraceRequest = 0 ;
12
19
pub const PTRACE_PEEKTEXT : PtraceRequest = 1 ;
@@ -60,14 +67,6 @@ pub mod ptrace {
60
67
pub const PTRACE_O_TRACESECCOMP : PtraceOptions = ( 1 << PTRACE_EVENT_SECCOMP ) ;
61
68
}
62
69
63
- mod ffi {
64
- use libc:: { pid_t, c_int, c_long, c_void} ;
65
-
66
- extern {
67
- pub fn ptrace ( request : c_int , pid : pid_t , addr : * const c_void , data : * const c_void ) -> c_long ;
68
- }
69
- }
70
-
71
70
/// Performs a ptrace request. If the request in question is provided by a specialised function
72
71
/// this function will return an unsupported operation error.
73
72
pub fn ptrace ( request : ptrace:: PtraceRequest , pid : Pid , addr : * mut c_void , data : * mut c_void ) -> Result < c_long > {
@@ -83,7 +82,7 @@ pub fn ptrace(request: ptrace::PtraceRequest, pid: Pid, addr: *mut c_void, data:
83
82
fn ptrace_peek ( request : ptrace:: PtraceRequest , pid : Pid , addr : * mut c_void , data : * mut c_void ) -> Result < c_long > {
84
83
let ret = unsafe {
85
84
Errno :: clear ( ) ;
86
- ffi :: ptrace ( request, pid . into ( ) , addr, data)
85
+ libc :: ptrace ( request, libc :: pid_t :: from ( pid ) , addr, data)
87
86
} ;
88
87
match Errno :: result ( ret) {
89
88
Ok ( ..) | Err ( Error :: Sys ( Errno :: UnknownErrno ) ) => Ok ( ret) ,
@@ -98,21 +97,21 @@ fn ptrace_peek(request: ptrace::PtraceRequest, pid: Pid, addr: *mut c_void, data
98
97
fn ptrace_get_data < T > ( request : ptrace:: PtraceRequest , pid : Pid ) -> Result < T > {
99
98
// Creates an uninitialized pointer to store result in
100
99
let data: T = unsafe { mem:: uninitialized ( ) } ;
101
- let res = unsafe { ffi :: ptrace ( request, pid . into ( ) , ptr:: null_mut ( ) , & data as * const _ as * const c_void ) } ;
100
+ let res = unsafe { libc :: ptrace ( request, libc :: pid_t :: from ( pid ) , ptr:: null_mut :: < T > ( ) , & data as * const _ as * const c_void ) } ;
102
101
Errno :: result ( res) ?;
103
102
Ok ( data)
104
103
}
105
104
106
105
fn ptrace_other ( request : ptrace:: PtraceRequest , pid : Pid , addr : * mut c_void , data : * mut c_void ) -> Result < c_long > {
107
- Errno :: result ( unsafe { ffi :: ptrace ( request, pid . into ( ) , addr, data) } ) . map ( |_| 0 )
106
+ Errno :: result ( unsafe { libc :: ptrace ( request, libc :: pid_t :: from ( pid ) , addr, data) } ) . map ( |_| 0 )
108
107
}
109
108
110
109
/// Set options, as with `ptrace(PTRACE_SETOPTIONS,...)`.
111
110
pub fn setoptions ( pid : Pid , options : ptrace:: PtraceOptions ) -> Result < ( ) > {
112
111
use self :: ptrace:: * ;
113
112
use std:: ptr;
114
113
115
- let res = unsafe { ffi :: ptrace ( PTRACE_SETOPTIONS , pid . into ( ) , ptr:: null_mut ( ) , options as * mut c_void ) } ;
114
+ let res = unsafe { libc :: ptrace ( PTRACE_SETOPTIONS , libc :: pid_t :: from ( pid ) , ptr:: null_mut :: < libc :: c_void > ( ) , options as * mut c_void ) } ;
116
115
Errno :: result ( res) . map ( |_| ( ) )
117
116
}
118
117
@@ -133,7 +132,7 @@ pub fn setsiginfo(pid: Pid, sig: &siginfo_t) -> Result<()> {
133
132
use self :: ptrace:: * ;
134
133
let ret = unsafe {
135
134
Errno :: clear ( ) ;
136
- ffi :: ptrace ( PTRACE_SETSIGINFO , pid . into ( ) , ptr:: null_mut ( ) , sig as * const _ as * const c_void )
135
+ libc :: ptrace ( PTRACE_SETSIGINFO , libc :: pid_t :: from ( pid ) , ptr:: null_mut :: < libc :: c_void > ( ) , sig as * const _ as * const c_void )
137
136
} ;
138
137
match Errno :: result ( ret) {
139
138
Ok ( _) => Ok ( ( ) ) ,
0 commit comments