Skip to content

Commit

Permalink
Add compat/setenv.c, use in git.c.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
Jason Riedy authored and Junio C Hamano committed Dec 4, 2005
1 parent 7057463 commit e40b61f
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 9 deletions.
27 changes: 18 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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.
#
Expand Down Expand Up @@ -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
Expand All @@ -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__
Expand Down Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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 $@
Expand Down
31 changes: 31 additions & 0 deletions compat/setenv.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <stdlib.h>
#include <string.h>

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;
}
4 changes: 4 additions & 0 deletions git.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ]";

Expand Down

0 comments on commit e40b61f

Please sign in to comment.