From 10b15b86f545e081aebba8783ad9e9acf6bf0d98 Mon Sep 17 00:00:00 2001 From: Alex Riesen Date: Thu, 1 Dec 2005 13:48:35 +0100 Subject: git wrapper: more careful argument stuffing - Use stderr for error output - Build git_command more careful - ENOENT is good enough for check of failed exec to show usage, no access() check needed [jc: Originally from Alex Riesen with inputs from Sven Verdoolaege mixed in.] Signed-off-by: Junio C Hamano --- git.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'git.c') diff --git a/git.c b/git.c index 0b10b6e781..878c359704 100644 --- a/git.c +++ b/git.c @@ -283,16 +283,21 @@ int main(int argc, char **argv, char **envp) 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]); + len += snprintf(git_command + len, sizeof(git_command) - len, + "/git-%s", argv[i]); + if (sizeof(git_command) <= len) { + fprintf(stderr, "git: command name given is too long (%d)\n", len); + exit(1); + } /* execve() can only ever return if it fails */ execve(git_command, &argv[i], envp); - printf("Failed to run command '%s': %s\n", git_command, strerror(errno)); + + if (errno == ENOENT) + usage(exec_path, "'%s' is not a git-command", argv[i]); + + fprintf(stderr, "Failed to run command '%s': %s\n", + git_command, strerror(errno)); return 1; } -- cgit v1.3 From e40b61fb6bd2e0ed2dc4799096fcf4c828c28d6d Mon Sep 17 00:00:00 2001 From: Jason Riedy Date: Fri, 2 Dec 2005 15:08:28 -0800 Subject: Add compat/setenv.c, use in git.c. There is no setenv() in Solaris 5.8. The trivial calls to setenv() were replaced by putenv() in a much earlier patch, but setenv() was used again in git.c. This patch just adds a compat/setenv.c. The rule for building git$(X) also needs to include compat. objects and compiler flags. Those are now in makefile vars COMPAT_OBJS and COMPAT_CFLAGS. Signed-off-by: E. Jason Riedy Signed-off-by: Junio C Hamano --- Makefile | 27 ++++++++++++++++++--------- compat/setenv.c | 31 +++++++++++++++++++++++++++++++ git.c | 4 ++++ 3 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 compat/setenv.c (limited to 'git.c') diff --git a/Makefile b/Makefile index 45db357cc2..df3c6eb81e 100644 --- a/Makefile +++ b/Makefile @@ -21,6 +21,8 @@ all: # # Define NO_STRCASESTR if you don't have strcasestr. # +# Define NO_SETENV if you don't have setenv in the C library. +# # Define PPC_SHA1 environment variable when running make to make use of # a bundled SHA1 routine optimized for PowerPC. # @@ -194,6 +196,7 @@ shellquote = '$(call shq,$(1))' uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not') uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') +uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') ifeq ($(uname_S),Darwin) NEEDS_SSL_WITH_CRYPTO = YesPlease @@ -211,6 +214,9 @@ ifeq ($(uname_S),SunOS) NEEDS_LIBICONV = YesPlease SHELL_PATH = /bin/bash NO_STRCASESTR = YesPlease + ifeq ($(uname_R),5.8) + NO_SETENV = YesPlease + endif INSTALL = ginstall TAR = gtar ALL_CFLAGS += -D__EXTENSIONS__ @@ -314,12 +320,16 @@ ifdef NEEDS_NSL SIMPLE_LIB += -lnsl endif ifdef NO_STRCASESTR - ALL_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1 - LIB_OBJS += compat/strcasestr.o + COMPAT_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1 + COMPAT_OBJS += compat/strcasestr.o +endif +ifdef NO_SETENV + COMPAT_CFLAGS += -Dsetenv=gitsetenv -DNO_SETENV=1 + COMPAT_OBJS += compat/setenv.o endif ifdef NO_MMAP - ALL_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP - LIB_OBJS += compat/mmap.o + COMPAT_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP + COMPAT_OBJS += compat/mmap.o endif ifdef NO_IPV6 ALL_CFLAGS += -DNO_IPV6 -Dsockaddr_storage=sockaddr_in @@ -343,8 +353,8 @@ endif endif endif -ALL_CFLAGS += -DSHA1_HEADER=$(call shellquote,$(SHA1_HEADER)) - +ALL_CFLAGS += -DSHA1_HEADER=$(call shellquote,$(SHA1_HEADER)) $(COMPAT_CFLAGS) +LIB_OBJS += $(COMPAT_OBJS) export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir ### Build rules @@ -353,10 +363,9 @@ all: $(ALL_PROGRAMS) all: $(MAKE) -C templates -# Only use $(CFLAGS). We don't need anything else. -git$(X): git.c Makefile +git$(X): git.c $(COMPAT_OBJS) Makefile $(CC) -DGIT_EXEC_PATH='"$(bindir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \ - $(CFLAGS) $< -o $@ + $(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(filter %.o,$^) $(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh rm -f $@ diff --git a/compat/setenv.c b/compat/setenv.c new file mode 100644 index 0000000000..94acd2da9e --- /dev/null +++ b/compat/setenv.c @@ -0,0 +1,31 @@ +#include +#include + +int gitsetenv(const char *name, const char *value, int replace) +{ + int out; + size_t namelen, valuelen; + char *envstr; + + if (!name || !value) return -1; + if (!replace) { + char *oldval = NULL; + oldval = getenv(name); + if (oldval) return 0; + } + + namelen = strlen(name); + valuelen = strlen(value); + envstr = malloc((namelen + valuelen + 2) * sizeof(char)); + if (!envstr) return -1; + + memcpy(envstr, name, namelen); + envstr[namelen] = '='; + memcpy(envstr + namelen + 1, value, valuelen); + envstr[namelen + valuelen + 1] = 0; + + out = putenv(envstr); + + free(envstr); + return out; +} diff --git a/git.c b/git.c index 878c359704..619f25acf5 100644 --- a/git.c +++ b/git.c @@ -13,6 +13,10 @@ # define PATH_MAX 4096 #endif +#ifdef NO_SETENV +extern int gitsetenv(char *name, char *value, int overwrite); +#endif + static const char git_usage[] = "Usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ ARGS ]"; -- cgit v1.3