Skip to content

Commit e40b61f

Browse files
Jason RiedyJunio C Hamano
authored andcommitted
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 <ejr@cs.berkeley.edu> Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 7057463 commit e40b61f

File tree

3 files changed

+53
-9
lines changed

3 files changed

+53
-9
lines changed

Makefile

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ all:
2121
#
2222
# Define NO_STRCASESTR if you don't have strcasestr.
2323
#
24+
# Define NO_SETENV if you don't have setenv in the C library.
25+
#
2426
# Define PPC_SHA1 environment variable when running make to make use of
2527
# a bundled SHA1 routine optimized for PowerPC.
2628
#
@@ -194,6 +196,7 @@ shellquote = '$(call shq,$(1))'
194196
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
195197
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
196198
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
199+
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
197200

198201
ifeq ($(uname_S),Darwin)
199202
NEEDS_SSL_WITH_CRYPTO = YesPlease
@@ -211,6 +214,9 @@ ifeq ($(uname_S),SunOS)
211214
NEEDS_LIBICONV = YesPlease
212215
SHELL_PATH = /bin/bash
213216
NO_STRCASESTR = YesPlease
217+
ifeq ($(uname_R),5.8)
218+
NO_SETENV = YesPlease
219+
endif
214220
INSTALL = ginstall
215221
TAR = gtar
216222
ALL_CFLAGS += -D__EXTENSIONS__
@@ -314,12 +320,16 @@ ifdef NEEDS_NSL
314320
SIMPLE_LIB += -lnsl
315321
endif
316322
ifdef NO_STRCASESTR
317-
ALL_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1
318-
LIB_OBJS += compat/strcasestr.o
323+
COMPAT_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1
324+
COMPAT_OBJS += compat/strcasestr.o
325+
endif
326+
ifdef NO_SETENV
327+
COMPAT_CFLAGS += -Dsetenv=gitsetenv -DNO_SETENV=1
328+
COMPAT_OBJS += compat/setenv.o
319329
endif
320330
ifdef NO_MMAP
321-
ALL_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
322-
LIB_OBJS += compat/mmap.o
331+
COMPAT_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
332+
COMPAT_OBJS += compat/mmap.o
323333
endif
324334
ifdef NO_IPV6
325335
ALL_CFLAGS += -DNO_IPV6 -Dsockaddr_storage=sockaddr_in
@@ -343,8 +353,8 @@ endif
343353
endif
344354
endif
345355

346-
ALL_CFLAGS += -DSHA1_HEADER=$(call shellquote,$(SHA1_HEADER))
347-
356+
ALL_CFLAGS += -DSHA1_HEADER=$(call shellquote,$(SHA1_HEADER)) $(COMPAT_CFLAGS)
357+
LIB_OBJS += $(COMPAT_OBJS)
348358
export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir
349359
### Build rules
350360

@@ -353,10 +363,9 @@ all: $(ALL_PROGRAMS)
353363
all:
354364
$(MAKE) -C templates
355365

356-
# Only use $(CFLAGS). We don't need anything else.
357-
git$(X): git.c Makefile
366+
git$(X): git.c $(COMPAT_OBJS) Makefile
358367
$(CC) -DGIT_EXEC_PATH='"$(bindir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \
359-
$(CFLAGS) $< -o $@
368+
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(filter %.o,$^)
360369

361370
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
362371
rm -f $@

compat/setenv.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <stdlib.h>
2+
#include <string.h>
3+
4+
int gitsetenv(const char *name, const char *value, int replace)
5+
{
6+
int out;
7+
size_t namelen, valuelen;
8+
char *envstr;
9+
10+
if (!name || !value) return -1;
11+
if (!replace) {
12+
char *oldval = NULL;
13+
oldval = getenv(name);
14+
if (oldval) return 0;
15+
}
16+
17+
namelen = strlen(name);
18+
valuelen = strlen(value);
19+
envstr = malloc((namelen + valuelen + 2) * sizeof(char));
20+
if (!envstr) return -1;
21+
22+
memcpy(envstr, name, namelen);
23+
envstr[namelen] = '=';
24+
memcpy(envstr + namelen + 1, value, valuelen);
25+
envstr[namelen + valuelen + 1] = 0;
26+
27+
out = putenv(envstr);
28+
29+
free(envstr);
30+
return out;
31+
}

git.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
# define PATH_MAX 4096
1414
#endif
1515

16+
#ifdef NO_SETENV
17+
extern int gitsetenv(char *name, char *value, int overwrite);
18+
#endif
19+
1620
static const char git_usage[] =
1721
"Usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ ARGS ]";
1822

0 commit comments

Comments
 (0)