Set real and effective group IDs
#include <unistd.h> int setregid( gid_t rgid, gid_t egid );
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The setregid() function sets the real and effective group IDs of the calling process. If rgid or egid is -1, the corresponding real or effective group ID is left unchanged.
If the effective user ID of the calling process is the superuser, you can set the real group ID and the effective group ID to any legal value.
If the effective user ID of the calling process isn't the superuser, you can set either the real group ID to the saved set-group ID, or the effective group ID to either the saved set-group ID or the real group ID.
|If a set-group ID process sets its effective group ID to its real group ID, it can still set its effective group ID back to the saved set-group ID.|
The “superuser” is defined as any process with an effective user ID of 0, or an effective user ID of root.
In either case, if you're changing the real group ID (i.e. rgid isn't -1), or you're changing the effective group ID to a value that isn't equal to the real group ID, the saved set-group ID is set to the new effective group ID.
The calling process isn't the superuser, and you tried to change the real group ID to a value other than the effective group ID.
POSIX 1003.1 XSI
execve(), getgid(), setreuid(), setuid()