Reading the Persona of a Process
================================
Here are detailed descriptions of the functions for reading the user
and group IDs of a process, both real and effective. To use these
facilities, you must include the header files `sys/types.h' and
`unistd.h'.
- Data Type: uid_t
This is an integer data type used to represent user IDs. In the
GNU library, this is an alias for `unsigned int'.
- Data Type: gid_t
This is an integer data type used to represent group IDs. In the
GNU library, this is an alias for `unsigned int'.
- Function: uid_t getuid (void)
The `getuid' function returns the real user ID of the process.
- Function: gid_t getgid (void)
The `getgid' function returns the real group ID of the process.
- Function: uid_t geteuid (void)
The `geteuid' function returns the effective user ID of the
process.
- Function: gid_t getegid (void)
The `getegid' function returns the effective group ID of the
process.
- Function: int getgroups (int COUNT, gid_t *GROUPS)
The `getgroups' function is used to inquire about the supplementary
group IDs of the process. Up to COUNT of these group IDs are
stored in the array GROUPS; the return value from the function is
the number of group IDs actually stored. If COUNT is smaller than
the total number of supplementary group IDs, then `getgroups'
returns a value of `-1' and `errno' is set to `EINVAL'.
If COUNT is zero, then `getgroups' just returns the total number
of supplementary group IDs. On systems that do not support
supplementary groups, this will always be zero.
Here's how to use `getgroups' to read all the supplementary group
IDs:
gid_t *
read_all_groups (void)
{
int ngroups = getgroups (0, NULL);
gid_t *groups
= (gid_t *) xmalloc (ngroups * sizeof (gid_t));
int val = getgroups (ngroups, groups);
if (val < 0)
{
free (groups);
return NULL;
}
return groups;
}