jjc@relay.eu.net (James Clark) (12/03/89)
I tried compiling bash 1.04 on a 386 PC running 386/ix 2.0.1 (a variant of System V.3.2). I think somebody already mentioned that it is necessary to add -DUSGr3 to CFLAGS. When i386 is defined, jobs.h defines w_termsig as follows: #define w_termsig bytes.low & 0x7f nojobs.c includes the line status.w_termsig = status.w_retcode = 0; This won't compile. It also includes the line if (status.w_termsig != 0 && status.w_termsig != WSTOPPED) This will always be 0. The effect of this is that bash does not report processes that are terminated by signals. I fixed these problems by modifying jobs.h and config.h as follows: *** jobs.h.dist Sat Dec 2 14:42:08 1989 --- jobs.h Sat Dec 2 16:33:07 1989 *************** *** 2,34 **** #include "quit.h" - #if !defined (SYSV) || defined (UNIXPC) - #include <sys/wait.h> - #else - - #if defined (i386) || defined (ATT3B) || defined (ATT386) - - union wait { - struct { - unsigned char low; - unsigned char high; - } - bytes; - short word; - }; - - #define WSTOPPED 0177 - #define w_status word - #define w_termsig bytes.low & 0x7f - #define w_stopsig bytes.high - #define w_retcode bytes.high - #define w_coredump w_termsig & ~0x7f - #define WIFEXITED(wstat) ((wstat).bytes.low == 0) - #define WIFSTOPPED(wstat) ((wstat).bytes.low == 0177) - #define WIFTERMINATED(wstat) ((wstat).bytes.high == 0) - - #else /* i386 || ATT3B || ATT386 */ - #ifdef NO_WAIT_H union wait { --- 2,7 ---- *************** *** 38,47 **** --- 11,26 ---- struct { unsigned short + #if defined (i386) || defined (ATT3B) || defined (ATT386) + w_Termsig : 7, /* termination signal */ + w_Coredump : 1, /* core dump indicator */ + w_Retcode : 8; /* exit code if w_termsig==0 */ + #else w_Fill1 : 16, /* high 16 bits unused */ w_Retcode : 8, /* exit code if w_termsig==0 */ w_Coredump : 1, /* core dump indicator */ w_Termsig : 7; /* termination signal */ + #endif /* defined (i386) || defined (ATT3B) || defined (ATT386) */ } w_T; /* Stopped process status. Returned *************** *** 50,58 **** --- 29,42 ---- struct { unsigned short + #if defined (i386) || defined (ATT3B) || defined (ATT386) + w_Stopval : 8, /* == W_STOPPED if stopped */ + w_Stopsig : 8; /* signal that stopped us */ + #else w_Fill2 : 16, /* high 16 bits unused */ w_Stopsig : 8, /* signal that stopped us */ w_Stopval : 8; /* == W_STOPPED if stopped */ + #endif /* defined (i386) || defined (ATT3B) || defined (ATT386) */ } w_S; }; *************** *** 67,75 **** #define WIFEXITED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) == 0)) #define WIFSIGNALED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) != 0)) ! #endif /* HPUX */ ! #endif /* i386 || ATT3B || ATT386 */ ! #endif /* !defined (SYSV) || defined (UNIXPC) */ /* I looked it up. For pretty_print_job (). The real answer is 24. */ #define LONGEST_SIGNAL_DESC 20 --- 51,59 ---- #define WIFEXITED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) == 0)) #define WIFSIGNALED(x) ((! (WIFSTOPPED (x))) && (((x) . w_termsig) != 0)) ! #else ! #include <sys/wait.h> ! #endif /* NO_WAIT_H */ /* I looked it up. For pretty_print_job (). The real answer is 24. */ #define LONGEST_SIGNAL_DESC 20 *** config.h.dist Sat Dec 2 16:10:34 1989 --- config.h Sat Dec 2 16:12:08 1989 *************** *** 66,72 **** /* Define NO_WAIT_H if your system doesn't seem to have sys/wait.h. This is true for HPUX and ALTOS. */ ! #if defined (HPUX) || defined (ALTOS) #define NO_WAIT_H #endif --- 66,72 ---- /* Define NO_WAIT_H if your system doesn't seem to have sys/wait.h. This is true for HPUX and ALTOS. */ ! #if defined (HPUX) || defined (ALTOS) || (defined (SYSV) && !defined (UNIXPC)) #define NO_WAIT_H #endif James Clark jjc@jclark.uucp