RE: [PATCH libgpg-error] Add support for IBM z/OS
Sachin T via Gnupg-devel <[email protected]>
| Newsgroups | gmane.comp.encryption.gpg.devel |
|---|---|
| Message-ID | <CO1PR15MB5003F7632DE22702C26C9F689774A@CO1PR15MB5003.namprd15.prod.outlook.com> |
Hi Jacob,
Thanks for the feedback. I’d like to clarify the change.
On z/OS, environ is defined as a macro in <stdlib.h>:
#define environ (*(__EnvnA()))
This causes any use of environ in user code — even inside structs or function parameters to be macro-expanded in invalid ways. For example, the following line in spawn-posix.c:
char **environ gets rewritten by the preprocessor as: char **(*(__EnvnA()));
act->environ gets rewritten by the preprocessor as: act->(*(__EnvnA()));
leading to compile errors like:
spawn-posix.c:66:10: error: field '__EnvnA' declared as a function
66 | char **environ;
| ^
/c390/archive/zosv2r4/S2441/util/usr/include/stdlib.h:885:29: note: expanded from macro 'environ'
885 | #define environ (*(__EnvnA()))
| ^
spawn-posix.c:421:12: error: expected identifier
421 | if (act->environ)
| ^
/c390/archive/zosv2r4/S2441/util/usr/include/stdlib.h:885:26: note: expanded from macro 'environ'
885 | #define environ (*(__EnvnA()))
| ^
spawn-posix.c:422:48: error: expected identifier
422 | execve (pgmname, (char *const *)argv, act->environ);
| ^
/c390/archive/zosv2r4/S2441/util/usr/include/stdlib.h:885:26: note: expanded from macro 'environ'
885 | #define environ (*(__EnvnA()))
| ^
spawn-posix.c:523:8: error: expected identifier
523 | act->environ = environ_for_child;
| ^
/c390/archive/zosv2r4/S2441/util/usr/include/stdlib.h:885:26: note: expanded from macro 'environ'
885 | #define environ (*(__EnvnA()))
| ^
4 errors generated.
To resolve this, we temporarily redefine environ around the inclusion of the header files that use it. This allows the code to compile without macro expansion issues.
Let me know if you'd prefer an alternative approach.
Regards
Sachin
From: Jacob Bachmeyer <[email protected]>
Date: Wednesday, 11 June 2025 at 8:13 AM
To: Sachin T <[email protected]>, [email protected] <[email protected]>
Subject: [EXTERNAL] Re: [PATCH libgpg-error] Add support for IBM z/OS
On 6/10/25 10: 15, Sachin T via Gnupg-devel wrote: [. . . ] 3. On z/OS, environ is defined as a macro in <stdlib. h>, so it is temporarily redefined around the header inclusion to avoid conflicts. [. . . ] diff --git a/src/spawn-posix. c b/src/spawn-posix. c
On 6/10/25 10:15, Sachin T via Gnupg-devel wrote:
[...]
3. On z/OS, environ is defined as a macro in <stdlib.h>, so it is temporarily redefined around the header inclusion to avoid conflicts.
[...]
diff --git a/src/spawn-posix.c b/src/spawn-posix.c
index ac19761..2666862 100644
--- a/src/spawn-posix.c
+++ b/src/spawn-posix.c
@@ -27,8 +27,17 @@
#error This code is only used on POSIX
#endif
+#if defined(__MVS__)
+#define environ environ_replace
+#endif
+
#include <stdio.h>
#include <stdlib.h>
+
+#if defined(__MVS__)
+#undef environ
+#endif
+
#include <stdint.h>
#include <string.h>
#include <errno.h>
What exactly is this dance supposed to do? The C preprocessor has no equivalent to M4's pushdef()/popdef().
If environ is supposed to be a symbol, then there is no reason to define it before including stdlib.h and undefining it to get rid of the macro. If the file does not use environ, then why care? If environ's macro definition is actually important on z/OS, then this dance likely causes breakage.
What is this trying to accomplish?
-- Jacob
_______________________________________________
Gnupg-devel mailing list
[email protected]
https://lists.gnupg.org/mailman/listinfo/gnupg-devel