changeset 1299:313980d3d78c draft

Add generic_signal() handler, which sets toys.signal and writes byte to toys.signalfd if set.
author Rob Landley <rob@landley.net>
date Wed, 21 May 2014 07:24:16 -0500
parents c25ee9918e65
children 04d754570e50
files lib/lib.c lib/lib.h main.c toys.h
diffstat 4 files changed, 17 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lib/lib.c	Wed May 21 07:09:09 2014 -0500
+++ b/lib/lib.c	Wed May 21 07:24:16 2014 -0500
@@ -614,12 +614,24 @@
 // 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)
 {
--- a/lib/lib.h	Wed May 21 07:09:09 2014 -0500
+++ b/lib/lib.h	Wed May 21 07:24:16 2014 -0500
@@ -174,6 +174,7 @@
 
 // signal
 
+void generic_signal(int signal);
 void sigatexit(void *handler);
 int sig_to_num(char *pidstr);
 char *num_to_sig(int sig);
--- a/main.c	Wed May 21 07:09:09 2014 -0500
+++ b/main.c	Wed May 21 07:24:16 2014 -0500
@@ -80,6 +80,7 @@
   }
   toys.old_umask = umask(0);
   if (!(which->flags & TOYFLAG_UMASK)) umask(toys.old_umask);
+  toys.signalfd--;
 }
 
 // Setup toybox global state for this command.
--- a/toys.h	Wed May 21 07:09:09 2014 -0500
+++ b/toys.h	Wed May 21 07:24:16 2014 -0500
@@ -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 @@
   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