git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] report which $PATH entry had trouble running execvp(3)

From
Jeff King <peff@peff.net>
Date
Apr 20, 2011, 05:51 UTC
Message-ID
<20110420055111.GB28597@sigill.intra.peff.net>
In-Reply-To
<7vaafl371q.fsf_-_@alter.siamese.dyndns.org>
On Tue, Apr 19, 2011 at 09:01:21PM -0700, Junio C Hamano wrote:
Show 8 quoted lines
> You can add your own custom subcommand 'frotz' to the system by adding
> 'git-frotz' in a directory somewhere in your $PATH environment variable.
> When you ask "git frotz" from the command line, "git-frotz" is run via
> execvp(3).
> [...]
> we do not report 'git-frotz' in which directory we had trouble with.
> We could do better if we implemented the command search behaviour of
> execvp(3) ourselves.

I like the idea of giving the user more information about which git-frotz was the problem. Usually there is just one, and pointing them to it saves them time.

But what about the case of
  mkdir one two
  touch one/frotz two/frotz
  PATH=one:two:$PATH

We would report two/frotz, but might it be even better to say "we found 2 frotzes, but neither of them were executable"?

I don't know if it is worth the effort for such a weird corner case.
> Three plausible scenarios that the execvp(3) would fail for us are:
> 
>  * The first 'git-frotz' found in a directory on $PATH was not a proper
>    executable binary, and we got "Exec format error" (ENOEXEC);

What about the magic "unknown things get executed as shell scripts" behavior that is implemented by libc's execvp? Your patch has a regression for:

  echo "git log --with-some-options" >local/bin/git-frotz
  chmod +x local/bin/git-frotz
  git frotz

I have always found that behavior slightly insane, but it is well-established, and your sane_execvp breaks anybody who is depending on it.

Show 9 quoted lines
> @@ -278,7 +324,7 @@ fail_pipe:
>  		} else if (cmd->use_shell) {
>  			execv_shell_cmd(cmd->argv);
>  		} else {
> -			execvp(cmd->argv[0], (char *const*) cmd->argv);
> +			cmd->argv[0] = sane_execvp(cmd->argv[0], cmd->argv);
>  		}
>  		/*
>  		 * Do not check for cmd->silent_exec_failure; the parent

This is inside "#ifndef WIN32". Presumably people on Windows want it, too. In fact, they already have their own execvp in compat/mingw.c. It might make sense to bring the implementations together. Or perhaps not. Theirs is quite different; it does a search of PATH itself, looking for executables (and magically appending ".exe"), and then exec's the result. On the other hand, doing that PATH lookup, deciding you have something, and _then_ exec'ing can be convenient. IIRC, there are a few warts in the git wrapper that could be improved by doing that, but I don't recall the specifics anymore (maybe something like handling the pager between the momemnt when we decide a command exists and when we exec?).

-Peff
Previous: Junio C HamanoNext: Junio C Hamano
Message 17 of 20 in “[REGRESSION] git-wrapper to run-commands codepath regression”
  1. Junio C HamanoApr 18, 2011
  2. Jeff KingApr 18, 2011
  3. Jeff KingApr 18, 2011
  4. Junio C HamanoApr 18, 2011
  5. Jeff KingApr 18, 2011
  6. Junio C HamanoApr 18, 2011
  7. Andreas SchwabApr 18, 2011
  8. Junio C HamanoApr 18, 2011
  9. Jonathan NiederApr 18, 2011
  10. run-command: write full error message in die_childJonathan Nieder, Apr 19, 2011
  11. Johannes SixtApr 20, 2011
  12. 0/2 Re: run-command: write full error message in die_childJonathan Nieder, Apr 20, 2011
  13. 1/2 tests: check error message from run_commandJonathan Nieder, Apr 20, 2011
  14. 2/2 run-command: handle short writes and EINTR in die_childJonathan Nieder, Apr 20, 2011
  15. Junio C HamanoApr 19, 2011
  16. report which $PATH entry had trouble running execvp(3)Junio C Hamano, Apr 20, 2011
  17. Jeff KingApr 20, 2011
  18. Junio C HamanoApr 21, 2011
  19. Johannes SixtApr 20, 2011
  20. Jonathan NiederApr 20, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.