山本です。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/7138 に Solaris 10 で
environ の置き換えを行わないパッチが出ているのですが、http://www.unix.org/single_unix_specification/
で見る限り Solaris 10 以外でも environ を置き換えた場合の挙動は保証しないという
ことのようです。

cygwin と soraris でだけ置き換えをしないよりも、置き換えの必要な環境でだけ置き換えたほうが
いいような気がするのですが、いかがですか?

念のため、導入の経緯などを調べてみました。

  http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/2257
  rbgw で setenv(3) がバグっているため、回避するために自前の setenv を
  実装。rbgw って?MingW の前身でしょうか。いずれにせよ、Windows 固有の
  問題のように見えました。

  http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/10885
  setenv(3) は古い環境では引数が二個、新しい環境では三個で、数がそろって
  いない。

setenv の引数の数は、こんな感じで回避できないでしょうか。見よう見真似で
パッチにしてみました。

Index: configure.in
===================================================================
RCS file: /src/ruby/configure.in,v
retrieving revision 1.212.2.40
diff -u -w -b -p -r1.212.2.40 configure.in
--- configure.in	24 Nov 2005 12:07:18 -0000	1.212.2.40
+++ configure.in	23 Jan 2006 08:53:17 -0000
@@ -398,6 +398,10 @@ bow)		ac_cv_func_setitimer=no
 		;;
 superux*)     ac_cv_func_setitimer=no
               ;;
+solaris*2.10)  ac_cv_func_isinf=yes
+               LIBS="-lm $LIBS"
+              ;;
+
 *) LIBS="-lm $LIBS";;
 esac
 AC_CHECK_LIB(crypt, crypt)
@@ -444,7 +448,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid
 	      lchown lchmod getpgrp setpgrp getpgid setpgid initgroups\
 	      getgroups setgroups getpriority getrlimit dlopen sigprocmask\
 	      sigaction _setjmp setsid telldir seekdir fchmod mktime timegm\
-	      cosh sinh tanh setuid setgid)
+	      cosh sinh tanh setuid setgid unsetenv)
 AC_ARG_ENABLE(setreuid,
        [  --enable-setreuid       use setreuid()/setregid() according to need even if obsolete.],
        [use_setreuid=$enableval])
@@ -452,6 +456,20 @@ if test "$use_setreuid" = yes; then
     AC_DEFINE(USE_SETREUID)
     AC_DEFINE(USE_SETREGID)
 fi
+AC_CACHE_CHECK(for 2 arguments setenv, rb_cv_have_2_arg_setenv,
+  [AC_TRY_COMPILE([#include <stdlib.h>], [setenv("foo", "foo");],
+	rb_cv_have_2_arg_setenv=yes,
+	rb_cv_have_2_arg_setenv=no)])
+if test "$rb_cv_have_2_arg_setenv" = yes; then
+  AC_DEFINE(HAVE_2_ARG_SETENV)
+fi
+AC_CACHE_CHECK(for 3 arguments setenv, rb_cv_have_3_arg_setenv,
+  [AC_TRY_COMPILE([#include <stdlib.h>], [setenv("foo", "foo", 1);],
+	rb_cv_have_3_arg_setenv=yes,
+	rb_cv_have_3_arg_setenv=no)])
+if test "$rb_cv_have_3_arg_setenv" = yes; then
+  AC_DEFINE(HAVE_3_ARG_SETENV)
+fi
 AC_STRUCT_TIMEZONE
 AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
   [AC_TRY_COMPILE([#include <time.h>],
Index: hash.c
===================================================================
RCS file: /src/ruby/hash.c,v
retrieving revision 1.128.2.14
diff -u -w -b -p -r1.128.2.14 hash.c
--- hash.c	19 Jul 2005 08:25:37 -0000	1.128.2.14
+++ hash.c	23 Jan 2006 08:37:27 -0000
@@ -1812,7 +1812,14 @@ ruby_setenv(name, value)
      *         RTL's environ global variable directly yet.
      */
     SetEnvironmentVariable(name,value);
-#elif defined __CYGWIN__
+#elif defined HAVE_2_ARG_SETENV && defined HAVE_UNSETENV
+#undef setenv
+#undef unsetenv
+    if (value)
+	setenv(name,value);
+    else
+	unsetenv(name);
+#elif defined HAVE_3_ARG_SETENV && defined HAVE_UNSETENV
 #undef setenv
 #undef unsetenv
     if (value)