Man page - getgrouplist(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

getgrouplist

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
АТРИБУТЫ
СТАНДАРТЫ
ИСТОРИЯ
ОШИБКИ
ПРИМЕРЫ
Исходный код программы
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

getgrouplist - возвращает список групп, в которые входит пользователь

БИБЛИОТЕКА

Стандартная библиотека языка C ( libc , -lc )

ОБЗОР

#include <grp.h>

int getgrouplist(const char * user , gid_t group ,
gid_t *
groups , int * ngroups );

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

getgrouplist ():
Начиная с glibc 2.19:
_DEFAULT_SOURCE
В версии glibc 2.19 и более ранних:
_BSD_SOURCE

ОПИСАНИЕ

Функция getgrouplist () просматривает базу данных групп (смотрите group (5)) для составления списка групп, в которые входит пользователь user . В возвращаемом массиве groups может быть до *ngroups групп.

Если в базе данных групп отсутствуют группы, определённые для user , то в список групп, возвращаемый getgrouplist (), включается group ; обычно, это аргумент задаётся в виде ID группы из записи пароля user .

Аргумент ngroups является аргументом-результатом: при возврате в нём всегда содержится количество группы, найденных для user включая group ; данное значение может быть больше, чем количество групп, хранящихся в groups .

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

Если количество групп, в которых user является членом, меньше или равно *ngroups , то возвращается значение *ngroups .

If the user is a member of more than *ngroups groups, then getgrouplist () returns -1. In this case, the value returned in *ngroups can be used to resize the buffer passed to a further call to getgrouplist ().

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes (7).

Image grohtml-629484-1.png

СТАНДАРТЫ

Отсутствуют.

ИСТОРИЯ

glibc 2.2.4.

ОШИБКИ

Before glibc 2.3.3, the implementation of this function contains a buffer-overrun bug: it returns the complete list of groups for user in the array groups , even when the number of groups exceeds *ngroups .

ПРИМЕРЫ

Программа, показанная далее, печатает список групп для пользователя из первого аргумента командной строки. Во втором аргументе задаётся значение ngroups , передаваемое getgrouplist (). Вот примеры работы этой программы:

$ ./a.out cecilia 0
getgrouplist() вернула -1; ngroups = 3
$ ./a.out cecilia 3
ngroups = 3
16 (dialout)
33 (video)
100 (users)

Исходный код программы

#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
int ngroups;
gid_t *groups;
struct group *gr;
struct passwd *pw;
if (argc != 3) {
fprintf(stderr, "Usage: %s <user> <ngroups>\n", argv[0]);
exit(EXIT_FAILURE);
}
ngroups = atoi(argv[2]);
groups = malloc(sizeof(*groups) * ngroups);
if (groups == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
/* Fetch passwd structure (contains first group ID for user). */
errno = 0;
pw = getpwnam(argv[1]);
if (pw == NULL) {
if (errno)
perror("getpwnam");
else
fprintf(stderr, "no such user\n");
exit(EXIT_FAILURE);
}
/* Retrieve group list. */
if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) {
fprintf(stderr, "getgrouplist() returned -1; ngroups = %d\n",
ngroups);
exit(EXIT_FAILURE);
}
/* Display list of retrieved groups, along with group names. */
fprintf(stderr, "ngroups = %d\n", ngroups);
for (int j = 0; j < ngroups; j++) {
printf("%d", groups[j]);
gr = getgrgid(groups[j]);
if (gr != NULL)
printf(" (%s)", gr->gr_name);
printf("\n");
}
exit(EXIT_SUCCESS);
}

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

getgroups (2), setgroups (2), getgrent (3), group_member (3), group (5), passwd (5)

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков .