11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)

We use cookies. Read the Privacy and Cookie Policy

11.7. Работа со всеми тремя ID: getresuid() и setresuid() (Linux)

Linux предоставляет дополнительные системные вызовы, посредством которых вы можете непосредственно работать с действительными, эффективными и сохраненными ID пользователя и группы:

#include <sys/types.h> /* Linux */

#include <unistd.h>

int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);

int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);

int setresuid(uid_t ruid, uid_t euid, uid_t suid);

int setresgid(gid_t rgid, gid_t egid, gid_t sgid);

Функции следующие:

int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid)

Получает значения действительного, эффективного и сохраненного set-user ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке, errno указывает проблему.

int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid)

Получает значения действительного, эффективного и сохраненного set-group ID. Возвращаемое значение 0 в случае успеха и -1 при ошибке, errno обозначает проблему.

int setresuid(uid_t ruid, uid_t euid, uid_t suid)

Устанавливает значения действительного, эффективного и сохраненного set-user ID соответственно. Когда значение параметра равно -1, соответствующий UID остается без изменения.

Когда процесс действует как root, параметрами могут быть любые произвольные значения. Однако, использование ненулевого значения для euid вызывает постоянную, безвозвратную утерю привилегии root). В противном случае параметры должны быть одним из значений действительного, эффективного или сохраненного set-user ID.

int setresgid(gid_t rgid, gid_t egid, gid_t sgid)

Устанавливает значения действительного, эффективного и сохраненного set-group ID соответственно. Когда значение параметра равно -1, соответствующий GID остается без изменений.

Эта функция аналогична setresuid().

Функции setresuid() и setresgid() особенно ценны, поскольку их семантика ясно определена. Программист точно знает, каким может быть результат их вызова.

Более того, вызовы являются операциями типа «все или ничего»: они либо полностью успешны в осуществлении нужного изменения, либо терпят полную неудачу, оставляя текущее состояние как есть. Это повышает надежность, поскольку, опять-таки можно быть точно уверенным в том, что случилось.