Scroll to navigation

GETGROUPS(2) Руководство программиста Linux GETGROUPS(2)

ИМЯ

getgroups, setgroups - получить/установить список дополнительных идентификаторов групп

ОБЗОР

#include <sys/types.h>
#include <unistd.h>

int getgroups(int size, gid_t list[]);

#include <grp.h>

int setgroups(size_t size, const gid_t *list);


Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

setgroups(): _BSD_SOURCE

ОПИСАНИЕ

Вызов getgroups() возвращает идентификаторы дополнительных групп вызывающего процесса в списке list. В аргументе size должно быть указано максимальное количество элементов, которые можно сохранить в буфер, указанный list. Если вызывающий процесс является членом в более чем size дополнительных групп, то возвращается ошибка. an error results. Для него не определено, будет ли в этот список включён эффективный идентификатор группы вызывающего процесса. (То есть приложение также должно вызвать getegid(2) и добавить или удалить полученное значение.)

Если размер size равен нулю, то список list не изменяется, а просто возвращается общее количество идентификаторов дополнительных групп процесса. Это позволяет вызывающему определить размер динамически выделяемого списка list, который будет использоваться при повторном вызове getgroups().

Вызов setgroups() устанавливает идентификаторы дополнительных групп для вызывающего процесса. Для работы требуются привилегии (Linux: мандат CAP_SETGID). В аргументе size задаётся количество дополнительных идентификаторов групп в буфере, указанном list.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении getgroups() возвращается количество дополнительных идентификаторов. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

При успешном выполнении setgroups() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

Значение list является неправильным адресом.

Вызов getgroups() также может завершиться со следующей ошибкой:

Значение size меньше чем количество дополнительных идентификаторов групп, но не ноль.

Вызов setgroups() также может завершиться со следующими ошибками:

Значение size больше чем NGROUPS_MAX (32, до Linux 2.6.4; 65536, начиная с Linux 2.6.4).
Не хватает памяти.
Вызывающий процесс не имеет достаточно прав.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.3BSD. Функции getgroups() нет в POSIX.1-2001. Так как вызов setgroups() требует привилегий, он не описан в POSIX.1-2001.

ЗАМЕЧАНИЯ

Процесс может иметь как минимум NGROUPS_MAX дополнительных идентификаторов групп в дополнении к эффективному идентификатору группы. Список дополнительных идентификаторов групп наследуется из родительского процесса и сохраняется при вызове execve(2).

Максимальное количество дополнительных идентификаторов групп можно выяснить с помощью sysconf(3):


long ngroups_max;
ngroups_max = sysconf(_SC_NGROUPS_MAX);
Максимальное значение, возвращаемое getgroups(), не может быть больше чем на единицу значения, полученного данным способом.

Первоначальная версия системного вызова getgroups() в Linux поддерживала только 16-битные идентификаторы групп. Позднее в Linux 2.4 был добавлен вызов getgroups32(), поддерживающий 32-битные идентификаторы. В glibc обёрточная функция getgroups() работает одинаково вне зависимости от версий ядра.

СМОТРИТЕ ТАКЖЕ

getgid(2), setgid(2), getgrouplist(3), initgroups(3), capabilities(7), credentials(7)

2010-11-22 Linux