getgroups(2)

NUME
getgroups, setgroups - obține/stabilește o listă de ID-uri de grupuri suplimentare

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <unistd.h>

int getgroups(int size, gid_t list[_Nullable size]);

#include <grp.h>

int setgroups(size_t size, const gid_t list[size]);

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

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

DESCRIERE
getgroups() returnează în list ID-urile de grup suplimentare ale procesului apelant. Argumentul size trebuie să fie definit la numărul maxim de elemente care pot fi stocate în memoria tampon indicată de list. În cazul în care procesul de apelare este membru a mai mult de size grupuri suplimentare, apare o eroare.

Nu este specificat dacă ID-ul efectiv al grupului procesului apelant este inclus în lista returnată; (astfel, o aplicație trebuie să apeleze și getegid(2) și să adauge sau să elimine valoarea rezultată).

Dacă size este zero, list nu este modificat, dar se returnează numărul total de ID-uri de grup suplimentare pentru proces. Acest lucru permite apelantului să determine dimensiunea unei liste list alocate dinamic, care va fi utilizată într-un apel ulterior la getgroups().

setgroups() stabilește ID-urile de grup suplimentare pentru procesul apelant. Sunt necesare privilegii corespunzătoare (a se vedea descrierea erorii EPERM, mai jos). Argumentul size specifică numărul de ID-uri de grup suplimentare din memoria tampon indicată de list. Un proces poate renunța la toate grupurile sale suplimentare odată cu apelul:

    setgroups(0, (gid_t [0]){});

VALOAREA RETURNATĂ
În caz de succes, getgroups() returnează numărul de ID-uri de grup suplimentare. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

În caz de succes, setgroups() returnează 0. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EFAULT
    list are o adresă nevalidă.

getgroups() poate eșua în plus cu următoarea eroare:

EINVAL
    size este mai mic decât numărul de ID-uri de grup suplimentare, dar nu este zero.

setgroups() poate eșua în plus cu următoarele erori:

EINVAL
    size este mai mare decât NGROUPS_MAX (32 înainte de Linux 2.6.4; 65536 începând cu Linux 2.6.4).

ENOMEM
    Memorie insuficientă.

EPERM
    Procesul apelant are privilegii insuficiente (apelantul nu are capacitatea CAP_SETGID în spațiul de nume al utilizatorului în care se află).

EPERM (începând cu Linux 3.19)
    Utilizarea setgroups() este interzisă în acest spațiu de nume de utilizator. A se vedea descrierea /proc/pid/setgroups în user_namespaces(7).

VERSIUNI

  Diferențe între biblioteca C și nucleu
La nivelul nucleului, ID-urile de utilizator și ID-urile de grup sunt un atribut pentru fiecare fir de execuție. Cu toate acestea, POSIX impune ca toate firele dintr-un proces să aibă aceleași credențiale. Implementarea „NPTL threading” se ocupă de cerințele POSIX prin furnizarea de funcții de învăluire pentru diferitele apeluri de sistem care modifică UID și GID ale proceselor. Aceste funcții învăluitoare (inclusiv cea pentru setgroups()) utilizează o tehnică bazată pe semnale pentru a se asigura că, atunci când un fir de execuție își schimbă acreditările, toate celelalte fire de execuție din proces își schimbă și ele acreditările. Pentru detalii, a se vedea nptl(7).

STANDARDE

getgroups()
    POSIX.1-2024.

setgroups()
    Niciunul.

ISTORIC

getgroups()
    SVr4, 4.3BSD, POSIX.1-2001.

setgroups()
    SVr4, 4.3BSD. Deoarece setgroups() necesită privilegii, nu este acoperit de POSIX.1.

Apelul de sistem original Linux getgroups() accepta numai ID-uri de grup pe 16 biți. Ulterior, Linux 2.4 a adăugat getgroups32(), care acceptă ID-uri pe 32 de biți. Funcția învăluitoare glibc getgroups() tratează în mod transparent variația dintre versiunile de kernel.

NOTE
Un proces poate avea până la NGROUPS_MAX ID-uri de grup suplimentare în plus față de ID-ul de grup efectiv. Constanta NGROUPS_MAX este definită în <limits.h>. Setul de ID-uri de grup suplimentare este moștenit de la procesul părinte și este păstrat prin intermediul unui execve(2).

Numărul maxim de ID-uri de grup suplimentare poate fi aflat în timpul execuției folosind sysconf(3):

    long ngroups_max;
    ngroups_max = sysconf(_SC_NGROUPS_MAX);

Valoarea maximă de returnare a lui getgroups() nu poate fi mai mare decât cu unu față de această valoare. Începând cu Linux 2.6.4, numărul maxim de ID-uri de grup suplimentare este, de asemenea, expus prin intermediul fișierului de numai citire specific Linux, /proc/sys/kernel/ngroups_max.

EXEMPLE
    #include <err.h>
    #include <stddef.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>

    #define MALLOC(n, T)  ((T *) reallocarray(NULL, n, sizeof(T)))

    static gid_t *agetgroups(size_t *ngids);

    int
    main(void)
    {
        gid_t   *gids;
        size_t  n;

        gids = agetgroups(&n);
        if (gids == NULL)
            err(EXIT_FAILURE, "agetgroups");

        if (n != 0) {
            printf("%jd", (intmax_t) gids[0]);
            for (size_t i = 1; i < n; i++)
                printf(" %jd", (intmax_t) gids[i]);
        }
        puts("");

        free(gids);
        exit(EXIT_SUCCESS);
    }

    static gid_t *
    agetgroups(size_t *ngids)
    {
        int    n;
        gid_t  *gids;

        n = getgroups(0, NULL);
        if (n == -1)
            return NULL;

        gids = MALLOC(n, gid_t);
        if (gids == NULL)
            return NULL;

        n = getgroups(n, gids);
        if (n == -1) {
            free(gids);
            return NULL;
        }

        *ngids = n;
        return gids;
    }

CONSULTAȚI ȘI
getgid(2), setgid(2), getgrouplist(3), group_member(3), initgroups(3), capabilities(7), credentials(7)

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.