summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-08 00:25:40 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-08 00:25:40 +0000
commit15f0e53a0698b5b7abd003f9cf305a456a98babc (patch)
tree702aed166aa207beef8ef266c9b005a0fdeba938
parent487185de671234a650f43b2de16c9253171a3388 (diff)
* process.c (proc_setgroups): use getgrnam() if getgrnam_r() is
not available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31058 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--configure.in2
-rw-r--r--process.c12
3 files changed, 14 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 9856a91df8..ecba61a824 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-Tue Mar 8 09:08:00 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Mar 8 09:25:23 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (proc_setgroups): use getgrnam() if getgrnam_r() is
+ not available.
* process.c: RARRAY_LEN() returns long int.
diff --git a/configure.in b/configure.in
index 62ba73fa38..ccfd20c011 100644
--- a/configure.in
+++ b/configure.in
@@ -1306,7 +1306,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot ge
setitimer setruid seteuid setreuid setresuid setproctitle socketpair\
setrgid setegid setregid setresgid issetugid pause lchown lchmod\
getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
- getpriority getrlimit setrlimit sysconf close\
+ getpriority getrlimit setrlimit sysconf close getgrnam_r\
dlopen sigprocmask sigaction sigsetjmp _setjmp _longjmp\
setsid telldir seekdir fchmod cosh sinh tanh log2 round\
setuid setgid daemon select_large_fdset setenv unsetenv\
diff --git a/process.c b/process.c
index f662a2f0d1..4b6c164d6b 100644
--- a/process.c
+++ b/process.c
@@ -4626,12 +4626,14 @@ proc_setgroups(VALUE obj, VALUE ary)
{
int ngroups, i;
rb_gid_t *groups;
+#ifdef HAVE_GETGRNAM_R
long getgr_buf_len = sysconf(_SC_GETGR_R_SIZE_MAX);
char* getgr_buf;
if (getgr_buf_len < 0)
getgr_buf_len = 4096;
getgr_buf = ALLOCA_N(char, getgr_buf_len);
+#endif
Check_Type(ary, T_ARRAY);
@@ -4657,16 +4659,20 @@ proc_setgroups(VALUE obj, VALUE ary)
groups[i] = NUM2GIDT(g);
}
else {
- StringValue(tmp);
+ const char *grpname = StringValueCStr(tmp);
- ret = getgrnam_r(RSTRING_PTR(tmp), &grp, getgr_buf, getgr_buf_len, &p);
+#ifdef HAVE_GETGRNAM_R
+ ret = getgrnam_r(grpname, &grp, getgr_buf, getgr_buf_len, &p);
if (ret)
rb_sys_fail("getgrnam_r");
+#else
+ p = getgrnam(grpname);
+#endif
if (p == NULL) {
rb_raise(rb_eArgError,
"can't find group for %s", RSTRING_PTR(tmp));
}
- groups[i] = grp.gr_gid;
+ groups[i] = p->gr_gid;
}
}
}