From ca23c43ae4edaeeb4471c8e09fc0526fa6e9fc41 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Mon, 29 Jul 2019 19:13:01 +0300 Subject: [PATCH] Return previous handler from signal --- vm/src/stdlib/signal.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/vm/src/stdlib/signal.rs b/vm/src/stdlib/signal.rs index 8a86043276..7298b5cadb 100644 --- a/vm/src/stdlib/signal.rs +++ b/vm/src/stdlib/signal.rs @@ -33,16 +33,25 @@ extern "C" fn run_signal(signum: i32) { } } -fn signal(signalnum: PyIntRef, handler: PyFunctionRef, vm: &VirtualMachine) -> PyResult<()> { - vm.signal_handlers.borrow_mut().insert( - signalnum.as_bigint().to_i32().unwrap(), - handler.into_object(), +fn signal( + signalnum: PyIntRef, + handler: PyFunctionRef, + vm: &VirtualMachine, +) -> PyResult> { + let signalnum = signalnum.as_bigint().to_i32().unwrap(); + let signal_enum = signal::Signal::from_c_int(signalnum).unwrap(); + let sig_handler = nix::sys::signal::SigHandler::Handler(run_signal); + let sig_action = signal::SigAction::new( + sig_handler, + signal::SaFlags::empty(), + signal::SigSet::empty(), ); - let handler = nix::sys::signal::SigHandler::Handler(run_signal); - let sig_action = - signal::SigAction::new(handler, signal::SaFlags::empty(), signal::SigSet::empty()); - unsafe { signal::sigaction(signal::SIGINT, &sig_action) }.unwrap(); - Ok(()) + unsafe { signal::sigaction(signal_enum, &sig_action) }.unwrap(); + let old_handler = vm + .signal_handlers + .borrow_mut() + .insert(signalnum, handler.into_object()); + Ok(old_handler) } pub fn check_signals(vm: &VirtualMachine) {