Scroll to navigation

getgrouplist(3) Library Functions Manual getgrouplist(3)

NUME

getgrouplist - obține lista de grupuri din care face parte un utilizator

BIBLIOTECA

Biblioteca C standard (libc, -lc)

REZUMAT

#include <grp.h>
int getgrouplist(const char *user, gid_t group,
                 gid_t *groups, int *ngroups);

Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

getgrouplist():


Începând cu glibc 2.19:
_DEFAULT_SOURCE
glibc 2.19 și versiunile anterioare:
_BSD_SOURCE

DESCRIERE

Funcția getgrouplist() analizează baza de date a grupurilor (a se vedea group(5)) pentru a obține lista grupurilor din care face parte user. Până la *ngroups din aceste grupuri sunt returnate în matricea groups.

Dacă nu se află printre grupurile definite pentru user în baza de date a grupurilor, atunci group este inclus în lista de grupuri returnată de getgrouplist(); de obicei, acest argument este specificat ca fiind ID-ul grupului din înregistrarea parolei pentru user.

Argumentul ngroups este un argument valoare-rezultat: la returnare conține întotdeauna numărul de grupuri găsite pentru user, inclusiv group; această valoare poate fi mai mare decât numărul de grupuri stocate în groups.

VALOAREA RETURNATĂ

Dacă numărul de grupuri din care face parte user este mai mic sau egal cu *ngroups, atunci se returnează valoarea *ngroups.

Dacă utilizatorul este membru a mai mult de *ngroups grupuri, atunci getgrouplist() returnează -1. În acest caz, valoarea returnată în *ngroups poate fi utilizată pentru a redimensiona memoria tampon pasată la un apel ulterior la getgrouplist().

ATRIBUTE

Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).

Interfață Atribut Valoare
getgrouplist() Siguranța firelor MT-Safe locale

STANDARDE

Niciunul.

ISTORIC

glibc 2.2.4.

ERORI

Înainte de glibc 2.3.3, implementarea acestei funcții conține o eroare de depășire a memoriei tampon: aceasta returnează lista completă a grupurilor pentru utilizatorul user în matricea groups, chiar și atunci când numărul de grupuri depășește *ngroups.

EXEMPLE

Programul de mai jos afișează lista de grupuri pentru utilizatorul menționat în primul său argument de linie de comandă. Al doilea argument din linia de comandă specifică valoarea lui ngroups care trebuie furnizată lui getgrouplist(). Următoarea sesiune shell prezintă exemple de utilizare a acestui program:


$ ./a.out cecilia 0
getgrouplist() returned -1; ngroups = 3
$ ./a.out cecilia 3
ngroups = 3
16 (dialout)
33 (video)
100 (users)

Sursa programului

#include <grp.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{

int ngroups;
struct passwd *pw;
struct group *gr;
gid_t *groups;
if (argc != 3) {
fprintf(stderr, "Utilizare: %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);
}
/* Obține structura passwd (conține primul ID de grup pentru utilizator). */
pw = getpwnam(argv[1]);
if (pw == NULL) {
perror("getpwnam");
exit(EXIT_SUCCESS);
}
/* Preluarea listei de grupuri. */
if (getgrouplist(argv[1], pw->pw_gid, groups, &ngroups) == -1) {
fprintf(stderr, "getgrouplist() returned -1; ngroups = %d\n",
ngroups);
exit(EXIT_FAILURE);
}
/* Afișează lista grupurilor recuperate, împreună cu numele grupurilor. */
fprintf(stderr, "ngroups = %d\n", ngroups);
for (size_t 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); }

CONSULTAȚI ȘI

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

TRADUCERE

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

20 iulie 2023 Pagini de manual de Linux 6.05.01