changeset 6759:5d118b8eb6a4

* lib/wait-process.h (wait_subprocess): Accept a new exitsignal argument. * lib/wait-process.c (wait_subprocess): Always set *exitsignal to 0 when present and set it to the offending signal when the child exits due to a signal. * lib/csharpcomp.c, lib/execute.c, lib/javacomp.c: Update all callers.
author Derek R. Price <derek@ximbiot.com>
date Tue, 25 Apr 2006 20:58:26 +0000
parents 31433c96e3b7
children 3b3881a78c10
files lib/ChangeLog lib/csharpcomp.c lib/execute.c lib/javacomp.c lib/wait-process.c lib/wait-process.h
diffstat 6 files changed, 21 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,11 @@
+2006-04-25  Derek Price  <derek@ximbiot.com>
+
+	* wait-process.h (wait_subprocess): Accept a new exitsignal argument.
+	* wait-process.c (wait_subprocess): Always set *exitsignal to 0 when
+	present and set it to the offending signal when the child exits due to
+	a signal.
+	* csharpcomp.c, execute.c, javacomp.c: Update all callers.
+
 2006-04-25  Paul Eggert  <eggert@cs.ucla.edu>
 
 	* getdate.y (get_date): When adding relative date, start with the
--- a/lib/csharpcomp.c
+++ b/lib/csharpcomp.c
@@ -295,7 +295,8 @@
       fclose (fp);
 
       /* Remove zombie process from process list, and retrieve exit status.  */
-      exitstatus = wait_subprocess (child, "mcs", false, false, true, true);
+      exitstatus = wait_subprocess (child, "mcs", NULL, false, false, true,
+				    true);
 
       for (i = 0; i < sources_count; i++)
 	if (argv[argc - sources_count + i] != sources[i])
@@ -366,7 +367,7 @@
 	  /* Remove zombie process from process list, and retrieve exit
 	     status.  */
 	  exitstatus =
-	    wait_subprocess (child, "csc", false, true, true, false);
+	    wait_subprocess (child, "csc", NULL, false, true, true, false);
 	  if (exitstatus != 0)
 	    csc_present = false;
 	}
--- a/lib/execute.c
+++ b/lib/execute.c
@@ -308,7 +308,7 @@
       unblock_fatal_signals ();
     }
 
-  return wait_subprocess (child, progname, ignore_sigpipe, null_stderr,
+  return wait_subprocess (child, progname, NULL, ignore_sigpipe, null_stderr,
 			  slave_process, exit_on_error);
 
 #endif
--- a/lib/javacomp.c
+++ b/lib/javacomp.c
@@ -240,7 +240,7 @@
 	    /* Remove zombie process from process list, and retrieve exit
 	       status.  */
 	    exitstatus =
-	      wait_subprocess (child, "gcj", false, true, true, false);
+	      wait_subprocess (child, "gcj", NULL, false, true, true, false);
 	    if (exitstatus != 0)
 	      gcj_present = false;
 	  }
--- a/lib/wait-process.c
+++ b/lib/wait-process.c
@@ -251,7 +251,7 @@
    If it didn't terminate correctly, exit if exit_on_error is true, otherwise
    return 127.  */
 int
-wait_subprocess (pid_t child, const char *progname,
+wait_subprocess (pid_t child, const char *progname, int *exitsignal,
 		 bool ignore_sigpipe, bool null_stderr,
 		 bool slave_process, bool exit_on_error)
 {
@@ -345,6 +345,7 @@
   WAIT_T status;
 
   *(int *) &status = 0;
+  if (exitsignal) *exitsignal = 0;
   for (;;)
     {
       int result = waitpid (child, &status, 0);
@@ -394,6 +395,7 @@
 	error (exit_on_error ? EXIT_FAILURE : 0, 0,
 	       _("%s subprocess got fatal signal %d"),
 	       progname, (int) WTERMSIG (status));
+      if (exitsignal) *exitsignal = WTERMSIG (status);
       return 127;
     }
   if (WEXITSTATUS (status) == 127)
--- a/lib/wait-process.h
+++ b/lib/wait-process.h
@@ -34,11 +34,14 @@
 
 /* Wait for a subprocess to finish.  Return its exit code.
    If it didn't terminate correctly, exit if exit_on_error is true, otherwise
-   return 127.
+   return 127 and set exitsignal if the child terminated because of a signal.
    Arguments:
    - child is the pid of the subprocess.
    - progname is the name of the program executed by the subprocess, used for
      error messages.
+   - exitsignal is an optional pointer to an int to hold the signal number of
+     any signal that caused the child to exit.  It will be set to zero if this
+     function exits with an error not caused by the child catching a signal.
    - If ignore_sigpipe is true, consider a subprocess termination due to
      SIGPIPE as equivalent to a success.  This is suitable for processes whose
      only purpose is to write to standard output.  This flag can be safely set
@@ -50,6 +53,7 @@
    - If exit_on_error is true, any error will cause the main process to exit
      with an error status.  */
 extern int wait_subprocess (pid_t child, const char *progname,
+			    int *exitsignal,
 			    bool ignore_sigpipe, bool null_stderr,
 			    bool slave_process, bool exit_on_error);