aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2014-05-21 07:24:16 -0500
committerRob Landley <rob@landley.net>2014-05-21 07:24:16 -0500
commit1bc522424f6bb21842366ccd11953136436b684b (patch)
treea65e3b53e4b39c9b7700110d388346beae8c248f
parent9b4158c09cdb766369c45dd2dbc44556d0892694 (diff)
downloadtoybox-1bc522424f6bb21842366ccd11953136436b684b.tar.gz
Add generic_signal() handler, which sets toys.signal and writes byte to toys.signalfd if set.
-rw-r--r--lib/lib.c12
-rw-r--r--lib/lib.h1
-rw-r--r--main.c1
-rw-r--r--toys.h3
4 files changed, 17 insertions, 0 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 1ab80351..bbe8f33c 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -614,12 +614,24 @@ static struct signame signames[] = {
// not in posix: SIGNIFY(STKFLT), SIGNIFY(WINCH), SIGNIFY(IO), SIGNIFY(PWR)
// obsolete: SIGNIFY(PROF) SIGNIFY(POLL)
+// Handler that sets toys.signal, and writes to toys.signalfd if set
+void generic_signal(int sig)
+{
+ if (toys.signalfd) {
+ char c = sig;
+
+ writeall(toys.signalfd, &c, 1);
+ }
+ toys.signal = sig;
+}
+
// Install the same handler on every signal that defaults to killing the process
void sigatexit(void *handler)
{
int i;
for (i=0; signames[i].num != SIGCHLD; i++) signal(signames[i].num, handler);
}
+
// Convert name to signal number. If name == NULL print names.
int sig_to_num(char *pidstr)
{
diff --git a/lib/lib.h b/lib/lib.h
index f8fcd8fe..097e67d8 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -174,6 +174,7 @@ struct mtab_list *xgetmountlist(char *path);
// signal
+void generic_signal(int signal);
void sigatexit(void *handler);
int sig_to_num(char *pidstr);
char *num_to_sig(int sig);
diff --git a/main.c b/main.c
index 92ec89fa..38f6d1ad 100644
--- a/main.c
+++ b/main.c
@@ -80,6 +80,7 @@ static void toy_singleinit(struct toy_list *which, char *argv[])
}
toys.old_umask = umask(0);
if (!(which->flags & TOYFLAG_UMASK)) umask(toys.old_umask);
+ toys.signalfd--;
}
// Setup toybox global state for this command.
diff --git a/toys.h b/toys.h
index c59c3c51..6666cfbf 100644
--- a/toys.h
+++ b/toys.h
@@ -23,6 +23,7 @@
#include <regex.h>
#include <sched.h>
#include <setjmp.h>
+#include <signal.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
@@ -125,6 +126,8 @@ extern struct toy_context {
int exithelp; // Should error_exit print a usage message first?
int old_umask; // Old umask preserved by TOYFLAG_UMASK
int toycount; // Total number of commands in this build
+ int signal; // generic_signal() records what signal it saw here
+ int signalfd; // and writes signal to this fd, if set
// This is at the end so toy_init() doesn't zero it.
jmp_buf *rebound; // longjmp here instead of exit when do_rebound set