Signed-off-by: Scott R Parish <srp@xxxxxxxxxxxx> --- git.c | 35 +++++++++++++++++++++++++++++++++-- 1 files changed, 33 insertions(+), 2 deletions(-) diff --git a/git.c b/git.c index 9eaca1d..d129ecc 100644 --- a/git.c +++ b/git.c @@ -28,6 +28,35 @@ static void prepend_to_path(const char *dir, int len) free(path); } +static char *rel_to_abs_exec_path(const char *cmd) { + int len, rc; + char *exec_path = xmalloc(PATH_MAX + 1); + + if (!getcwd(exec_path, PATH_MAX)) { + fprintf(stderr, "git: cannot determine current directory: %s\n", + strerror(errno)); + free(exec_path); + return NULL; + } + len = strlen(exec_path); + + /* Trivial cleanup */ + while (!prefixcmp(cmd, "./")) { + cmd += 2; + while (*cmd == '/') + cmd++; + } + + rc = snprintf(exec_path + len, PATH_MAX - len, "/%s", cmd); + if (rc < 0 || rc >= PATH_MAX - len) { + fprintf(stderr, "git: command name given is too long.\n"); + free(exec_path); + return NULL; + } + + return exec_path; +} + static int handle_options(const char*** argv, int* argc, int* envchanged) { int handled = 0; @@ -409,13 +438,15 @@ int main(int argc, const char **argv) /* * Take the basename of argv[0] as the command * name, and the dirname as the default exec_path - * if it's an absolute path and we don't have - * anything better. + * if we don't have anything better. */ if (slash) { *slash++ = 0; if (*cmd == '/') exec_path = cmd; + else + exec_path = rel_to_abs_exec_path(cmd); + cmd = slash; } -- 1.5.3.GIT - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html