]> git.ipfire.org Git - thirdparty/git.git/commitdiff
exec_cmd: RUNTIME_PREFIX on z/OS systems
authorD Harithamma <harithamma.d@ibm.com>
Thu, 22 Aug 2024 13:52:12 +0000 (13:52 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 22 Aug 2024 15:58:46 +0000 (08:58 -0700)
Enable Git to resolve its own binary location using __getprogramdir
and getprogname.

Since /proc is not a mandatory filesystem on z/OS, we cannot rely on the
git_get_exec_path_procfs method to determine Git's executable path. To
address this, we have implemented git_get_exec_path_zos, which resolves
the executable path by extracting it from the current program's
directory and filename.

Signed-off-by: D Harithamma <harithamma.d@ibm.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
config.mak.uname
exec-cmd.c

index a87e18b317d5b58c7544e76e68dd198a06a24d68..bdc68234823fe93c84b8f5419ad1c33619241f01 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -385,6 +385,10 @@ include shared.mak
 # supports calling _NSGetExecutablePath to retrieve the path of the running
 # executable.
 #
+# When using RUNTIME_PREFIX, define HAVE_ZOS_GET_EXECUTABLE_PATH if your platform
+# supports calling __getprogramdir and getprogname to retrieve the path of the
+# running executable.
+#
 # When using RUNTIME_PREFIX, define HAVE_WPGMPTR if your platform offers
 # the global variable _wpgmptr containing the absolute path of the current
 # executable (this is the case on Windows).
@@ -2155,6 +2159,10 @@ ifdef HAVE_NS_GET_EXECUTABLE_PATH
        BASIC_CFLAGS += -DHAVE_NS_GET_EXECUTABLE_PATH
 endif
 
+ifdef HAVE_ZOS_GET_EXECUTABLE_PATH
+        BASIC_CFLAGS += -DHAVE_ZOS_GET_EXECUTABLE_PATH
+endif
+
 ifdef HAVE_WPGMPTR
        BASIC_CFLAGS += -DHAVE_WPGMPTR
 endif
index aa0fd26bd5305e19ce827b34ce9c6b539fedb844..904bcf3598714032dfa0ff1c2f130891e581ddcb 100644 (file)
@@ -648,6 +648,7 @@ ifeq ($(uname_S),OS/390)
        NO_GECOS_IN_PWENT = YesPlease
        HAVE_STRINGS_H = YesPlease
        NEEDS_MODE_TRANSLATION = YesPlease
+       HAVE_ZOS_GET_EXECUTABLE_PATH = YesPlease
 endif
 ifeq ($(uname_S),MINGW)
         ifeq ($(shell expr "$(uname_R)" : '1\.'),2)
index 909777f61f4fa3d9d8c51c25db96e8d1f30544ae..507e67d528b0dd9b0d473ab93d894e2928f32a44 100644 (file)
@@ -150,6 +150,25 @@ static int git_get_exec_path_darwin(struct strbuf *buf)
 }
 #endif /* HAVE_NS_GET_EXECUTABLE_PATH */
 
+#ifdef HAVE_ZOS_GET_EXECUTABLE_PATH
+/*
+ * Resolves the executable path from current program's directory and name.
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+static int git_get_exec_path_zos(struct strbuf *buf)
+{
+       char *dir = __getprogramdir();
+       char *exe = getprogname();
+       if (dir && exe) {
+               strbuf_addf(buf, "%s/%s", dir, exe);
+               return 0;
+       }
+       return -1;
+}
+
+#endif /* HAVE_ZOS_GET_EXECUTABLE_PATH */
+
 #ifdef HAVE_WPGMPTR
 /*
  * Resolves the executable path by using the global variable _wpgmptr.
@@ -206,6 +225,10 @@ static int git_get_exec_path(struct strbuf *buf, const char *argv0)
                git_get_exec_path_wpgmptr(buf) &&
 #endif /* HAVE_WPGMPTR */
 
+#ifdef HAVE_ZOS_GET_EXECUTABLE_PATH
+               git_get_exec_path_zos(buf) &&
+#endif /*HAVE_ZOS_GET_EXECUTABLE_PATH */
+
                git_get_exec_path_from_argv0(buf, argv0)) {
                return -1;
        }