* [PATCH] Add compat/setenv.c, use in git.c.
@ 2005-12-02 23:08 Jason Riedy
2005-12-04 6:26 ` Junio C Hamano
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Jason Riedy @ 2005-12-02 23:08 UTC (permalink / raw)
To: git
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>
---
Makefile | 27 ++++++++++++++++++---------
compat/setenv.c | 31 +++++++++++++++++++++++++++++++
git.c | 4 ++++
3 files changed, 53 insertions(+), 9 deletions(-)
create mode 100644 compat/setenv.c
applies-to: fc206c1ad60cfb6481cc51f6737ce728d1d8d83f
4bbc94c80d34b1ef859dd92254284198b0c3c2b6
diff --git a/Makefile b/Makefile
index 45db357..df3c6eb 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 0000000..94acd2d
--- /dev/null
+++ b/compat/setenv.c
@@ -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;
+}
diff --git a/git.c b/git.c
index 878c359..619f25a 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 ]";
---
0.99.9h
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-02 23:08 [PATCH] Add compat/setenv.c, use in git.c Jason Riedy
@ 2005-12-04 6:26 ` Junio C Hamano
2005-12-04 21:07 ` H. Peter Anvin
2005-12-04 23:01 ` [PATCH] compat/setenv: do not free what we fed putenv(3) Junio C Hamano
2 siblings, 0 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-12-04 6:26 UTC (permalink / raw)
To: Jason Riedy; +Cc: git
Jason Riedy <ejr@EECS.Berkeley.EDU> writes:
> 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.
Thanks for the cleanup. Looks much saner.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-02 23:08 [PATCH] Add compat/setenv.c, use in git.c Jason Riedy
2005-12-04 6:26 ` Junio C Hamano
@ 2005-12-04 21:07 ` H. Peter Anvin
2005-12-04 22:24 ` Junio C Hamano
2005-12-04 22:31 ` Junio C Hamano
2005-12-04 23:01 ` [PATCH] compat/setenv: do not free what we fed putenv(3) Junio C Hamano
2 siblings, 2 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-12-04 21:07 UTC (permalink / raw)
To: Jason Riedy; +Cc: git
Jason Riedy wrote:
> +
> +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;
> +}
Wouldn't this be a good case for using alloca()?
-hpa
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-04 21:07 ` H. Peter Anvin
@ 2005-12-04 22:24 ` Junio C Hamano
2005-12-04 22:31 ` Junio C Hamano
1 sibling, 0 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-12-04 22:24 UTC (permalink / raw)
To: H. Peter Anvin; +Cc: Jason Riedy, git
"H. Peter Anvin" <hpa@zytor.com> writes:
> Wouldn't this be a good case for using alloca()?
Perhaps, but considering that (1) this function is not something
frequently called anyway, and (2) the proposed change would make
it the first alloca() user, and (3) this is compatibility
replacement function, I'd rather choose to keep it "old, known
to work at more places" malloc/free pair, and not having to
worry about it.
But now you quote the patch, sizeof(char) looks funny. Isn't it
always 1 by definition?
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-04 21:07 ` H. Peter Anvin
2005-12-04 22:24 ` Junio C Hamano
@ 2005-12-04 22:31 ` Junio C Hamano
2005-12-04 23:34 ` H. Peter Anvin
2005-12-05 18:07 ` Jason Riedy
1 sibling, 2 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-12-04 22:31 UTC (permalink / raw)
To: H. Peter Anvin; +Cc: Jason Riedy, git
"H. Peter Anvin" <hpa@zytor.com> writes:
> Jason Riedy wrote:
>> +
>> +int gitsetenv(const char *name, const char *value, int replace)
>> +{
>> +...
>> + envstr = malloc((namelen + valuelen + 2) * sizeof(char));
>> +...
>> + out = putenv(envstr);
>> +
>> + free(envstr);
>> + return out;
>> +}
>
> Wouldn't this be a good case for using alloca()?
Oops. Isn't the patch itself wrong, so is using alloca()?
putenv(3) says
int putenv(char *string);
The string pointed to by string becomes part of the environment,
so altering the string changes the environment.
which tell sme that whatever we pass to putenv() we should *not*
free.
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH] compat/setenv: do not free what we fed putenv(3).
2005-12-02 23:08 [PATCH] Add compat/setenv.c, use in git.c Jason Riedy
2005-12-04 6:26 ` Junio C Hamano
2005-12-04 21:07 ` H. Peter Anvin
@ 2005-12-04 23:01 ` Junio C Hamano
2 siblings, 0 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-12-04 23:01 UTC (permalink / raw)
To: git
Signed-off-by: Junio C Hamano <junkio@cox.net>
---
compat/setenv.c | 8 ++++++--
1 files changed, 6 insertions(+), 2 deletions(-)
3a2674337c12e958f8c697af991a0ef6c06ddd4d
diff --git a/compat/setenv.c b/compat/setenv.c
index 94acd2d..b7d7678 100644
--- a/compat/setenv.c
+++ b/compat/setenv.c
@@ -16,7 +16,7 @@ int gitsetenv(const char *name, const ch
namelen = strlen(name);
valuelen = strlen(value);
- envstr = malloc((namelen + valuelen + 2) * sizeof(char));
+ envstr = malloc((namelen + valuelen + 2));
if (!envstr) return -1;
memcpy(envstr, name, namelen);
@@ -25,7 +25,11 @@ int gitsetenv(const char *name, const ch
envstr[namelen + valuelen + 1] = 0;
out = putenv(envstr);
+ /* putenv(3) makes the argument string part of the environment,
+ * and changing that string modifies the environment --- which
+ * means we do not own that storage anymore. Do not free
+ * envstr.
+ */
- free(envstr);
return out;
}
--
0.99.9.GIT
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-04 22:31 ` Junio C Hamano
@ 2005-12-04 23:34 ` H. Peter Anvin
2005-12-05 18:07 ` Jason Riedy
1 sibling, 0 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-12-04 23:34 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Jason Riedy, git
Junio C Hamano wrote:
>
> Oops. Isn't the patch itself wrong, so is using alloca()?
>
> putenv(3) says
>
> int putenv(char *string);
>
> The string pointed to by string becomes part of the environment,
> so altering the string changes the environment.
>
> which tell sme that whatever we pass to putenv() we should *not*
> free.
Indeed.
-hpa
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-04 22:31 ` Junio C Hamano
2005-12-04 23:34 ` H. Peter Anvin
@ 2005-12-05 18:07 ` Jason Riedy
2005-12-05 18:39 ` H. Peter Anvin
2005-12-06 3:35 ` Junio C Hamano
1 sibling, 2 replies; 15+ messages in thread
From: Jason Riedy @ 2005-12-05 18:07 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
And Junio C Hamano writes:
- putenv(3) says
- The string pointed to by string becomes part of the environment,
- so altering the string changes the environment.
Good catch, thanks. The Solaris man page first says the
string space is "no longer used", but at the very end warns
against using an automatic variable. Chalk one up for lousy
docs.
(And sizeof(char) is just habit; 99% of my mallocs aren't of
char... Sorry.)
Jason
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-05 18:07 ` Jason Riedy
@ 2005-12-05 18:39 ` H. Peter Anvin
2005-12-06 3:35 ` Junio C Hamano
1 sibling, 0 replies; 15+ messages in thread
From: H. Peter Anvin @ 2005-12-05 18:39 UTC (permalink / raw)
To: Jason Riedy; +Cc: Junio C Hamano, git
Jason Riedy wrote:
> And Junio C Hamano writes:
> - putenv(3) says
> - The string pointed to by string becomes part of the environment,
> - so altering the string changes the environment.
>
> Good catch, thanks. The Solaris man page first says the
> string space is "no longer used", but at the very end warns
> against using an automatic variable. Chalk one up for lousy
> docs.
>
> (And sizeof(char) is just habit; 99% of my mallocs aren't of
> char... Sorry.)
>
Personally I consider it a serious bug in the C language that
sizeof(char) == 1 by definition. It basically prohibits a whole lot of
useful machine models.
-hpa
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-05 18:07 ` Jason Riedy
2005-12-05 18:39 ` H. Peter Anvin
@ 2005-12-06 3:35 ` Junio C Hamano
2005-12-06 19:59 ` Jason Riedy
1 sibling, 1 reply; 15+ messages in thread
From: Junio C Hamano @ 2005-12-06 3:35 UTC (permalink / raw)
To: Jason Riedy; +Cc: git
Jason Riedy <ejr@EECS.Berkeley.EDU> writes:
> And Junio C Hamano writes:
> - putenv(3) says
> - The string pointed to by string becomes part of the environment,
> - so altering the string changes the environment.
>
> Good catch, thanks. The Solaris man page first says the
> string space is "no longer used", but at the very end warns
> against using an automatic variable. Chalk one up for lousy
> docs.
Same thing for 5.9.
With the "compat update" patch from last night, I managed to
build on a borrowed sparc with Solaris 5.9, but I needed
NO_SETENV myself. I'd like to throw in another Makefile patch
to catch both 5.8 and 5.9 for this, but would appreciate if
people with various vintage of Solaris boxes can give some
inputs before doing that.
This was done with somewhat stripped down configuration. I had
to say NO_EXPAT, libiconv was needed but iconv and openssl were
installed at nonstandard places, python was 2.3 so I also said
PYTHON_PATH and WITH_OWN_SUBPROCESS_PY from the make command
line. But the borrowed box is not what I administer myself, so
I declare victory for now.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-06 3:35 ` Junio C Hamano
@ 2005-12-06 19:59 ` Jason Riedy
2005-12-06 21:10 ` Morten Welinder
0 siblings, 1 reply; 15+ messages in thread
From: Jason Riedy @ 2005-12-06 19:59 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
And Junio C Hamano writes:
- I'd like to throw in another Makefile patch to catch both 5.8 and
- 5.9 for this, but would appreciate if people with various vintage
- of Solaris boxes can give some inputs before doing that.
Anyone else seeing the qsort in object.c trash memory? The
input _looks_ correct. I only see this on Solaris (8), but
I've never had a problem with qsort there. I think we have
a Solaris 9 box around here somewhere, but probably only
partially 9. The admins here are too busy fixing Windows to
maintain anything else properly.
- This was done with somewhat stripped down configuration.
Once I replace the qsort (with an insertion sort), almost all
the tests work with my odd-ball but full configuration. I'm
having some problems with cpio in the push tests, but it's
just some path issue for my setup. When I run the same
commands by hand, they work.
I'll test this on AIX again soon.
Jason
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-06 19:59 ` Jason Riedy
@ 2005-12-06 21:10 ` Morten Welinder
2005-12-06 21:41 ` Junio C Hamano
0 siblings, 1 reply; 15+ messages in thread
From: Morten Welinder @ 2005-12-06 21:10 UTC (permalink / raw)
To: Jason Riedy; +Cc: Junio C Hamano, git
The code looks wrong. It assumes that pointers are no larger than ints.
If pointers are larger than ints, the code does not necessarily compute
a consistent ordering and qsort is allowed to do whatever it wants.
Morten
static int compare_object_pointers(const void *a, const void *b)
{
const struct object * const *pa = a;
const struct object * const *pb = b;
return *pa - *pb;
}
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-06 21:10 ` Morten Welinder
@ 2005-12-06 21:41 ` Junio C Hamano
2005-12-06 22:18 ` Jason Riedy
2005-12-07 0:58 ` Morten Welinder
0 siblings, 2 replies; 15+ messages in thread
From: Junio C Hamano @ 2005-12-06 21:41 UTC (permalink / raw)
To: Morten Welinder; +Cc: git
Morten Welinder <mwelinder@gmail.com> writes:
> The code looks wrong. It assumes that pointers are no larger than ints.
> If pointers are larger than ints, the code does not necessarily compute
> a consistent ordering and qsort is allowed to do whatever it wants.
>
> Morten
>
>
>
> static int compare_object_pointers(const void *a, const void *b)
> {
> const struct object * const *pa = a;
> const struct object * const *pb = b;
> return *pa - *pb;
> }
Are you suggesting it to be done like this?
---
git diff
diff --git a/object.c b/object.c
index 427e14c..dac5c92 100644
--- a/object.c
+++ b/object.c
@@ -82,7 +82,12 @@ static int compare_object_pointers(const
{
const struct object * const *pa = a;
const struct object * const *pb = b;
- return *pa - *pb;
+ if (*pa == *pb)
+ return 0;
+ else if (*pa < *pb)
+ return -1;
+ else
+ return 1;
}
void set_object_refs(struct object *obj, struct object_refs *refs)
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-06 21:41 ` Junio C Hamano
@ 2005-12-06 22:18 ` Jason Riedy
2005-12-07 0:58 ` Morten Welinder
1 sibling, 0 replies; 15+ messages in thread
From: Jason Riedy @ 2005-12-06 22:18 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
And Morten Welinder writes:
- The code looks wrong. It assumes that pointers are no larger than ints.
The failure's in 32-bit mode, so they _are_ the same size.
The difference is no more than 0x80 in the tests.
But you're right; the result is implementation defined in
C99.
And Junio C Hamano writes:
- Are you suggesting it to be done like this?
Your change fixed it. Oddly enough, using arithmetic in
ptrdiff_t then testing against zero didn't... I don't
have time to dig through assembly or try different gcc
versions to figure out the real problem. ugh.
Jason
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Add compat/setenv.c, use in git.c.
2005-12-06 21:41 ` Junio C Hamano
2005-12-06 22:18 ` Jason Riedy
@ 2005-12-07 0:58 ` Morten Welinder
1 sibling, 0 replies; 15+ messages in thread
From: Morten Welinder @ 2005-12-07 0:58 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
> Are you suggesting it to be done like this?
Precisely.
Morten
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2005-12-07 0:58 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-12-02 23:08 [PATCH] Add compat/setenv.c, use in git.c Jason Riedy
2005-12-04 6:26 ` Junio C Hamano
2005-12-04 21:07 ` H. Peter Anvin
2005-12-04 22:24 ` Junio C Hamano
2005-12-04 22:31 ` Junio C Hamano
2005-12-04 23:34 ` H. Peter Anvin
2005-12-05 18:07 ` Jason Riedy
2005-12-05 18:39 ` H. Peter Anvin
2005-12-06 3:35 ` Junio C Hamano
2005-12-06 19:59 ` Jason Riedy
2005-12-06 21:10 ` Morten Welinder
2005-12-06 21:41 ` Junio C Hamano
2005-12-06 22:18 ` Jason Riedy
2005-12-07 0:58 ` Morten Welinder
2005-12-04 23:01 ` [PATCH] compat/setenv: do not free what we fed putenv(3) Junio C Hamano
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.