aboutsummaryrefslogtreecommitdiff
path: root/jim-signal.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2016-10-12 10:12:50 +1000
committerSteve Bennett <steveb@workware.net.au>2016-10-12 10:12:50 +1000
commit1926cd59f5791d3dce771ec8cd5a026e482b2ba7 (patch)
tree9bc115593f4997b146517af58a1027bd1cc85fe8 /jim-signal.c
parent80032e22c35eb24d2df11843a723caa7c7160d29 (diff)
downloadjimtcl-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.c21
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;