[PATCH] exec_cmd: RUNTIME_PREFIX on OpenBSD systems
Enable Git to resolve its own binary location using getexecpath().
Signed-off-by: Brad Smith <brad@comstyle.com>
---
Makefile | 7 +++++++
config.mak.uname | 3 +++
exec-cmd.c | 24 ++++++++++++++++++++++++
3 files changed, 34 insertions(+)
diff --git a/Makefile b/Makefile
index d4b775953d..9e3d37b5b4 100644
--- a/Makefile
+++ b/Makefile
@@ -378,6 +378,9 @@ include shared.mak
# Perl scripts to use a modified entry point header allowing them to resolve
# support files at runtime.
#
+# When using RUNTIME_PREFIX, define HAVE_GETEXECPATH if your platform supports
+# the getexecpath() function.
+#
# When using RUNTIME_PREFIX, define HAVE_BSD_KERN_PROC_SYSCTL if your platform
# supports the KERN_PROC BSD sysctl function.
#
@@ -2356,6 +2359,10 @@ endif
ifdef RUNTIME_PREFIX
+ ifdef HAVE_GETEXECPATH
+ BASIC_CFLAGS += -DHAVE_GETEXECPATH
+ endif
+
ifdef HAVE_BSD_KERN_PROC_SYSCTL
BASIC_CFLAGS += -DHAVE_BSD_KERN_PROC_SYSCTL
endif
diff --git a/config.mak.uname b/config.mak.uname
index e28870434d..270aff1772 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -343,6 +343,9 @@ ifeq ($(uname_S),OpenBSD)
CSPRNG_METHOD = arc4random
FREAD_READS_DIRECTORIES = UnfortunatelyYes
FILENO_IS_A_MACRO = UnfortunatelyYes
+ ifeq ($(shell test "`expr "$(uname_R)" : '\([0-9][0-9]*\)\.'`" -ge 8 && echo 1),1)
+ HAVE_GETEXECPATH = YesPlease
+ endif
endif
ifeq ($(uname_S),MirBSD)
NO_STRCASESTR = YesPlease
diff --git a/exec-cmd.c b/exec-cmd.c
index 507e67d528..5251da4229 100644
--- a/exec-cmd.c
+++ b/exec-cmd.c
@@ -129,6 +129,26 @@ static int git_get_exec_path_bsd_sysctl(struct strbuf *buf)
}
#endif /* HAVE_BSD_KERN_PROC_SYSCTL */
+#ifdef HAVE_GETEXECPATH
+/*
+ * Resolves the executable path using getexecpath(3).
+ *
+ * Returns 0 on success, -1 on failure.
+ */
+static int git_get_exec_path_getexecpath(struct strbuf *buf)
+{
+ char path[PATH_MAX];
+ if (getexecpath(path, sizeof(path)) == 0) {
+ trace_printf(
+ "trace: resolved executable path from getexecpath: %s\n",
+ path);
+ strbuf_addstr(buf, path);
+ return 0;
+ }
+ return -1;
+}
+#endif /* HAVE_GETEXECPATH */
+
#ifdef HAVE_NS_GET_EXECUTABLE_PATH
/*
* Resolves the executable path by querying Darwin application stack.
@@ -209,6 +229,10 @@ static int git_get_exec_path(struct strbuf *buf, const char *argv0)
* after the first successful method.
*/
if (
+#ifdef HAVE_GETEXECPATH
+ git_get_exec_path_getexecpath(buf) &&
+#endif /* HAVE_GETEXECPATH */
+
#ifdef HAVE_BSD_KERN_PROC_SYSCTL
git_get_exec_path_bsd_sysctl(buf) &&
#endif /* HAVE_BSD_KERN_PROC_SYSCTL */
--
2.55.0