Date: Thu, 27 Feb 2003 14:23:08 +0000 From: "Richard Dawe" Sender: rich AT phekda DOT freeserve DOT co DOT uk To: djgpp-workers AT delorie DOT com, laszlo DOT molnar AT eth DOT ericsson DOT se X-Mailer: Emacs 21.3.50 (via feedmail 8.3.emacs20_6 I) and Blat ver 1.8.6 Subject: DJGPP port of Perl 5.6.1, POSIX::WEXITSTATUS [PATCH] Message-Id: Reply-To: djgpp-workers AT delorie DOT com Hello. Below is a patch that fixes POSIX::WEXITSTATUS for the DJGPP port of Perl 5.6.1. ext/POSIX/POSIX.xs is the only code that uses WEXITSTATUS, so it's safe to put it in the program-wide header "dosish.h". If there are no objections, I will upload new packages of Perl 5.6.1 to DJ in a couple of days. I also looked at changing the WEXITSTATUS macro in to be more Unixy. But on further thought: Perl messed up the return code, so it should cope with it, rather than us changing DJGPP. So I think the fix to dosish.h, below, is the only change we should make. Here's a quick test program, if you want to check that the bug is fixed: perl -e 'use POSIX; system "false"; print $?."\n".POSIX::WEXITSTATUS($?)."\n";' You should get the following: DJGPP port of Perl 5.6.1 release 2: 256 0 DJGPP port of Perl 5.6.1 release 2 + patch below: 256 1 Bye, Rich =] --- dosish.h.orig 2002-10-16 13:02:28.000000000 +0000 +++ dosish.h 2003-02-27 14:10:04.000000000 +0000 @@ -116,3 +116,48 @@ # define HAS_WAIT # define HAS_CHOWN #endif /* WIN32 */ + +/* + * : The DJGPP port has code that converts + * the return code of system() into the form that Unixy wait usually + * returns: + * + * - signal number in bits 0-6; + * - core dump flag in bit 7; + * - exit code in bits 8-15. + * + * Bits 0-7 are always zero for DJGPP, because it uses system(). + * See djgpp.c. + * + * POSIX::W* use the W* macros from to decode + * the return code. Unfortunately the W* macros for DJGPP use + * a different format than Unixy wait does. So there's a mismatch + * and, say, WEXITSTATUS($?) will return bogus values. + * + * So here we add hack to redefine the W* macros from DJGPP's + * to work with our return-code conversion. + */ + +#ifdef DJGPP + +#include + +#undef WEXITSTATUS +#undef WIFEXITED +#undef WIFSIGNALED +#undef WIFSTOPPED +#undef WNOHANG +#undef WSTOPSIG +#undef WTERMSIG +#undef WUNTRACED + +#define WEXITSTATUS(stat_val) ((stat_val) >> 8) +#define WIFEXITED(stat_val) 0 +#define WIFSIGNALED(stat_val) 0 +#define WIFSTOPPED(stat_val) 0 +#define WNOHANG 0 +#define WSTOPSIG(stat_val) 0 +#define WTERMSIG(stat_val) 0 +#define WUNTRACED 0 + +#endif