getgrouplist(3)

НАИМЕНОВАНИЕ
getgrouplist - возвращает список групп, в которые входит пользователь

БИБЛИОТЕКА
Standard C library (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).
Интерфейс | Атрибут | Значение
getgrouplist() | Безвредность в нитях | MT-Safe locale

СТАНДАРТЫ
Отсутствуют.

ИСТОРИЯ
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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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