Provided by: manpages-ru-dev_4.27.0-1_all bug

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

       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).
       ┌───────────────────────────────────────────────────────────────┬──────────────────────┬────────────────┐
       │ ИнтерфейсАтрибутЗначение       │
       ├───────────────────────────────────────────────────────────────┼──────────────────────┼────────────────┤
       │ 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 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

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

Справочные страницы Linux 6.9.1                  15 июня 2024 г.                                 getgrouplist(3)