mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
feat: return a signal string instead number on ChildStatus (#14643)
This commit is contained in:
parent
9a85a95c43
commit
a151092aa1
4 changed files with 191 additions and 21 deletions
2
cli/dts/lib.deno.unstable.d.ts
vendored
2
cli/dts/lib.deno.unstable.d.ts
vendored
|
@ -1117,7 +1117,7 @@ declare namespace Deno {
|
||||||
| {
|
| {
|
||||||
success: false;
|
success: false;
|
||||||
code: number;
|
code: number;
|
||||||
signal: number | null;
|
signal: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export interface SpawnOutput<T extends SpawnOptions> {
|
export interface SpawnOutput<T extends SpawnOptions> {
|
||||||
|
|
|
@ -225,7 +225,7 @@ Deno.test(
|
||||||
assertEquals(status.signal, null);
|
assertEquals(status.signal, null);
|
||||||
} else {
|
} else {
|
||||||
assertEquals(status.code, 137);
|
assertEquals(status.code, 137);
|
||||||
assertEquals(status.signal, 9);
|
assertEquals(status.signal, "SIGKILL");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -410,7 +410,7 @@ Deno.test(
|
||||||
assertEquals(status.signal, null);
|
assertEquals(status.signal, null);
|
||||||
} else {
|
} else {
|
||||||
assertEquals(status.code, 128 + 9);
|
assertEquals(status.code, 128 + 9);
|
||||||
assertEquals(status.signal, 9);
|
assertEquals(status.signal, "SIGKILL");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
@ -429,7 +429,7 @@ Deno.test(
|
||||||
assertEquals(status.signal, null);
|
assertEquals(status.signal, null);
|
||||||
} else {
|
} else {
|
||||||
assertEquals(status.code, 128 + 9);
|
assertEquals(status.code, 128 + 9);
|
||||||
assertEquals(status.signal, 9);
|
assertEquals(status.signal, "SIGKILL");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -100,6 +100,46 @@ pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "freebsd")]
|
||||||
|
pub fn signal_int_to_str(s: libc::c_int) -> Result<&'static str, AnyError> {
|
||||||
|
match s {
|
||||||
|
1 => Ok("SIGHUP"),
|
||||||
|
2 => Ok("SIGINT"),
|
||||||
|
3 => Ok("SIGQUIT"),
|
||||||
|
4 => Ok("SIGILL"),
|
||||||
|
5 => Ok("SIGTRAP"),
|
||||||
|
6 => Ok("SIGABRT"),
|
||||||
|
7 => Ok("SIGEMT"),
|
||||||
|
8 => Ok("SIGFPE"),
|
||||||
|
9 => Ok("SIGKILL"),
|
||||||
|
10 => Ok("SIGBUS"),
|
||||||
|
11 => Ok("SIGSEGV"),
|
||||||
|
12 => Ok("SIGSYS"),
|
||||||
|
13 => Ok("SIGPIPE"),
|
||||||
|
14 => Ok("SIGALRM"),
|
||||||
|
15 => Ok("SIGTERM"),
|
||||||
|
16 => Ok("SIGURG"),
|
||||||
|
17 => Ok("SIGSTOP"),
|
||||||
|
18 => Ok("SIGTSTP"),
|
||||||
|
19 => Ok("SIGCONT"),
|
||||||
|
20 => Ok("SIGCHLD"),
|
||||||
|
21 => Ok("SIGTTIN"),
|
||||||
|
22 => Ok("SIGTTOU"),
|
||||||
|
23 => Ok("SIGIO"),
|
||||||
|
24 => Ok("SIGXCPU"),
|
||||||
|
25 => Ok("SIGXFSZ"),
|
||||||
|
26 => Ok("SIGVTALRM"),
|
||||||
|
27 => Ok("SIGPROF"),
|
||||||
|
28 => Ok("SIGWINCH"),
|
||||||
|
29 => Ok("SIGINFO"),
|
||||||
|
30 => Ok("SIGUSR1"),
|
||||||
|
31 => Ok("SIGUSR2"),
|
||||||
|
32 => Ok("SIGTHR"),
|
||||||
|
33 => Ok("SIGLIBRT"),
|
||||||
|
_ => Err(type_error(format!("Invalid signal : {}", s))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "android", target_os = "linux"))]
|
#[cfg(any(target_os = "android", target_os = "linux"))]
|
||||||
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
match s {
|
match s {
|
||||||
|
@ -138,6 +178,44 @@ pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "android", target_os = "linux"))]
|
||||||
|
pub fn signal_int_to_str(s: libc::c_int) -> Result<&'static str, AnyError> {
|
||||||
|
match s {
|
||||||
|
1 => Ok("SIGHUP"),
|
||||||
|
2 => Ok("SIGINT"),
|
||||||
|
3 => Ok("SIGQUIT"),
|
||||||
|
4 => Ok("SIGILL"),
|
||||||
|
5 => Ok("SIGTRAP"),
|
||||||
|
6 => Ok("SIGABRT"),
|
||||||
|
7 => Ok("SIGBUS"),
|
||||||
|
8 => Ok("SIGFPE"),
|
||||||
|
9 => Ok("SIGKILL"),
|
||||||
|
10 => Ok("SIGUSR1"),
|
||||||
|
11 => Ok("SIGSEGV"),
|
||||||
|
12 => Ok("SIGUSR2"),
|
||||||
|
13 => Ok("SIGPIPE"),
|
||||||
|
14 => Ok("SIGALRM"),
|
||||||
|
15 => Ok("SIGTERM"),
|
||||||
|
16 => Ok("SIGSTKFLT"),
|
||||||
|
17 => Ok("SIGCHLD"),
|
||||||
|
18 => Ok("SIGCONT"),
|
||||||
|
19 => Ok("SIGSTOP"),
|
||||||
|
20 => Ok("SIGTSTP"),
|
||||||
|
21 => Ok("SIGTTIN"),
|
||||||
|
22 => Ok("SIGTTOU"),
|
||||||
|
23 => Ok("SIGURG"),
|
||||||
|
24 => Ok("SIGXCPU"),
|
||||||
|
25 => Ok("SIGXFSZ"),
|
||||||
|
26 => Ok("SIGVTALRM"),
|
||||||
|
27 => Ok("SIGPROF"),
|
||||||
|
28 => Ok("SIGWINCH"),
|
||||||
|
29 => Ok("SIGIO"),
|
||||||
|
30 => Ok("SIGPWR"),
|
||||||
|
31 => Ok("SIGSYS"),
|
||||||
|
_ => Err(type_error(format!("Invalid signal : {}", s))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
match s {
|
match s {
|
||||||
|
@ -176,6 +254,44 @@ pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
pub fn signal_int_to_str(s: libc::c_int) -> Result<&'static str, AnyError> {
|
||||||
|
match s {
|
||||||
|
1 => Ok("SIGHUP"),
|
||||||
|
2 => Ok("SIGINT"),
|
||||||
|
3 => Ok("SIGQUIT"),
|
||||||
|
4 => Ok("SIGILL"),
|
||||||
|
5 => Ok("SIGTRAP"),
|
||||||
|
6 => Ok("SIGABRT"),
|
||||||
|
7 => Ok("SIGEMT"),
|
||||||
|
8 => Ok("SIGFPE"),
|
||||||
|
9 => Ok("SIGKILL"),
|
||||||
|
10 => Ok("SIGBUS"),
|
||||||
|
11 => Ok("SIGSEGV"),
|
||||||
|
12 => Ok("SIGSYS"),
|
||||||
|
13 => Ok("SIGPIPE"),
|
||||||
|
14 => Ok("SIGALRM"),
|
||||||
|
15 => Ok("SIGTERM"),
|
||||||
|
16 => Ok("SIGURG"),
|
||||||
|
17 => Ok("SIGSTOP"),
|
||||||
|
18 => Ok("SIGTSTP"),
|
||||||
|
19 => Ok("SIGCONT"),
|
||||||
|
20 => Ok("SIGCHLD"),
|
||||||
|
21 => Ok("SIGTTIN"),
|
||||||
|
22 => Ok("SIGTTOU"),
|
||||||
|
23 => Ok("SIGIO"),
|
||||||
|
24 => Ok("SIGXCPU"),
|
||||||
|
25 => Ok("SIGXFSZ"),
|
||||||
|
26 => Ok("SIGVTALRM"),
|
||||||
|
27 => Ok("SIGPROF"),
|
||||||
|
28 => Ok("SIGWINCH"),
|
||||||
|
29 => Ok("SIGINFO"),
|
||||||
|
30 => Ok("SIGUSR1"),
|
||||||
|
31 => Ok("SIGUSR2"),
|
||||||
|
_ => Err(type_error(format!("Invalid signal: {}", s))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
|
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
|
||||||
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
match s {
|
match s {
|
||||||
|
@ -226,6 +342,53 @@ pub fn signal_str_to_int(s: &str) -> Result<libc::c_int, AnyError> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "solaris", target_os = "illumos"))]
|
||||||
|
pub fn signal_int_to_str(s: libc::c_int) -> Result<&'static str, AnyError> {
|
||||||
|
match s {
|
||||||
|
1 => Ok("SIGHUP"),
|
||||||
|
2 => Ok("SIGINT"),
|
||||||
|
3 => Ok("SIGQUIT"),
|
||||||
|
4 => Ok("SIGILL"),
|
||||||
|
5 => Ok("SIGTRAP"),
|
||||||
|
6 => Ok("SIGABRT"),
|
||||||
|
7 => Ok("SIGEMT"),
|
||||||
|
8 => Ok("SIGFPE"),
|
||||||
|
9 => Ok("SIGKILL"),
|
||||||
|
10 => Ok("SIGBUS"),
|
||||||
|
11 => Ok("SIGSEGV"),
|
||||||
|
12 => Ok("SIGSYS"),
|
||||||
|
13 => Ok("SIGPIPE"),
|
||||||
|
14 => Ok("SIGALRM"),
|
||||||
|
15 => Ok("SIGTERM"),
|
||||||
|
16 => Ok("SIGUSR1"),
|
||||||
|
17 => Ok("SIGUSR2"),
|
||||||
|
18 => Ok("SIGCHLD"),
|
||||||
|
19 => Ok("SIGPWR"),
|
||||||
|
20 => Ok("SIGWINCH"),
|
||||||
|
21 => Ok("SIGURG"),
|
||||||
|
22 => Ok("SIGPOLL"),
|
||||||
|
23 => Ok("SIGSTOP"),
|
||||||
|
24 => Ok("SIGTSTP"),
|
||||||
|
25 => Ok("SIGCONT"),
|
||||||
|
26 => Ok("SIGTTIN"),
|
||||||
|
27 => Ok("SIGTTOU"),
|
||||||
|
28 => Ok("SIGVTALRM"),
|
||||||
|
29 => Ok("SIGPROF"),
|
||||||
|
30 => Ok("SIGXCPU"),
|
||||||
|
31 => Ok("SIGXFSZ"),
|
||||||
|
32 => Ok("SIGWAITING"),
|
||||||
|
33 => Ok("SIGLWP"),
|
||||||
|
34 => Ok("SIGFREEZE"),
|
||||||
|
35 => Ok("SIGTHAW"),
|
||||||
|
36 => Ok("SIGCANCEL"),
|
||||||
|
37 => Ok("SIGLOST"),
|
||||||
|
38 => Ok("SIGXRES"),
|
||||||
|
39 => Ok("SIGJVM1"),
|
||||||
|
40 => Ok("SIGJVM2"),
|
||||||
|
_ => Err(type_error(format!("Invalid signal : {}", s))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
#[op]
|
#[op]
|
||||||
fn op_signal_bind(
|
fn op_signal_bind(
|
||||||
|
|
|
@ -73,22 +73,29 @@ pub struct ChildStdio {
|
||||||
pub struct ChildStatus {
|
pub struct ChildStatus {
|
||||||
success: bool,
|
success: bool,
|
||||||
code: i32,
|
code: i32,
|
||||||
signal: Option<i32>,
|
signal: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<std::process::ExitStatus> for ChildStatus {
|
impl TryFrom<std::process::ExitStatus> for ChildStatus {
|
||||||
fn from(status: ExitStatus) -> Self {
|
type Error = AnyError;
|
||||||
|
|
||||||
|
fn try_from(status: ExitStatus) -> Result<Self, Self::Error> {
|
||||||
let code = status.code();
|
let code = status.code();
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
let signal = status.signal();
|
let signal = status.signal();
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
let signal = None;
|
let signal: Option<i32> = None;
|
||||||
|
|
||||||
if let Some(signal) = signal {
|
let status = if let Some(signal) = signal {
|
||||||
ChildStatus {
|
ChildStatus {
|
||||||
success: false,
|
success: false,
|
||||||
code: 128 + signal,
|
code: 128 + signal,
|
||||||
signal: Some(signal),
|
#[cfg(unix)]
|
||||||
|
signal: Some(
|
||||||
|
crate::ops::signal::signal_int_to_str(signal)?.to_string(),
|
||||||
|
),
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
signal: None,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let code = code.expect("Should have either an exit code or a signal.");
|
let code = code.expect("Should have either an exit code or a signal.");
|
||||||
|
@ -98,7 +105,9 @@ impl From<std::process::ExitStatus> for ChildStatus {
|
||||||
code,
|
code,
|
||||||
signal: None,
|
signal: None,
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
|
Ok(status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,15 +228,13 @@ async fn op_spawn_wait(
|
||||||
.borrow_mut()
|
.borrow_mut()
|
||||||
.resource_table
|
.resource_table
|
||||||
.take::<ChildResource>(rid)?;
|
.take::<ChildResource>(rid)?;
|
||||||
Ok(
|
Rc::try_unwrap(resource)
|
||||||
Rc::try_unwrap(resource)
|
.ok()
|
||||||
.ok()
|
.unwrap()
|
||||||
.unwrap()
|
.0
|
||||||
.0
|
.wait()
|
||||||
.wait()
|
.await?
|
||||||
.await?
|
.try_into()
|
||||||
.into(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[op]
|
#[op]
|
||||||
|
@ -240,7 +247,7 @@ fn op_spawn_sync(
|
||||||
let output = create_command(state, args)?.output()?;
|
let output = create_command(state, args)?.output()?;
|
||||||
|
|
||||||
Ok(SpawnOutput {
|
Ok(SpawnOutput {
|
||||||
status: output.status.into(),
|
status: output.status.try_into()?,
|
||||||
stdout: if stdout {
|
stdout: if stdout {
|
||||||
Some(output.stdout.into())
|
Some(output.stdout.into())
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue