chiark / gitweb /
Improve signal handling. Fix options parsing to POSIX order only.
[xtoys] / xcatch.c
index fd0e0d6fb524f758816338daa804a66a78a8eb18..4f99d196c5bebb90ad1e91ecd40fa9d29c19b5c4 100644 (file)
--- a/xcatch.c
+++ b/xcatch.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
 /* -*-c-*-
  *
- * $Id: xcatch.c,v 1.7 1999/05/21 22:09:19 mdw Exp $
+ * $Id: xcatch.c,v 1.8 1999/06/19 23:42:55 mdw Exp $
  *
  * Catch input and trap it in an X window
  *
  *
  * Catch input and trap it in an X window
  *
@@ -29,6 +29,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: xcatch.c,v $
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: xcatch.c,v $
+ * Revision 1.8  1999/06/19 23:42:55  mdw
+ * Improve signal handling.  Fix options parsing to POSIX order only.
+ *
  * Revision 1.7  1999/05/21 22:09:19  mdw
  * Take advantage of new dynamic string macros.
  *
  * Revision 1.7  1999/05/21 22:09:19  mdw
  * Take advantage of new dynamic string macros.
  *
@@ -234,6 +237,7 @@ static void reap(int sig)
 {
   pid_t k;
   int s;
 {
   pid_t k;
   int s;
+  int e = errno;
 
   for (;;) {
     k = waitpid(-1, &s, WNOHANG);
 
   for (;;) {
     k = waitpid(-1, &s, WNOHANG);
@@ -246,6 +250,7 @@ static void reap(int sig)
        status = 127;
     }
   }
        status = 127;
     }
   }
+  errno = e;
 }
 
 /* --- Main program --- */
 }
 
 /* --- Main program --- */
@@ -277,7 +282,7 @@ int main(int argc, char *argv[])
       { "font",                OPTF_ARGREQ,    0,      'F' },
       { 0,             0,              0,      0 }
     };
       { "font",                OPTF_ARGREQ,    0,      'F' },
       { 0,             0,              0,      0 }
     };
-    int i = mdwopt(argc, argv, "huvf:F:", opt, 0, 0, 0);
+    int i = mdwopt(argc, argv, "+huvf:F:", opt, 0, 0, 0);
 
     if (i < 0)
       break;
 
     if (i < 0)
       break;
@@ -342,7 +347,10 @@ int main(int argc, char *argv[])
 
       sa.sa_handler = reap;
       sigemptyset(&sa.sa_mask);
 
       sa.sa_handler = reap;
       sigemptyset(&sa.sa_mask);
-      sa.sa_flags = 0;
+      sa.sa_flags = SA_NOCLDSTOP;
+#ifdef SA_RESTART
+      sa.sa_flags |= SA_RESTART;
+#endif
       sigaction(SIGCHLD, &sa, 0);
 
       /* --- Start a child program --- */
       sigaction(SIGCHLD, &sa, 0);
 
       /* --- Start a child program --- */