diff --git a/ChangeLog b/ChangeLog index dd8e50cf22..c7edf6cd36 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,44 @@ +Tue Nov 13 17:25:44 2001 Usaku Nakamura + + * hash.c (envix): merge from 1.7: use GET_ENVIRON and FREE_ENVIRON to + get environment variables list. + + * hash.c (env_keys): ditto. + + * hash.c (env_each_key): ditto. + + * hash.c (env_values): ditto. + + * hash.c (env_keys): ditto. + + * hash.c (env_each_value): ditto. + + * hash.c (env_each): ditto. + + * hash.c (env_inspect): ditto. + + * hash.c (env_to_a): ditto. + + * hash.c (env_size): ditto. + + * hash.c (env_empty_p): ditto. + + * hash.c (env_has_value): ditto. + + * hash.c (env_index): ditto. + + * hash.c (env_to_hash): ditto. + + * win32/win32.c (win32_getenv): merge from 1.7: use static buffer. + + * win32/win32.c, win32/win32.h (win32_get_environ): merge from 1.7: + get environment variables list. + + * win32/win32.c, win32/win32.h (win32_free_environ): merge from 1.7: + free environment variables list. + + * win32/Makefile.sub: merge from 1.7: add -DLIBRUBY_SO to CPPFLAGS. + Tue Nov 13 14:39:11 2001 WATANABE Tetsuya * signal.c (sighandle): should not re-register sighandler if diff --git a/hash.c b/hash.c index 31c57fe331..985934025f 100644 --- a/hash.c +++ b/hash.c @@ -853,10 +853,18 @@ rb_hash_update(hash1, hash2) static int path_tainted = -1; -#ifndef NT -extern char **environ; -#endif static char **origenviron; +#ifdef NT +#define GET_ENVIRON(e) (e = win32_get_environ()) +#define FREE_ENVIRON(e) win32_free_environ(e) +static char **my_environ; +#undef environ +#define environ my_environ +#else +extern char **environ; +#define GET_ENVIRON(e) (e) +#define FREE_ENVIRON(e) +#endif static VALUE env_delete(obj, name) @@ -965,17 +973,20 @@ envix(nam) char *nam; { register int i, len = strlen(nam); + char **env; - for (i = 0; environ[i]; i++) { + env = GET_ENVIRON(environ); + for (i = 0; env[i]; i++) { if ( #ifdef WIN32 - strnicmp(environ[i],nam,len) == 0 + strnicmp(env[i],nam,len) == 0 #else - memcmp(environ[i],nam,len) == 0 + memcmp(env[i],nam,len) == 0 #endif - && environ[i][len] == '=') + && env[i][len] == '=') break; /* memcmp must come first to avoid */ } /* potential SEGV's */ + FREE_ENVIRON(environ); return i; } @@ -1150,7 +1161,7 @@ env_keys() char **env; VALUE ary = rb_ary_new(); - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1158,6 +1169,7 @@ env_keys() } env++; } + FREE_ENVIRON(environ); return ary; } @@ -1167,7 +1179,7 @@ env_each_key(hash) { char **env; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1175,6 +1187,7 @@ env_each_key(hash) } env++; } + FREE_ENVIRON(environ); return Qnil; } @@ -1184,7 +1197,7 @@ env_values() char **env; VALUE ary = rb_ary_new(); - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1192,6 +1205,7 @@ env_values() } env++; } + FREE_ENVIRON(environ); return ary; } @@ -1201,7 +1215,7 @@ env_each_value(hash) { char **env; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1209,6 +1223,7 @@ env_each_value(hash) } env++; } + FREE_ENVIRON(environ); return Qnil; } @@ -1218,7 +1233,7 @@ env_each(hash) { char **env; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1227,6 +1242,7 @@ env_each(hash) } env++; } + FREE_ENVIRON(environ); return Qnil; } @@ -1276,7 +1292,7 @@ env_inspect() VALUE str = rb_str_new2("{"); VALUE i; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); @@ -1292,6 +1308,7 @@ env_inspect() } env++; } + FREE_ENVIRON(environ); rb_str_cat2(str, "}"); OBJ_TAINT(str); @@ -1304,7 +1321,7 @@ env_to_a() char **env; VALUE ary = rb_ary_new(); - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1313,6 +1330,7 @@ env_to_a() } env++; } + FREE_ENVIRON(environ); return ary; } @@ -1326,16 +1344,26 @@ static VALUE env_size() { int i; + char **env; - for(i=0; environ[i]; i++) + env = GET_ENVIRON(environ); + for(i=0; env[i]; i++) ; + FREE_ENVIRON(environ); return INT2FIX(i); } static VALUE env_empty_p() { - if (environ[0] == 0) return Qtrue; + char **env; + + env = GET_ENVIRON(environ); + if (env[0] == 0) { + FREE_ENVIRON(environ); + return Qtrue; + } + FREE_ENVIRON(environ); return Qfalse; } @@ -1355,15 +1383,18 @@ env_has_value(dmy, value) char **env; if (TYPE(value) != T_STRING) return Qfalse; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '=')+1; if (s) { - if (strncmp(s, RSTRING(value)->ptr, strlen(s)) == 0) + if (strncmp(s, RSTRING(value)->ptr, strlen(s)) == 0) { + FREE_ENVIRON(environ); return Qtrue; + } } env++; } + FREE_ENVIRON(environ); return Qfalse; } @@ -1372,18 +1403,22 @@ env_index(dmy, value) VALUE dmy, value; { char **env; + VALUE str; if (TYPE(value) != T_STRING) return Qnil; - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '=')+1; if (s) { if (strncmp(s, RSTRING(value)->ptr, strlen(s)) == 0) { - return rb_tainted_str_new(*env, s-*env-1); + str = rb_tainted_str_new(*env, s-*env-1); + FREE_ENVIRON(environ); + return str; } } env++; } + FREE_ENVIRON(environ); return Qnil; } @@ -1418,7 +1453,7 @@ env_to_hash() char **env; VALUE hash = rb_hash_new(); - env = environ; + env = GET_ENVIRON(environ); while (*env) { char *s = strchr(*env, '='); if (s) { @@ -1427,6 +1462,7 @@ env_to_hash() } env++; } + FREE_ENVIRON(environ); return hash; } diff --git a/win32/Makefile.sub b/win32/Makefile.sub index 5164bc312a..65838f3160 100644 --- a/win32/Makefile.sub +++ b/win32/Makefile.sub @@ -38,7 +38,7 @@ AUTOCONF = autoconf prefix = /usr CFLAGS = -nologo -DNT=1 -Zi -MD -O2b2xg- -G5 -CPPFLAGS = -I$(srcdir) -I$(srcdir)/missing +CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/missing -DLIBRUBY_SO=\"$(LIBRUBY_SO)\" LDFLAGS = $(CFLAGS) -Fm XLDFLAGS = #EXTLIBS = diff --git a/win32/win32.c b/win32/win32.c index 6d7b917aea..0309ea111e 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -2524,14 +2524,16 @@ wait() char * win32_getenv(const char *name) { - char *curitem = NULL; /* XXX threadead */ - DWORD curlen = 0; /* XXX threadead */ + static char *curitem = NULL; + static DWORD curlen = 0; DWORD needlen; - curlen = 512; - curitem = ALLOC_N(char, curlen); + if (curitem == NULL || curlen == 0) { + curlen = 512; + curitem = ALLOC_N(char, curlen); + } - needlen = GetEnvironmentVariable(name,curitem,curlen); + needlen = GetEnvironmentVariable(name, curitem, curlen); if (needlen != 0) { while (needlen > curlen) { REALLOC_N(curitem, char, needlen); @@ -2961,3 +2963,35 @@ VALUE win32_asynchronize(asynchronous_func_t func, return val; } + +char **win32_get_environ(void) +{ + char *envtop, *env; + char **myenvtop, **myenv; + int num; + + envtop = GetEnvironmentStrings(); + for (env = envtop, num = 0; *env; env += strlen(env) + 1) + if (*env != '=') num++; + + myenvtop = ALLOC_N(char*, num + 1); + for (env = envtop, myenv = myenvtop; *env; env += strlen(env) + 1) { + if (*env != '=') { + *myenv = ALLOC_N(char, strlen(env) + 1); + strcpy(*myenv, env); + myenv++; + } + } + *myenv = NULL; + FreeEnvironmentStrings(envtop); + + return myenvtop; +} + +void win32_free_environ(char **env) +{ + char **t = env; + + while (*t) free(*t++); + free(env); +} diff --git a/win32/win32.h b/win32/win32.h index 4b31e94a95..f3eac8f41a 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -214,6 +214,8 @@ extern struct servent * mygetservbyname(char *, char *); extern struct servent * mygetservbyport(int, char *); extern char *win32_getenv(const char *); extern int myrename(const char *, const char *); +extern char **win32_get_environ(void); +extern void win32_free_environ(char **); extern int chown(const char *, int, int); extern int link(char *, char *);