diff options
author | Steve Bennett <steveb@workware.net.au> | 2016-10-12 10:12:50 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2016-10-12 10:12:50 +1000 |
commit | 1926cd59f5791d3dce771ec8cd5a026e482b2ba7 (patch) | |
tree | 9bc115593f4997b146517af58a1027bd1cc85fe8 /jim-signal.c | |
parent | 80032e22c35eb24d2df11843a723caa7c7160d29 (diff) | |
download | jimtcl-1926cd59f5791d3dce771ec8cd5a026e482b2ba7.zip jimtcl-1926cd59f5791d3dce771ec8cd5a026e482b2ba7.tar.gz jimtcl-1926cd59f5791d3dce771ec8cd5a026e482b2ba7.tar.bz2 |
signal: restore default signal handling
If the interpreter or signal command is deleted, restore
default signal handling and free allocated memory.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim-signal.c')
-rw-r--r-- | jim-signal.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/jim-signal.c b/jim-signal.c index 6785240..483d021 100644 --- a/jim-signal.c +++ b/jim-signal.c @@ -404,6 +404,25 @@ static const jim_subcmd_type signal_command_table[] = { { NULL } }; +/** + * Restore default signal handling. + */ +static void JimSignalCmdDelete(Jim_Interp *interp, void *privData) +{ + int i; + if (sa_old) { + for (i = 1; i < MAX_SIGNALS; i++) { + if (siginfo[i].status != SIGNAL_ACTION_DEFAULT) { + sigaction(i, &sa_old[i], 0); + siginfo[i].status = SIGNAL_ACTION_DEFAULT; + } + } + } + Jim_Free(sa_old); + sa_old = NULL; + sigloc = NULL; +} + static int Jim_AlarmCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { int ret; @@ -525,7 +544,7 @@ int Jim_signalInit(Jim_Interp *interp) /* Make sure we know where to store the signals which occur */ sigloc = &interp->sigmask; - Jim_CreateCommand(interp, "signal", Jim_SubCmdProc, (void *)signal_command_table, NULL); + Jim_CreateCommand(interp, "signal", Jim_SubCmdProc, (void *)signal_command_table, JimSignalCmdDelete); } return JIM_OK; |