getgrouplist(3)

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

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#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 <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, "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). */

        errno = 0
        pw = getpwnam(argv[1]);
        if (pw == NULL) {
            if (errno)
                perror("getpwnam");
            else
                fprintf(stderr, "nu există un astfel de utilizator\n");
            exit(EXIT_FAILURE);
        }

        /* 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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.