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
}