getgroups(2)

NAAM
getgroups, setgroups - krijg/zet een lijst van aanvullende groep ID's

BIBLIOTHEEK
Standaard C bibliotheek (libc, -lc)

SAMENVATTING
#include <unistd.h>

int getgroups(int grootte, gid_t lijst[_Nullable .grootte]);

#include <grp.h>

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

    Feature Test Macro Requirements voor glibc (zie feature_test_macros(7)):

setgroups(2):
    Vanaf glibc 2.19:
        _DEFAULT_SOURCE
    Glibc 2.19 en eerder:
        _BSD_SOURCE

BESCHRIJVING
getgroups() geeft de aanvullende groep ID´s van het aanroepende proces terug in lijst. Het argument grootte dient gezet te worden op het maximum aantal elementen dat kan worden opgeslagen in de buffer aangewezen door lijst. Als het aanroepende proces lid is van meer dan grootte aanvullende groepen, dat treedt een fout op.

Het is niet gespecificeerd of het effectieve groep ID van het aanroepende proces is bevat in de geretourneerde lijst. (Dus, aan applicatie moet ook getegid(2) aanroepen en de resulterende waarde verwijderen of toevoegen.

Als grootte nul is dan wordt lijst niet veranderd, maar het gehele aantal van aanvullende groepen voor hetproces wordt teruggegeven.

setgroups() zet de aanvullende groepen voor een proces. Alleen de super-gebruiker mag deze functie gebruiken.

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

EIND WAARDE
Bij success geeft getgroups() het aantal aanvullende groep ID's terug. Bij falen wordt -1 teruggegeven, en errno wordt overeenkomstig gezet.

Bij success geeft setgroups() nul terug. Bij falen wordt -1 teruggegeven, en wordt errno overeenkomstig gezet.

FOUTEN

EFAULT
    lijst heeft een ongeldig adres.

getgroups() kan ook nog falen met de volgende fout:

EINVAL
    grootte is kleiner dan het aantal aanvullende groep ID's, maar is niet nul.

getgroups() kan ook nog falen met de volgende fout:

EINVAL
    grootte is groter dan NGROUPS_MAX (32 voor Linux 2.6.4; 65536 sinds Linux 2.6.4).

ENOMEM
    Geen geheugen meer.

EPERM
    Het aanroepende proces heeft onvoldoende rechten (De aanroeper heeft niet de CAP_SETGID capaciteit in de gebruiker naamruimte waarin het zich bevind.

EPERM (sinds Linux 3.19)
    Het gebruik van setgroups() wordt geweigerd in deze gebruiker naamruimte. Zie de beschrijving van /proc/pid/setgroups in user_namespaces(7).

VERSIES

  C library/kernel verschillen
Op kernel niveau, zijn gebruiker ID´s en groep ID´s een per-thread attribute. Hoewel POSIX vereist dat alle threads in een proces dezelfde identificatie hebben. De NPTL threading implementaties voldoen aan de POSIX eis door omwikkel functies voor de verschillende systeem aanroepen die de UID´s en GID´s veranderen te implementeren. Deze omwikkel functies (inclusief die voor setgroups()) gebruiken een op een signaal gebaseerde techniek om te verzekeren dat wanneer in een thread de identificatie verandert, alle andere threads in het proces ook hun identificatie veranderen. Voor details zie nptl(7).

STANDAARDEN

getgroups()
    POSIX.1-2024.

setgroups()
    Geen.

HISTORIE

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

setgroups()
    SVr4, 4.3BSD. Vanaf vereist setgroups() privileges. Dit is niet beschreven in POSIX.1.

De originele Linux getgroups() systeem aanroep ondersteunde alleen 16-bit groep ID´s. Vervolgens voegde Linux 2.4 getgroups32() toe, die 32-bit groep ID´s ondersteunde. De glibc getgroups() omwikkel functie handelt de verschillen tussen kernel variaties transparant af.

OPMERKINGEN
Een proces kan tot NGROUPS_MAX aanvullende groep ID´s hebben boven op het effectieve groep ID. De constante NGROUPS_MAX is gedefinieerd in <limits.h>. De verzameling van aanvullende groep ID´s wordt geërfd van het ouder proces en blijft bewaard langs een execve(2).

Het maximum aantal aanvullende groep ID´s kan worden gevonden tijdens het uitvoeren door gebruik te maken van sysconf(3):

    long ngroups_max;
    ngroups_max = sysconf(_SC_NGROUPS_MAX);

De maximale uitvoer waarde van getgroups() kan niet groter zijn dan een meer dan deze waarde. Vanaf Linux 2.6.4, is het maximum aantal aanvullende groep ID´s ook zichtbaar via het Linux specifieke alleen-lezen bestand /proc/sys/kernel/ngroups_max.

VOORBEELDEN
    #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;
    }

ZIE OOK
getgid(2), setgid(2), getgrouplist(3), group_member(3), initgroups(3), capabilities(7), credentials(7)

VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.