From: Bruno H. <br...@cl...> - 2008-09-10 21:49:47
|
Hi Sam, > SUS[1] specifies WIFEXITED et al. > I want to use them because the current code in pathname.d:C_execute is broken > at least on amd64 (((status & 0xFF) == 0000) should be ((status) & 0x7f) == 0). > Can I assume that at least > WIFEXITED WEXITSTATUS > WIFSIGNALED WTERMSIG > WIFSTOPPED WSTOPSIG > are present, or do I need to keep the current code in case some are not? The current code, hardcoding the bit masks, is just plain wrong. On BeOS the bit masks are just the opposite than on Linux/x86. In gnulib source code I'm using this code, which uses the macros provided by the system when available, with fallbacks for the macros not provided by the system. #include <sys/wait.h> /* On Linux, WEXITSTATUS are bits 15..8 and WTERMSIG are bits 7..0, while BeOS uses the contrary. Therefore we use the abstract macros. */ #if HAVE_UNION_WAIT # define WAIT_T union wait # ifndef WTERMSIG # define WTERMSIG(x) ((x).w_termsig) # endif # ifndef WCOREDUMP # define WCOREDUMP(x) ((x).w_coredump) # endif # ifndef WEXITSTATUS # define WEXITSTATUS(x) ((x).w_retcode) # endif #else # define WAIT_T int # ifndef WTERMSIG # define WTERMSIG(x) ((x) & 0x7f) # endif # ifndef WCOREDUMP # define WCOREDUMP(x) ((x) & 0x80) # endif # ifndef WEXITSTATUS # define WEXITSTATUS(x) (((x) >> 8) & 0xff) # endif #endif /* For valid x, exactly one of WIFSIGNALED(x), WIFEXITED(x), WIFSTOPPED(x) is true. */ #ifndef WIFSIGNALED # define WIFSIGNALED(x) (WTERMSIG (x) != 0 && WTERMSIG(x) != 0x7f) #endif #ifndef WIFEXITED # define WIFEXITED(x) (WTERMSIG (x) == 0) #endif #ifndef WIFSTOPPED # define WIFSTOPPED(x) (WTERMSIG (x) == 0x7f) #endif /* Note that portable applications may access WTERMSIG(x) only if WIFSIGNALED(x) is true, and WEXITSTATUS(x) only if WIFEXITED(x) is true. */ This code is known to work on all platforms except native Windows (mingw). Some of the #defines here are for old systems, such as NeXTstep, and could be removed. To follow that path, you can ask for a <sys/wait.h> on the gnulib list. Bruno |