Thread (2 messages) flat view 2 messages, 2 authors, 9h ago
HOTtoday

[PATCH] exec_cmd: RUNTIME_PREFIX on OpenBSD systems

From: Brad Smith <hidden>
Date: 2026-09-17 03:40:58
Subsystem: kernel build + files below scripts/ (unless maintained elsewhere), the rest · Maintainers: Nathan Chancellor, Nicolas Schier, Linus Torvalds

Enable Git to resolve its own binary location using getexecpath().

Signed-off-by: Brad Smith <redacted>
---
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help