From: "H.Yamamoto" Date: 2006-01-31T20:44:18+09:00 Subject: [ruby-dev:28288] Re: [PATCH] solaris 10 isinf and ruby_setenv fixes 山本です。 待ちくたびれたので、特に反対がなければこれをコミットしようと思います。 setenv と unsetenv がない環境では、set_arg0 で environ を 使うコードを残すようにしました。これなら何かあっても元に戻しやすいでしょうし。 # setenv に 2引数の時代があったという裏付けを取ろうと # google で大分調べたのですが、見つかりませんでした。 # 他のプログラムの configure でも単に HAVE_SETENV となってる # ものばかりなので、unsetenv 同様の調べかたでいいのかもしれません。 Index: configure.in =================================================================== RCS file: /src/ruby/configure.in,v retrieving revision 1.297 diff -u -w -b -p -r1.297 configure.in --- configure.in 25 Jan 2006 13:29:44 -0000 1.297 +++ configure.in 31 Jan 2006 11:12:18 -0000 @@ -506,7 +506,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid getpriority getrlimit setrlimit\ dlopen sigprocmask sigaction _setjmp vsnprintf snprintf\ setsid telldir seekdir fchmod mktime timegm cosh sinh tanh\ - setuid setgid daemon select_large_fdset) + setuid setgid daemon select_large_fdset unsetenv) AC_ARG_ENABLE(setreuid, [ --enable-setreuid use setreuid()/setregid() according to need even if obsolete.], [use_setreuid=$enableval]) @@ -514,6 +514,20 @@ if test "$use_setreuid" = yes; then AC_DEFINE(USE_SETREUID) AC_DEFINE(USE_SETREGID) fi +AC_CACHE_CHECK(for setenv (2 arguments), rb_cv_have_setenv_2args, + [AC_TRY_COMPILE([#include ], [setenv("foo", "foo");], + rb_cv_have_setenv_2args=yes, + rb_cv_have_setenv_2args=no)]) +if test "$rb_cv_have_setenv_2args" = yes; then + AC_DEFINE(HAVE_SETENV_2ARGS) +fi +AC_CACHE_CHECK(for setenv (3 arguments), rb_cv_have_setenv_3args, + [AC_TRY_COMPILE([#include ], [setenv("foo", "foo", 1);], + rb_cv_have_setenv_3args=yes, + rb_cv_have_setenv_3args=no)]) +if test "$rb_cv_have_setenv_3args" = yes; then + AC_DEFINE(HAVE_SETENV_3ARGS) +fi AC_STRUCT_TIMEZONE AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff, [AC_TRY_COMPILE([#include ], Index: hash.c =================================================================== RCS file: /src/ruby/hash.c,v retrieving revision 1.159 diff -u -w -b -p -r1.159 hash.c --- hash.c 20 Oct 2005 02:56:22 -0000 1.159 +++ hash.c 31 Jan 2006 11:12:18 -0000 @@ -1690,7 +1690,14 @@ ruby_setenv(const char *name, const char * RTL's environ global variable directly yet. */ SetEnvironmentVariable(name,value); -#elif defined __CYGWIN__ +#elif defined(HAVE_SETENV_2ARGS) && defined(HAVE_UNSETENV) +#undef setenv +#undef unsetenv + if (value) + setenv(name,value); + else + unsetenv(name); +#elif defined(HAVE_SETENV_3ARGS) && defined(HAVE_UNSETENV) #undef setenv #undef unsetenv if (value) Index: ruby.c =================================================================== RCS file: /src/ruby/ruby.c,v retrieving revision 1.112 diff -u -w -b -p -r1.112 ruby.c --- ruby.c 12 Dec 2005 00:35:08 -0000 1.112 +++ ruby.c 31 Jan 2006 11:06:15 -0000 @@ -987,7 +987,15 @@ VALUE rb_progname; VALUE rb_argv; VALUE rb_argv0; -#if !defined(PSTAT_SETCMD) && !defined(HAVE_SETPROCTITLE) && !defined(DOSISH) +#if defined(PSTAT_SETCMD) || defined(HAVE_SETPROCTITLE) +#elif defined(_WIN32) +#elif defined(HAVE_SETENV_2ARGS) && defined(HAVE_UNSETENV) +#elif defined(HAVE_SETENV_3ARGS) && defined(HAVE_UNSETENV) +#else +#define USE_ENVSPACE_FOR_ARG0 +#endif + +#ifdef USE_ENVSPACE_FOR_ARG0 static struct { char *begin, *end; } envspace; @@ -1061,7 +1069,7 @@ set_arg0(VALUE val, ID id) break; } } -#ifndef DOSISH +#ifdef USE_ENVSPACE_FOR_ARG0 if (s + 1 == envspace.begin) { s = envspace.end; ruby_setenv("", NULL); /* duplicate environ vars */