.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2008, Linux Foundation, written by Michael Kerrisk .\" .\" .\" A few pieces remain from an earlier version written in .\" 2002 by Walter Harms (walter.harms@informatik.uni-oldenburg.de) .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH getgrouplist 3 "15 июня 2024 г." "Справочные страницы Linux 6.9.1" .SH НАИМЕНОВАНИЕ getgrouplist \- возвращает список групп, в которые входит пользователь .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH ОБЗОР .nf \fB#include \fP .P \fBint getgrouplist(const char *\fP\fIuser\fP\fB, gid_t \fP\fIgroup\fP\fB,\fP \fB gid_t *\fP\fIgroups\fP\fB, int *\fP\fIngroups\fP\fB);\fP .fi .P .RS -4 Требования макроса тестирования свойств для glibc (см. \fBfeature_test_macros\fP(7)): .RE .P \fBgetgrouplist\fP(): .nf Начиная с glibc 2.19: _DEFAULT_SOURCE В версии glibc 2.19 и более ранних: _BSD_SOURCE .fi .SH ОПИСАНИЕ Функция \fBgetgrouplist\fP() просматривает базу данных групп (смотрите \fBgroup\fP(5)) для составления списка групп, в которые входит пользователь \fIuser\fP. В возвращаемом массиве \fIgroups\fP может быть до \fI*ngroups\fP групп. .P Если в базе данных групп отсутствуют группы, определённые для \fIuser\fP, то в список групп, возвращаемый \fBgetgrouplist\fP(), включается \fIgroup\fP; обычно, это аргумент задаётся в виде ID группы из записи пароля \fIuser\fP. .P Аргумент \fIngroups\fP является аргументом\-результатом: при возврате в нём всегда содержится количество группы, найденных для \fIuser\fP включая \fIgroup\fP; данное значение может быть больше, чем количество групп, хранящихся в \fIgroups\fP. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" Если количество групп, в которых \fIuser\fP является членом, меньше или равно \fI*ngroups\fP, то возвращается значение \fI*ngroups\fP. .P If the user is a member of more than \fI*ngroups\fP groups, then \fBgetgrouplist\fP() returns \-1. In this case, the value returned in \fI*ngroups\fP can be used to resize the buffer passed to a further call to \fBgetgrouplist\fP(). .SH АТРИБУТЫ Описание терминов данного раздела смотрите в \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Интерфейс Атрибут Значение T{ .na .nh \fBgetgrouplist\fP() T} Безвредность в нитях MT\-Safe locale .TE .SH СТАНДАРТЫ Отсутствуют. .SH ИСТОРИЯ glibc 2.2.4. .SH ОШИБКИ Before glibc 2.3.3, the implementation of this function contains a buffer\-overrun bug: it returns the complete list of groups for \fIuser\fP in the array \fIgroups\fP, even when the number of groups exceeds \fI*ngroups\fP. .SH ПРИМЕРЫ Программа, показанная далее, печатает список групп для пользователя из первого аргумента командной строки. Во втором аргументе задаётся значение \fIngroups\fP, передаваемое \fBgetgrouplist\fP(). Вот примеры работы этой программы: .P .in +4n .EX $\fB ./a.out cecilia 0\fP getgrouplist() вернула \-1; ngroups = 3 $\fB ./a.out cecilia 3\fP ngroups = 3 16 (dialout) 33 (video) 100 (users) .EE .in .SS "Исходный код программы" .\" SRC BEGIN (getgrouplist.c) \& .EX #include #include #include #include #include \& int main(int argc, char *argv[]) { int ngroups; gid_t *groups; struct group *gr; struct passwd *pw; \& if (argc != 3) { fprintf(stderr, "Usage: %s \[rs]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\[rs]n"); exit(EXIT_FAILURE); } \& /* Retrieve group list. */ \& if (getgrouplist(argv[1], pw\->pw_gid, groups, &ngroups) == \-1) { fprintf(stderr, "getgrouplist() returned \-1; ngroups = %d\[rs]n", ngroups); exit(EXIT_FAILURE); } \& /* Display list of retrieved groups, along with group names. */ \& fprintf(stderr, "ngroups = %d\[rs]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("\[rs]n"); } \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "СМОТРИТЕ ТАКЖЕ" \fBgetgroups\fP(2), \fBsetgroups\fP(2), \fBgetgrent\fP(3), \fBgroup_member\fP(3), \fBgroup\fP(5), \fBpasswd\fP(5) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Azamat Hackimov , Dmitry Bolkhovskikh , Vladislav , Yuri Kozlov , Иван Павлов и Kirill Rekhov . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .