Module: Process::GID

Defined in:
process.c

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.Process::GID.change_privilege(group) ⇒ Fixnum

Change the current process's real and effective group ID to that specified by group. Returns the new group ID. Not available on all platforms.

[Process.gid, Process.egid]          #=> [0, 0]
Process::GID.change_privilege(33)    #=> 33
[Process.gid, Process.egid]          #=> [33, 33]


6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
# File 'process.c', line 6083

static VALUE
p_gid_change_privilege(VALUE obj, VALUE id)
{
    rb_gid_t gid;

    check_gid_switch();

    gid = OBJ2GID(id);

    if (geteuid() == 0) { /* root-user */
#if defined(HAVE_SETRESGID)
  if (setresgid(gid, gid, gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined HAVE_SETGID
  if (setgid(gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
  if (getgid() == gid) {
      if (SAVED_GROUP_ID == gid) {
    if (setregid(-1, gid) < 0) rb_sys_fail(0);
      }
      else {
    if (gid == 0) { /* (r,e,s) == (root, y, x) */
        if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0);
        if (setregid(SAVED_GROUP_ID, 0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0; /* (r,e,s) == (x, root, root) */
        if (setregid(gid, gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
    else { /* (r,e,s) == (z, y, x) */
        if (setregid(0, 0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setregid(gid, gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
      }
  }
  else {
      if (setregid(gid, gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
#elif defined(HAVE_SETRGID) && defined (HAVE_SETEGID)
  if (getgid() == gid) {
      if (SAVED_GROUP_ID == gid) {
    if (setegid(gid) < 0) rb_sys_fail(0);
      }
      else {
    if (gid == 0) {
        if (setegid(gid) < 0) rb_sys_fail(0);
        if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setrgid(0) < 0) rb_sys_fail(0);
    }
    else {
        if (setrgid(0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setegid(gid) < 0) rb_sys_fail(0);
        if (setrgid(gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
      }
  }
  else {
      if (setegid(gid) < 0) rb_sys_fail(0);
      if (setrgid(gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
#else
  rb_notimplement();
#endif
    }
    else { /* unprivileged user */
#if defined(HAVE_SETRESGID)
  if (setresgid((getgid() == gid)? (rb_gid_t)-1: gid,
          (getegid() == gid)? (rb_gid_t)-1: gid,
          (SAVED_GROUP_ID == gid)? (rb_gid_t)-1: gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
  if (SAVED_GROUP_ID == gid) {
      if (setregid((getgid() == gid)? (rb_uid_t)-1: gid,
       (getegid() == gid)? (rb_uid_t)-1: gid) < 0)
    rb_sys_fail(0);
  }
  else if (getgid() != gid) {
      if (setregid(gid, (getegid() == gid)? (rb_uid_t)-1: gid) < 0)
    rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
  else if (/* getgid() == gid && */ getegid() != gid) {
      if (setregid(getegid(), gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setregid(gid, -1) < 0) rb_sys_fail(0);
  }
  else { /* getgid() == gid && getegid() == gid */
      if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0);
      if (setregid(SAVED_GROUP_ID, gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setregid(gid, -1) < 0) rb_sys_fail(0);
  }
#elif defined(HAVE_SETRGID) && defined(HAVE_SETEGID)
  if (SAVED_GROUP_ID == gid) {
      if (getegid() != gid && setegid(gid) < 0) rb_sys_fail(0);
      if (getgid() != gid && setrgid(gid) < 0) rb_sys_fail(0);
  }
  else if (/* SAVED_GROUP_ID != gid && */ getegid() == gid) {
      if (getgid() != gid) {
    if (setrgid(gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
      }
      else {
    if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
    if (setrgid(gid) < 0) rb_sys_fail(0);
      }
  }
  else if (/* getegid() != gid && */ getgid() == gid) {
      if (setegid(gid) < 0) rb_sys_fail(0);
      if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setrgid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_44BSD_SETGID
  if (getgid() == gid) {
      /* (r,e,s)==(gid,?,?) ==> (gid,gid,gid) */
      if (setgid(gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_SETEGID
  if (getgid() == gid && SAVED_GROUP_ID == gid) {
      if (setegid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_SETGID
  if (getgid() == gid && SAVED_GROUP_ID == gid) {
      if (setgid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#else
  (void)gid;
  rb_notimplement();
#endif
    }
    return id;
}

.egidFixnum .Process::GID.eidFixnum .Process::Sys.geteidFixnum

Returns the effective group ID for this process. Not available on all platforms.

Process.egid   #=> 500


6374
6375
6376
6377
6378
6379
6380
# File 'process.c', line 6374

static VALUE
proc_getegid(VALUE obj)
{
    rb_gid_t egid = getegid();

    return GIDT2NUM(egid);
}

.Process::GID.from_name(name) ⇒ Object

Get the group ID by the name. If the group is not found, ArgumentError will be raised.

Process::GID.from_name("wheel") #=> 0
Process::GID.from_name("nosuchgroup") #=> can't find group for nosuchgroup (ArgumentError)


5149
5150
5151
5152
5153
# File 'process.c', line 5149

static VALUE
p_gid_from_name(VALUE self, VALUE id)
{
    return GIDT2NUM(OBJ2GID(id));
}

.Process::GID.grant_privilege(group) ⇒ Fixnum .Process::GID.eid( = group) ⇒ Fixnum

Set the effective group ID, and if possible, the saved group ID of the process to the given group. Returns the new effective group ID. Not available on all platforms.

[Process.gid, Process.egid]          #=> [0, 0]
Process::GID.grant_privilege(31)     #=> 33
[Process.gid, Process.egid]          #=> [0, 33]


6484
6485
6486
6487
6488
6489
# File 'process.c', line 6484

static VALUE
p_gid_grant_privilege(VALUE obj, VALUE id)
{
    rb_setegid_core(OBJ2GID(id));
    return id;
}

.Process::GID.re_exchangeFixnum

Exchange real and effective group IDs and return the new effective group ID. Not available on all platforms.

[Process.gid, Process.egid]   #=> [0, 33]
Process::GID.re_exchange      #=> 0
[Process.gid, Process.egid]   #=> [33, 0]


6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
# File 'process.c', line 6588

static VALUE
p_gid_exchange(VALUE obj)
{
    rb_gid_t gid;
#if defined(HAVE_SETRESGID) || (defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID))
    rb_gid_t egid;
#endif

    check_gid_switch();

    gid = getgid();
#if defined(HAVE_SETRESGID) || (defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID))
    egid = getegid();
#endif

#if defined(HAVE_SETRESGID)
    if (setresgid(egid, gid, gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
    if (setregid(egid,gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
#else
    rb_notimplement();
#endif
    return GIDT2NUM(gid);
}

.Process::GID.re_exchangeable?Boolean

Returns true if the real and effective group IDs of a process may be exchanged on the current platform.



6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
# File 'process.c', line 6563

static VALUE
p_gid_exchangeable(void)
{
#if defined(HAVE_SETRESGID)
    return Qtrue;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
    return Qtrue;
#else
    return Qfalse;
#endif
}

.gidFixnum .Process::GID.ridFixnum .Process::Sys.getgidFixnum

Returns the (real) group ID for this process.

Process.gid   #=> 500


5700
5701
5702
5703
5704
5705
# File 'process.c', line 5700

static VALUE
proc_getgid(VALUE obj)
{
    rb_gid_t gid = getgid();
    return GIDT2NUM(gid);
}

.Process::GID.sid_available?Boolean

Returns true if the current platform has saved group ID functionality.



6740
6741
6742
6743
6744
6745
6746
6747
6748
# File 'process.c', line 6740

static VALUE
p_gid_have_saved_id(void)
{
#if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || defined(_POSIX_SAVED_IDS)
    return Qtrue;
#else
    return Qfalse;
#endif
}

.switchObject



6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
# File 'process.c', line 6817

static VALUE
p_gid_switch(VALUE obj)
{
    rb_gid_t gid, egid;

    check_gid_switch();

    gid = getgid();
    egid = getegid();

    if (gid == egid) {
  rb_syserr_fail(EPERM, 0);
    }
    p_gid_exchange(obj);
    if (rb_block_given_p()) {
  under_gid_switch = 1;
  return rb_ensure(rb_yield, Qnil, p_gid_sw_ensure, obj);
    }
    else {
  return GIDT2NUM(egid);
    }
}

Instance Method Details

#Process::GID.change_privilege(group) ⇒ Fixnum (private)

Change the current process's real and effective group ID to that specified by group. Returns the new group ID. Not available on all platforms.

[Process.gid, Process.egid]          #=> [0, 0]
Process::GID.change_privilege(33)    #=> 33
[Process.gid, Process.egid]          #=> [33, 33]


6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
# File 'process.c', line 6083

static VALUE
p_gid_change_privilege(VALUE obj, VALUE id)
{
    rb_gid_t gid;

    check_gid_switch();

    gid = OBJ2GID(id);

    if (geteuid() == 0) { /* root-user */
#if defined(HAVE_SETRESGID)
  if (setresgid(gid, gid, gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined HAVE_SETGID
  if (setgid(gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
  if (getgid() == gid) {
      if (SAVED_GROUP_ID == gid) {
    if (setregid(-1, gid) < 0) rb_sys_fail(0);
      }
      else {
    if (gid == 0) { /* (r,e,s) == (root, y, x) */
        if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0);
        if (setregid(SAVED_GROUP_ID, 0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0; /* (r,e,s) == (x, root, root) */
        if (setregid(gid, gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
    else { /* (r,e,s) == (z, y, x) */
        if (setregid(0, 0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setregid(gid, gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
      }
  }
  else {
      if (setregid(gid, gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
#elif defined(HAVE_SETRGID) && defined (HAVE_SETEGID)
  if (getgid() == gid) {
      if (SAVED_GROUP_ID == gid) {
    if (setegid(gid) < 0) rb_sys_fail(0);
      }
      else {
    if (gid == 0) {
        if (setegid(gid) < 0) rb_sys_fail(0);
        if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setrgid(0) < 0) rb_sys_fail(0);
    }
    else {
        if (setrgid(0) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = 0;
        if (setegid(gid) < 0) rb_sys_fail(0);
        if (setrgid(gid) < 0) rb_sys_fail(0);
        SAVED_GROUP_ID = gid;
    }
      }
  }
  else {
      if (setegid(gid) < 0) rb_sys_fail(0);
      if (setrgid(gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
#else
  rb_notimplement();
#endif
    }
    else { /* unprivileged user */
#if defined(HAVE_SETRESGID)
  if (setresgid((getgid() == gid)? (rb_gid_t)-1: gid,
          (getegid() == gid)? (rb_gid_t)-1: gid,
          (SAVED_GROUP_ID == gid)? (rb_gid_t)-1: gid) < 0) rb_sys_fail(0);
  SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
  if (SAVED_GROUP_ID == gid) {
      if (setregid((getgid() == gid)? (rb_uid_t)-1: gid,
       (getegid() == gid)? (rb_uid_t)-1: gid) < 0)
    rb_sys_fail(0);
  }
  else if (getgid() != gid) {
      if (setregid(gid, (getegid() == gid)? (rb_uid_t)-1: gid) < 0)
    rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
  else if (/* getgid() == gid && */ getegid() != gid) {
      if (setregid(getegid(), gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setregid(gid, -1) < 0) rb_sys_fail(0);
  }
  else { /* getgid() == gid && getegid() == gid */
      if (setregid(-1, SAVED_GROUP_ID) < 0) rb_sys_fail(0);
      if (setregid(SAVED_GROUP_ID, gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setregid(gid, -1) < 0) rb_sys_fail(0);
  }
#elif defined(HAVE_SETRGID) && defined(HAVE_SETEGID)
  if (SAVED_GROUP_ID == gid) {
      if (getegid() != gid && setegid(gid) < 0) rb_sys_fail(0);
      if (getgid() != gid && setrgid(gid) < 0) rb_sys_fail(0);
  }
  else if (/* SAVED_GROUP_ID != gid && */ getegid() == gid) {
      if (getgid() != gid) {
    if (setrgid(gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
      }
      else {
    if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
    if (setrgid(gid) < 0) rb_sys_fail(0);
      }
  }
  else if (/* getegid() != gid && */ getgid() == gid) {
      if (setegid(gid) < 0) rb_sys_fail(0);
      if (setrgid(SAVED_GROUP_ID) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
      if (setrgid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_44BSD_SETGID
  if (getgid() == gid) {
      /* (r,e,s)==(gid,?,?) ==> (gid,gid,gid) */
      if (setgid(gid) < 0) rb_sys_fail(0);
      SAVED_GROUP_ID = gid;
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_SETEGID
  if (getgid() == gid && SAVED_GROUP_ID == gid) {
      if (setegid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#elif defined HAVE_SETGID
  if (getgid() == gid && SAVED_GROUP_ID == gid) {
      if (setgid(gid) < 0) rb_sys_fail(0);
  }
  else {
      rb_syserr_fail(EPERM, 0);
  }
#else
  (void)gid;
  rb_notimplement();
#endif
    }
    return id;
}

#egidFixnum (private) #Process::GID.eidFixnum (private) #Process::Sys.geteidFixnum (private)

Returns the effective group ID for this process. Not available on all platforms.

Process.egid   #=> 500


6374
6375
6376
6377
6378
6379
6380
# File 'process.c', line 6374

static VALUE
proc_getegid(VALUE obj)
{
    rb_gid_t egid = getegid();

    return GIDT2NUM(egid);
}

#Process::GID.from_name(name) ⇒ Object (private)

Get the group ID by the name. If the group is not found, ArgumentError will be raised.

Process::GID.from_name("wheel") #=> 0
Process::GID.from_name("nosuchgroup") #=> can't find group for nosuchgroup (ArgumentError)


5149
5150
5151
5152
5153
# File 'process.c', line 5149

static VALUE
p_gid_from_name(VALUE self, VALUE id)
{
    return GIDT2NUM(OBJ2GID(id));
}

#Process::GID.grant_privilege(group) ⇒ Fixnum (private) #Process::GID.eid( = group) ⇒ Fixnum (private)

Set the effective group ID, and if possible, the saved group ID of the process to the given group. Returns the new effective group ID. Not available on all platforms.

[Process.gid, Process.egid]          #=> [0, 0]
Process::GID.grant_privilege(31)     #=> 33
[Process.gid, Process.egid]          #=> [0, 33]


6484
6485
6486
6487
6488
6489
# File 'process.c', line 6484

static VALUE
p_gid_grant_privilege(VALUE obj, VALUE id)
{
    rb_setegid_core(OBJ2GID(id));
    return id;
}

#Process::GID.re_exchangeFixnum (private)

Exchange real and effective group IDs and return the new effective group ID. Not available on all platforms.

[Process.gid, Process.egid]   #=> [0, 33]
Process::GID.re_exchange      #=> 0
[Process.gid, Process.egid]   #=> [33, 0]


6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
# File 'process.c', line 6588

static VALUE
p_gid_exchange(VALUE obj)
{
    rb_gid_t gid;
#if defined(HAVE_SETRESGID) || (defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID))
    rb_gid_t egid;
#endif

    check_gid_switch();

    gid = getgid();
#if defined(HAVE_SETRESGID) || (defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID))
    egid = getegid();
#endif

#if defined(HAVE_SETRESGID)
    if (setresgid(egid, gid, gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
    if (setregid(egid,gid) < 0) rb_sys_fail(0);
    SAVED_GROUP_ID = gid;
#else
    rb_notimplement();
#endif
    return GIDT2NUM(gid);
}

#Process::GID.re_exchangeable?Boolean (private)

Returns true if the real and effective group IDs of a process may be exchanged on the current platform.



6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
# File 'process.c', line 6563

static VALUE
p_gid_exchangeable(void)
{
#if defined(HAVE_SETRESGID)
    return Qtrue;
#elif defined(HAVE_SETREGID) && !defined(OBSOLETE_SETREGID)
    return Qtrue;
#else
    return Qfalse;
#endif
}

#gidFixnum (private) #Process::GID.ridFixnum (private) #Process::Sys.getgidFixnum (private)

Returns the (real) group ID for this process.

Process.gid   #=> 500


5700
5701
5702
5703
5704
5705
# File 'process.c', line 5700

static VALUE
proc_getgid(VALUE obj)
{
    rb_gid_t gid = getgid();
    return GIDT2NUM(gid);
}

#Process::GID.sid_available?Boolean (private)

Returns true if the current platform has saved group ID functionality.



6740
6741
6742
6743
6744
6745
6746
6747
6748
# File 'process.c', line 6740

static VALUE
p_gid_have_saved_id(void)
{
#if defined(HAVE_SETRESGID) || defined(HAVE_SETEGID) || defined(_POSIX_SAVED_IDS)
    return Qtrue;
#else
    return Qfalse;
#endif
}

#switchObject (private)



6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
# File 'process.c', line 6817

static VALUE
p_gid_switch(VALUE obj)
{
    rb_gid_t gid, egid;

    check_gid_switch();

    gid = getgid();
    egid = getegid();

    if (gid == egid) {
  rb_syserr_fail(EPERM, 0);
    }
    p_gid_exchange(obj);
    if (rb_block_given_p()) {
  under_gid_switch = 1;
  return rb_ensure(rb_yield, Qnil, p_gid_sw_ensure, obj);
    }
    else {
  return GIDT2NUM(egid);
    }
}