groups=(p1)
public
Show source
/*
* call-seq:
* Process.groups= array => array
*
* Set the supplemental group access list to the given
* <code>Array</code> of group IDs.
*
* Process.groups
* Process.groups = [27, 6, 10, 11]
* Process.groups
*
*/
static VALUE
proc_setgroups(VALUE obj, VALUE ary)
{
#ifdef HAVE_SETGROUPS
size_t ngroups;
rb_gid_t *groups;
int i;
struct group *gr;
Check_Type(ary, T_ARRAY);
ngroups = RARRAY(ary)->len;
if (ngroups > maxgroups)
rb_raise(rb_eArgError, "too many groups, %d max", maxgroups);
groups = ALLOCA_N(rb_gid_t, ngroups);
for (i = 0; i < ngroups && i < RARRAY(ary)->len; i++) {
VALUE g = RARRAY(ary)->ptr[i];
if (FIXNUM_P(g)) {
groups[i] = FIX2INT(g);
}
else {
VALUE tmp = rb_check_string_type(g);
if (NIL_P(tmp)) {
groups[i] = NUM2INT(g);
}
else {
gr = getgrnam(RSTRING(tmp)->ptr);
if (gr == NULL)
rb_raise(rb_eArgError,
"can't find group for %s", RSTRING(tmp)->ptr);
groups[i] = gr->gr_gid;
}
}
}
i = setgroups(ngroups, groups);
if (i == -1)
rb_sys_fail(0);
return proc_getgroups(obj);
#else
rb_notimplement();
return Qnil;
#endif
}