[gnu.utils.bug] Yet another patch for GNUmake 3.27 for SYSV

rjk@sawmill.UUCP (Richard Kuhns) (01/11/89)

I've seen several patches to GNUmake 3.27 for System V drift by, and
I'd like to present my version of the necessary changes to commands.c.
My changes DO trap SIGCLD and DON'T create zombies (at least, I haven't
seen any so far), in order to make it as similar to the Berkeley code
as possible.  I'm not going to bother with the changes to the variable
named `index'...  note that we never want to SIG_IGN SIGCLD under SYSV,
we want to SIG_DFL so wait() will return a useable value.

*** make-3.27/commands.c	Mon Dec 12 18:37:09 1988
--- commands.c	Mon Jan  9 11:47:19 1989
***************
*** 22,30
  #ifdef	USG
  
  #define WAIT_T int
! #define WTERMSIG(x) ((x) & 0xf7)
! #define WCOREDUMP(x) ((x) & 0x01)
! #define WRETCODE(x) ((x) & (0xff >> 8))
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  

--- 22,30 -----
  #ifdef	USG
  
  #define WAIT_T int
! #define WTERMSIG(x) ((x) & 0x7f)
! #define WCOREDUMP(x) ((x) & 0x0200)
! #define WRETCODE(x) (((x) >> 8) & 0xff)
  #define WIFSIGNALED(x) (WTERMSIG (x) != 0)
  #define WIFEXITED(x) (WTERMSIG (x) == 0)
  
***************
*** 38,43
  
  #include <sys/time.h>
  #include <sys/resource.h>
  #include <sys/fcntl.h>
  #endif	/* USG		*/
  

--- 38,46 -----
  
  #include <sys/time.h>
  #include <sys/resource.h>
+ #ifdef sequent
+ #include <fcntl.h>
+ #else
  #include <sys/fcntl.h>
  #endif /* sequent */
  #endif	/* USG		*/
***************
*** 39,44
  #include <sys/time.h>
  #include <sys/resource.h>
  #include <sys/fcntl.h>
  #endif	/* USG		*/
  
  

--- 42,48 -----
  #include <fcntl.h>
  #else
  #include <sys/fcntl.h>
+ #endif /* sequent */
  #endif	/* USG		*/
  
  
***************
*** 151,157
    if (children == 0 && shell_function_pid <= 0)
      return 0;
  
!   while (wait (&status) > 0)
  #else	/* not USG	*/
    while ((sig <= 0
  	  ? (pid = wait (&status))

--- 155,161 -----
    if (children == 0 && shell_function_pid <= 0)
      return 0;
  
!   while ((pid = wait (&status)) > 0)
  #else	/* not USG	*/
    while ((sig <= 0
  	  ? (pid = wait (&status))
***************
*** 165,171
        if (pid == shell_function_pid)
  	{
  	  shell_function_pid
! 	    = (WIFEXITED (status) && status.w_retcode == 127) ? -1 : 0;
  
  	  if (sig < 0 && ++dead_children > -sig)
  	    return 0;

--- 169,175 -----
        if (pid == shell_function_pid)
  	{
  	  shell_function_pid
! 	    = (WIFEXITED (status) && WRETCODE(status) == 127) ? -1 : 0;
  
  	  if (sig < 0 && ++dead_children > -sig)
  	    return 0;
***************
*** 180,187
  	    char buf[100];
  
  	    if (WIFEXITED (status))
! 	      if (status.w_retcode != 0)
! 		sprintf (buf, "*** Error %d", status.w_retcode);
  	      else
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))

--- 184,191 -----
  	    char buf[100];
  
  	    if (WIFEXITED (status))
! 	      if (WRETCODE(status) != 0)
! 		sprintf (buf, "*** Error %d", WRETCODE(status));
  	      else
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
***************
*** 186,194
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
  	      {
! 		char *cd = status.w_coredump ? " (core dumped)" : "";
! 		if (status.w_termsig > 0 && status.w_termsig < NSIG)
! 		  sprintf (buf, "*** %s%s", sys_siglist[status.w_termsig], cd);
  		else
  		  sprintf (buf, "*** Signal %d%s", status.w_termsig, cd);
  	      }

--- 190,198 -----
  		buf[0] = '\0';
  	    else if (WIFSIGNALED (status))
  	      {
! 		char *cd = WCOREDUMP(status) ? " (core dumped)" : "";
! 		if (WTERMSIG(status) > 0 && WTERMSIG(status) < NSIG)
! 		  sprintf (buf, "*** %s%s", sys_siglist[WTERMSIG(status)], cd);
  		else
  		  sprintf (buf, "*** Signal %d%s", WTERMSIG(status), cd);
  	      }
***************
*** 190,196
  		if (status.w_termsig > 0 && status.w_termsig < NSIG)
  		  sprintf (buf, "*** %s%s", sys_siglist[status.w_termsig], cd);
  		else
! 		  sprintf (buf, "*** Signal %d%s", status.w_termsig, cd);
  	      }
  	    else
  	      strcpy (buf, "*** Strange Error");

--- 194,200 -----
  		if (WTERMSIG(status) > 0 && WTERMSIG(status) < NSIG)
  		  sprintf (buf, "*** %s%s", sys_siglist[WTERMSIG(status)], cd);
  		else
! 		  sprintf (buf, "*** Signal %d%s", WTERMSIG(status), cd);
  	      }
  	    else
  	      strcpy (buf, "*** Strange Error");
***************
*** 302,308
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, SIG_IGN);
  #else
!   (void) signal (SIGCLD, SIG_IGN);
  #endif
  
    /* Call child_handler to do the work.  */

--- 306,312 -----
  #ifdef SIGCHLD
    (void) signal (SIGCHLD, SIG_IGN);
  #else
!   (void) signal (SIGCLD, SIG_DFL);
  #endif
  
    /* Call child_handler to do the work.  */