threads / patch / 32210

patchExtend runtime prefix computation

Subject: [PATCH] Extend runtime prefix computation

## tl;dr

11 messages between Nov 27, 2012 and Oct 4, 2013. Diffs are folded; open one to read it.

replies: 10people: 3as markdown or json

Michael Weiser· Nov 27, 2012, 16:30 UTC · lore

Support determining the binaries' installation path at runtime even if called without any path components (i.e. via search path). Implement fallback to compiled-in prefix if determination fails or is impossible.

Signed-off-by: Michael Weiser <weiser@science-computing.de>
---
- Has two very minor memory leaks - function is called only once per
  program execution. Do we care? Alternative: Use static buffer instead.
 exec_cmd.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 53 insertions(+), 15 deletions(-)
Show changes to exec_cmd.c +53 −15
diff --git a/exec_cmd.c b/exec_cmd.c
index 125fa6f..d50d7f8 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -4,28 +4,22 @@
 #define MAX_ARGS	32
 
 static const char *argv_exec_path;
-static const char *argv0_path;
+static const char *argv0_path = NULL;
 
 const char *system_path(const char *path)
 {
-#ifdef RUNTIME_PREFIX
-	static const char *prefix;
-#else
 	static const char *prefix = PREFIX;
-#endif
 	struct strbuf d = STRBUF_INIT;
 
 	if (is_absolute_path(path))
 		return path;
 
 #ifdef RUNTIME_PREFIX
-	assert(argv0_path);
-	assert(is_absolute_path(argv0_path));
-
-	if (!prefix &&
-	    !(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
-	    !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
-	    !(prefix = strip_path_suffix(argv0_path, "git"))) {
+	if (!argv0_path ||
+	    !is_absolute_path(argv0_path) ||
+	    (!(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
+	     !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
+	     !(prefix = strip_path_suffix(argv0_path, "git")))) {
 		prefix = PREFIX;
 		trace_printf("RUNTIME_PREFIX requested, "
 				"but prefix computation failed.  "
@@ -41,20 +35,64 @@ const char *system_path(const char *path)
 const char *git_extract_argv0_path(const char *argv0)
 {
 	const char *slash;
+	char *abs_argv0 = NULL;
 
 	if (!argv0 || !*argv0)
 		return NULL;
 	slash = argv0 + strlen(argv0);
 
+	/* walk to the first slash from the end */
 	while (argv0 <= slash && !is_dir_sep(*slash))
 		slash--;
 
+	/* if there was a slash ... */
 	if (slash >= argv0) {
-		argv0_path = xstrndup(argv0, slash - argv0);
-		return slash + 1;
+		/* ... it's either an absolute path */
+		if (is_absolute_path(argv0)) {
+			/* FIXME: memory leak here */
+			argv0_path = xstrndup(argv0, slash - argv0);
+			return slash + 1;
+		}
+
+		/* ... or a relative path, in which case we have to make it
+		 * absolute first and do the whole thing again */
+		abs_argv0 = xstrdup(real_path(argv0));
+	} else {
+		/* argv0 is no path at all, just a name. Resolve it into a
+		 * path. Unfortunately, this gets system specific. */
+#if defined(__linux__)
+		struct stat st;
+		if (!stat("/proc/self/exe", &st)) {
+			abs_argv0 = xstrdup(real_path("/proc/self/exe"));
+		}
+#elif defined(__APPLE__)
+		/* Mac OS X has realpath, which incidentally allocates its own
+		 * memory, which in turn is why we do all the xstrdup's in the
+		 * other cases. */
+		abs_argv0 = realpath(argv0, NULL);
+#endif
+
+		/* if abs_argv0 is still NULL here, something failed above or
+		 * we are on an unsupported system. system_path() will warn
+		 * and fall back to the static prefix */
+		if (!abs_argv0) {
+			argv0_path = NULL;
+			return argv0;
+		}
 	}
 
-	return argv0;
+	/* abs_argv0 is an absolute path now for which memory was allocated
+	 * with malloc */
+
+	slash = abs_argv0 + strlen(abs_argv0);
+	while (abs_argv0 <= slash && !is_dir_sep(*slash))
+		slash--;
+
+	/* FIXME: memory leaks here */
+	argv0_path = xstrndup(abs_argv0, slash - abs_argv0);
+	slash = xstrdup(slash + 1);
+	free(abs_argv0);
+	return slash;
 }
 
 void git_set_argv_exec_path(const char *exec_path)
-- 
1.7.3.4
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Erik Faye-Lund· Nov 30, 2012, 10:20 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

On Tue, Nov 27, 2012 at 5:30 PM, Michael Weiser <M.Weiser@science-computing.de> wrote:

Show 93 quoted lines
> Support determining the binaries' installation path at runtime even if
> called without any path components (i.e. via search path). Implement
> fallback to compiled-in prefix if determination fails or is impossible.
>
> Signed-off-by: Michael Weiser <weiser@science-computing.de>
> ---
> - Has two very minor memory leaks - function is called only once per
>   program execution. Do we care? Alternative: Use static buffer instead.
>
>  exec_cmd.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++-------------
>  1 files changed, 53 insertions(+), 15 deletions(-)
>
> diff --git a/exec_cmd.c b/exec_cmd.c
> index 125fa6f..d50d7f8 100644
> --- a/exec_cmd.c
> +++ b/exec_cmd.c
> @@ -4,28 +4,22 @@
>  #define MAX_ARGS       32
>
>  static const char *argv_exec_path;
> -static const char *argv0_path;
> +static const char *argv0_path = NULL;
>
>  const char *system_path(const char *path)
>  {
> -#ifdef RUNTIME_PREFIX
> -       static const char *prefix;
> -#else
>         static const char *prefix = PREFIX;
> -#endif
>         struct strbuf d = STRBUF_INIT;
>
>         if (is_absolute_path(path))
>                 return path;
>
>  #ifdef RUNTIME_PREFIX
> -       assert(argv0_path);
> -       assert(is_absolute_path(argv0_path));
> -
> -       if (!prefix &&
> -           !(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
> -           !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
> -           !(prefix = strip_path_suffix(argv0_path, "git"))) {
> +       if (!argv0_path ||
> +           !is_absolute_path(argv0_path) ||
> +           (!(prefix = strip_path_suffix(argv0_path, GIT_EXEC_PATH)) &&
> +            !(prefix = strip_path_suffix(argv0_path, BINDIR)) &&
> +            !(prefix = strip_path_suffix(argv0_path, "git")))) {
>                 prefix = PREFIX;
>                 trace_printf("RUNTIME_PREFIX requested, "
>                                 "but prefix computation failed.  "
> @@ -41,20 +35,64 @@ const char *system_path(const char *path)
>  const char *git_extract_argv0_path(const char *argv0)
>  {
>         const char *slash;
> +       char *abs_argv0 = NULL;
>
>         if (!argv0 || !*argv0)
>                 return NULL;
>         slash = argv0 + strlen(argv0);
>
> +       /* walk to the first slash from the end */
>         while (argv0 <= slash && !is_dir_sep(*slash))
>                 slash--;
>
> +       /* if there was a slash ... */
>         if (slash >= argv0) {
> -               argv0_path = xstrndup(argv0, slash - argv0);
> -               return slash + 1;
> +               /* ... it's either an absolute path */
> +               if (is_absolute_path(argv0)) {
> +                       /* FIXME: memory leak here */
> +                       argv0_path = xstrndup(argv0, slash - argv0);
> +                       return slash + 1;
> +               }
> +
> +               /* ... or a relative path, in which case we have to make it
> +                * absolute first and do the whole thing again */
> +               abs_argv0 = xstrdup(real_path(argv0));
> +       } else {
> +               /* argv0 is no path at all, just a name. Resolve it into a
> +                * path. Unfortunately, this gets system specific. */
> +#if defined(__linux__)
> +               struct stat st;
> +               if (!stat("/proc/self/exe", &st)) {
> +                       abs_argv0 = xstrdup(real_path("/proc/self/exe"));
> +               }
> +#elif defined(__APPLE__)
> +               /* Mac OS X has realpath, which incidentally allocates its own
> +                * memory, which in turn is why we do all the xstrdup's in the
> +                * other cases. */
> +               abs_argv0 = realpath(argv0, NULL);
> +#endif
...perhaps a "GetModuleFileName(NULL, ...)" for Windows is in place here?
Michael Weiser· Nov 30, 2012, 10:45 UTC · re: Erik Faye-Lund · lore

Re: [PATCH] Extend runtime prefix computation

Hello Erik,
On Fri, Nov 30, 2012 at 11:20:52AM +0100, Erik Faye-Lund wrote:
Show 12 quoted lines
> > +#if defined(__linux__)
> > +               struct stat st;
> > +               if (!stat("/proc/self/exe", &st)) {
> > +                       abs_argv0 = xstrdup(real_path("/proc/self/exe"));
> > +               }
> > +#elif defined(__APPLE__)
> > +               /* Mac OS X has realpath, which incidentally allocates its own
> > +                * memory, which in turn is why we do all the xstrdup's in the
> > +                * other cases. */
> > +               abs_argv0 = realpath(argv0, NULL);
> > +#endif
> ...perhaps a "GetModuleFileName(NULL, ...)" for Windows is in place here?

Agreed. However, I do not use git on Windows and don't have a Windows devel toolchain in place. So I guess this should be added in a separate patch by someone actually in need of it and in a position to develop and test it?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Michael Weiser· Mar 5, 2013, 11:58 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

Hello,
On Tue, Nov 27, 2012 at 05:30:04PM +0100, Michael Weiser wrote:
> Support determining the binaries' installation path at runtime even if
> called without any path components (i.e. via search path). Implement
> fallback to compiled-in prefix if determination fails or is impossible.

I see this hasn't made it into git, yet. Is there any reason? What can I do to get it included?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Junio C Hamano· Mar 5, 2013, 16:13 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

Michael Weiser <M.Weiser@science-computing.de> writes:
Show 7 quoted lines
> On Tue, Nov 27, 2012 at 05:30:04PM +0100, Michael Weiser wrote:
>
>> Support determining the binaries' installation path at runtime even if
>> called without any path components (i.e. via search path). Implement
>> fallback to compiled-in prefix if determination fails or is impossible.
>
> I see this hasn't made it into git, yet. Is there any reason?
Most likely nobody was interested.

The default for any change is not to include it. Is there any reason why we want this change?

Michael Weiser· Mar 6, 2013, 08:19 UTC · re: Junio C Hamano · lore

Re: [PATCH] Extend runtime prefix computation

Hello Junio,
On Tue, Mar 05, 2013 at 08:13:50AM -0800, Junio C Hamano wrote:
> >> Support determining the binaries' installation path at runtime even if
> >> called without any path components (i.e. via search path).
> The default for any change is not to include it.  Is there any
> reason why we want this change?

It makes a binary git installation fully relocatable. Seeing how git already has basic support for it I thought other people might be interested in this.

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Michael Weiser· Apr 16, 2013, 14:56 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

Hello Junio, Hello list,

On Wed, Mar 06, 2013 at 09:19:42AM +0100, Michael Weiser wrote:
Show 7 quoted lines
> > >> Support determining the binaries' installation path at runtime even if
> > >> called without any path components (i.e. via search path).
> > The default for any change is not to include it.  Is there any
> > reason why we want this change?
> It makes a binary git installation fully relocatable. Seeing how git
> already has basic support for it I thought other people might be
> interested in this.

I am still interested in getting this accepted into git. Where do I push to get it committed?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Junio C Hamano· Apr 16, 2013, 18:23 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

nobody writes:
Show 15 quoted lines
> Hello Junio,
> Hello list,
>
> On Wed, Mar 06, 2013 at 09:19:42AM +0100, Michael Weiser wrote:
>
>> > >> Support determining the binaries' installation path at runtime even if
>> > >> called without any path components (i.e. via search path).
>> > The default for any change is not to include it.  Is there any
>> > reason why we want this change?
>> It makes a binary git installation fully relocatable. Seeing how git
>> already has basic support for it I thought other people might be
>> interested in this.
>
> I am still interested in getting this accepted into git. Where do I push
> to get it committed?

I do not have a strong objection to what it tries to achieve, but I'd prefer to see no "#ifdef platform" code in a very generic part of the system like exec_cmd.

Erik Faye-Lund· Apr 16, 2013, 15:18 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

On Wed, Mar 6, 2013 at 9:19 AM, Michael Weiser <M.Weiser@science-computing.de> wrote:

Show 13 quoted lines
> Hello Junio,
>
> On Tue, Mar 05, 2013 at 08:13:50AM -0800, Junio C Hamano wrote:
>
>> >> Support determining the binaries' installation path at runtime even if
>> >> called without any path components (i.e. via search path).
>
>> The default for any change is not to include it.  Is there any
>> reason why we want this change?
>
> It makes a binary git installation fully relocatable. Seeing how git
> already has basic support for it I thought other people might be
> interested in this.

I think the motivation for the feature in the first place is Windows, where the installation path isn't known at build-time. In the unix-world, this is generally known (/usr/bin or something like that). What's the reason you want it on other platforms?

Michael Weiser· Apr 17, 2013, 06:06 UTC · re: Erik Faye-Lund · lore

Re: [PATCH] Extend runtime prefix computation

Hello Erik,
On Tue, Apr 16, 2013 at 05:18:49PM +0200, Erik Faye-Lund wrote:
Show 6 quoted lines
> >> >> Support determining the binaries' installation path at runtime even if
> >> >> called without any path components (i.e. via search path).
> I think the motivation for the feature in the first place is Windows,
> where the installation path isn't known at build-time. In the
> unix-world, this is generally known (/usr/bin or something like that).
> What's the reason you want it on other platforms?

It's part of an in-house development toolchain featuring git that I want to hand to users as a binary installation for a number of platforms but give them the choice where to install it.

Secondly, once the infrastructure is in place, it's easier to do or enhance relocatability support for other platforms such as Windows.

Finally: Others do it. Perl's done it and I've already needed that as
well - on Mac OS X.
Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
Michael Weiser· Oct 4, 2013, 13:32 UTC · re: Michael Weiser · lore

Re: [PATCH] Extend runtime prefix computation

Hi,
On Wed, Apr 17, 2013 at 08:06:47AM +0200, Michael Weiser wrote:
> > >> >> Support determining the binaries' installation path at runtime even if
> > >> >> called without any path components (i.e. via search path).
> > What's the reason you want it on other platforms?
> It's part of an in-house development toolchain featuring git that I want
> to hand to users as a binary installation for a number of platforms but
> give them the choice where to install it.

I'd still like to have this included in mainline git. What can I do to get it there?

Thanks,
-- 
Michael Weiser                science + computing ag
Senior Systems Engineer       Geschaeftsstelle Duesseldorf
                              Martinstrasse 47-55, Haus A
phone: +49 211 302 708 32     D-40223 Duesseldorf
fax:   +49 211 302 708 50     www.science-computing.de
-- 
Vorstandsvorsitzender/Chairman of the board of management:
Gerd-Lothar Leonhart
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Michael Heinrichs, 
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Philippe Miltin
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196

← back to recent threads