From 49ea669075bc2170299966048085a55834b34b08 Mon Sep 17 00:00:00 2001 From: Brad Smith Date: Wed, 16 Sep 2026 23:40:51 -0400 Subject: [PATCH] exec_cmd: RUNTIME_PREFIX on OpenBSD systems Enable Git to resolve its own binary location using getexecpath(). Signed-off-by: Brad Smith Signed-off-by: Junio C Hamano --- Makefile | 7 +++++++ config.mak.uname | 3 +++ exec-cmd.c | 24 ++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/Makefile b/Makefile index c649c93c51..b95464f58e 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 b58bcdf943..820c5c0e49 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 */