From: Junio C Hamano Date: Tue, 15 Nov 2005 23:45:37 GMT Subject: Re: [PATCH 1/3] C implementation of the 'git' program, take two. Message-ID: <7vwtj9eaqm.fsf@assigned-by-dhcp.cox.net> In-Reply-To: <20051115233125.3153B5BF76@nox.op5.se> exon@op5.se (Andreas Ericsson) writes: > This patch provides a C implementation of the 'git' program and > introduces support for putting the git-* commands in a directory > of their own. Very nice, thanks. Two questions and a half. > +static void prepend_to_path(const char *dir, int len) > +{ > + char *path, *old_path = getenv("PATH"); > + int path_len = len; > + > + if (!old_path) > + old_path = "/bin:/usr/bin:."; This is to cover strange case and probably would not matter in practice, but perhaps without current directory? > +int main(int argc, char **argv, char **envp) > +{ > + char git_command[PATH_MAX + 1]; > + char wd[PATH_MAX + 1]; > + int i, len, show_help = 0; > + char *exec_path = getenv("GIT_EXEC_PATH"); > + > + getcwd(wd, PATH_MAX); > +... > + /* allow relative paths, but run with exact */ > + if (chdir(exec_path)) { > + printf("git: '%s': %s\n", exec_path, strerror(errno)); > + exit (1); > + } > + > + getcwd(git_command, sizeof(git_command)); > + chdir(wd); Can we always come back from where we started? > + > + len = strlen(git_command); > + prepend_to_path(git_command, len); > + > + strncat(&git_command[len], "/git-", sizeof(git_command) - len); > + len += 5; > + strncat(&git_command[len], argv[i], sizeof(git_command) - len); > + > + if (access(git_command, X_OK)) > + usage(exec_path, "'%s' is not a git-command", argv[i]); > + > + /* execve() can only ever return if it fails */ > + execve(git_command, &argv[i], envp); Shell version for Cygwin seems to do ".exe" at the end --- does it matter?