diff options
Diffstat (limited to 'runtime/ops')
-rw-r--r-- | runtime/ops/process.rs | 11 | ||||
-rw-r--r-- | runtime/ops/signal.rs | 92 |
2 files changed, 96 insertions, 7 deletions
diff --git a/runtime/ops/process.rs b/runtime/ops/process.rs index 44ead73da..b1d5e80ca 100644 --- a/runtime/ops/process.rs +++ b/runtime/ops/process.rs @@ -198,7 +198,7 @@ fn op_run( #[derive(Serialize)] #[serde(rename_all = "camelCase")] -struct RunStatus { +struct ProcessStatus { got_signal: bool, exit_code: i32, exit_signal: i32, @@ -208,7 +208,7 @@ async fn op_run_status( state: Rc<RefCell<OpState>>, rid: ResourceId, _: (), -) -> Result<RunStatus, AnyError> { +) -> Result<ProcessStatus, AnyError> { let resource = state .borrow_mut() .resource_table @@ -227,7 +227,7 @@ async fn op_run_status( .expect("Should have either an exit code or a signal."); let got_signal = signal.is_some(); - Ok(RunStatus { + Ok(ProcessStatus { got_signal, exit_code: code.unwrap_or(-1), exit_signal: signal.unwrap_or(-1), @@ -288,13 +288,14 @@ pub fn kill(pid: i32, signal: i32) -> Result<(), AnyError> { #[derive(Deserialize)] struct KillArgs { pid: i32, - signo: i32, + signo: String, } fn op_kill(state: &mut OpState, args: KillArgs, _: ()) -> Result<(), AnyError> { super::check_unstable(state, "Deno.kill"); state.borrow_mut::<Permissions>().run.check_all()?; - kill(args.pid, args.signo)?; + let signo = super::signal::signal_str_to_int_unwrap(&args.signo)?; + kill(args.pid, signo)?; Ok(()) } diff --git a/runtime/ops/signal.rs b/runtime/ops/signal.rs index 889021706..eea8161cd 100644 --- a/runtime/ops/signal.rs +++ b/runtime/ops/signal.rs @@ -1,4 +1,5 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use deno_core::error::type_error; use deno_core::error::AnyError; use deno_core::op_async_unref; use deno_core::op_sync; @@ -53,15 +54,102 @@ impl Resource for SignalStreamResource { } } +#[cfg(target_os = "linux")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + match s { + "SIGHUP" => Some(1), + "SIGINT" => Some(2), + "SIGQUIT" => Some(3), + "SIGILL" => Some(4), + "SIGTRAP" => Some(5), + "SIGABRT" => Some(6), + "SIGBUS" => Some(7), + "SIGFPE" => Some(8), + "SIGKILL" => Some(9), + "SIGUSR1" => Some(10), + "SIGSEGV" => Some(11), + "SIGUSR2" => Some(12), + "SIGPIPE" => Some(13), + "SIGALRM" => Some(14), + "SIGTERM" => Some(15), + "SIGSTKFLT" => Some(16), + "SIGCHLD" => Some(17), + "SIGCONT" => Some(18), + "SIGSTOP" => Some(19), + "SIGTSTP" => Some(20), + "SIGTTIN" => Some(21), + "SIGTTOU" => Some(22), + "SIGURG" => Some(23), + "SIGXCPU" => Some(24), + "SIGXFSZ" => Some(25), + "SIGVTALRM" => Some(26), + "SIGPROF" => Some(27), + "SIGWINCH" => Some(28), + "SIGIO" => Some(29), + "SIGPWR" => Some(30), + "SIGSYS" => Some(31), + _ => None, + } +} + +#[cfg(target_os = "macos")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + match s { + "SIGHUP" => Some(1), + "SIGINT" => Some(2), + "SIGQUIT" => Some(3), + "SIGILL" => Some(4), + "SIGTRAP" => Some(5), + "SIGABRT" => Some(6), + "SIGEMT" => Some(7), + "SIGFPE" => Some(8), + "SIGKILL" => Some(9), + "SIGBUS" => Some(10), + "SIGSEGV" => Some(11), + "SIGSYS" => Some(12), + "SIGPIPE" => Some(13), + "SIGALRM" => Some(14), + "SIGTERM" => Some(15), + "SIGURG" => Some(16), + "SIGSTOP" => Some(17), + "SIGTSTP" => Some(18), + "SIGCONT" => Some(19), + "SIGCHLD" => Some(20), + "SIGTTIN" => Some(21), + "SIGTTOU" => Some(22), + "SIGIO" => Some(23), + "SIGXCPU" => Some(24), + "SIGXFSZ" => Some(25), + "SIGVTALRM" => Some(26), + "SIGPROF" => Some(27), + "SIGWINCH" => Some(28), + "SIGINFO" => Some(29), + "SIGUSR1" => Some(30), + "SIGUSR2" => Some(31), + _ => None, + } +} + +#[cfg(target_os = "windows")] +fn signal_str_to_int(s: &str) -> Option<libc::c_int> { + unimplemented!() +} + +pub fn signal_str_to_int_unwrap(s: &str) -> Result<libc::c_int, AnyError> { + signal_str_to_int(s) + .ok_or_else(|| type_error(format!("Invalid signal : {}", s))) +} + #[cfg(unix)] fn op_signal_bind( state: &mut OpState, - signo: i32, + sig: String, _: (), ) -> Result<ResourceId, AnyError> { super::check_unstable(state, "Deno.signal"); + let signo = signal_str_to_int_unwrap(&sig)?; let resource = SignalStreamResource { - signal: AsyncRefCell::new(signal(SignalKind::from_raw(signo)).expect("")), + signal: AsyncRefCell::new(signal(SignalKind::from_raw(signo)).unwrap()), cancel: Default::default(), }; let rid = state.resource_table.add(resource); |