Skip to content

Commit ad62647

Browse files
committed
wait: Support ptrace events for Linux
1 parent bf00bf2 commit ad62647

File tree

1 file changed

+14
-0
lines changed

1 file changed

+14
-0
lines changed

src/sys/wait.rs

+14
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ pub enum WaitStatus {
4444
Exited(pid_t, i8),
4545
Signaled(pid_t, Signal, bool),
4646
Stopped(pid_t, Signal),
47+
#[cfg(any(target_os = "linux",
48+
target_os = "android"))]
49+
PtraceEvent(pid_t, Signal, c_int),
4750
Continued(pid_t),
4851
StillAlive
4952
}
@@ -52,6 +55,7 @@ pub enum WaitStatus {
5255
target_os = "android"))]
5356
mod status {
5457
use sys::signal::Signal;
58+
use libc::c_int;
5559

5660
pub fn exited(status: i32) -> bool {
5761
(status & 0x7F) == 0
@@ -81,6 +85,10 @@ mod status {
8185
Signal::from_c_int((status & 0xFF00) >> 8).unwrap()
8286
}
8387

88+
pub fn stop_additional(status: i32) -> c_int {
89+
(status >> 16) as c_int
90+
}
91+
8492
pub fn continued(status: i32) -> bool {
8593
status == 0xFFFF
8694
}
@@ -184,6 +192,12 @@ fn decode(pid : pid_t, status: i32) -> WaitStatus {
184192
} else if status::signaled(status) {
185193
WaitStatus::Signaled(pid, status::term_signal(status), status::dumped_core(status))
186194
} else if status::stopped(status) {
195+
if cfg!(any(target_os = "linux", target_os = "android")) {
196+
let status_additional = status::stop_additional(status);
197+
if status_additional != 0 {
198+
return WaitStatus::PtraceEvent(pid, status::stop_signal(status), status::stop_additional(status))
199+
}
200+
}
187201
WaitStatus::Stopped(pid, status::stop_signal(status))
188202
} else {
189203
assert!(status::continued(status));

0 commit comments

Comments
 (0)