aboutsummaryrefslogtreecommitdiff
path: root/lib/lib.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2016-03-13 20:23:41 -0500
committerRob Landley <rob@landley.net>2016-03-13 20:23:41 -0500
commiteb24df9749994d175a2de3b7fc0535abe46a7576 (patch)
tree73960237e28c3e222cbe054858641d7b4ece8a92 /lib/lib.c
parent51d71f5c5b7040b50a38d9360561cee626eb2c2e (diff)
downloadtoybox-eb24df9749994d175a2de3b7fc0535abe46a7576.tar.gz
Split out _xexit() from xexit() and give sigatexit() multiple callbacks.
Diffstat (limited to 'lib/lib.c')
-rw-r--r--lib/lib.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 1c1f2248..200f77d6 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -757,11 +757,24 @@ void generic_signal(int sig)
toys.signal = sig;
}
-// Install the same handler on every signal that defaults to killing the process
+void exit_signal(int sig)
+{
+ toys.exitval = sig|128;
+ xexit();
+}
+
+// Install the same handler on every signal that defaults to killing the
+// process, and
void sigatexit(void *handler)
{
+ struct arg_list *al = xmalloc(sizeof(struct arg_list));
int i;
- for (i=0; signames[i].num != SIGCHLD; i++) signal(signames[i].num, handler);
+
+ for (i=0; signames[i].num != SIGCHLD; i++)
+ signal(signames[i].num, exit_signal);
+ al->next = toys.xexit;
+ al->arg = handler;
+ toys.xexit = al;
}
// Convert name to signal number. If name == NULL print names.