GETGROUPS(2)

NOM
getgroups, setgroups - Lire et écrire la liste des groupes supplémentaires d'un processus

SYNOPSIS
#include <sys/types.h>
#include <unistd.h>

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

#include <grp.h>

int setgroups(size_t size, const gid_t *list);

Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

setgroups() : _BSD_SOURCE

DESCRIPTION

getgroups() renvoie dans la liste list les identifiants des groupes additionnels du processus appelant. Le paramètre size doit indiquer le nombre maximal d'éléments qui peuvent être stockés dans le tampon pointé par list. Si le processus appelant a plus que size groupes additionnels, cela génère une erreur. Il n'est pas spécifié si l'identifiant du groupe effectif du processus appelant est inclus dans la liste renvoyée (ainsi une application devrait également appeler getegid(2) et ajouter ou supprimer la valeur résultante). Si size vaut zéro, list n'est pas modifiée, mais le nombre total de groupes additionnels pour le processus est renvoyé. Ceci permet à l'appelant de déterminer la taille d'une liste list allouée dynamiquement à utiliser dans une appel à getgroups() ultérieur.

setgroups() définit des identifiants de groupes additionnels pour le processus appelant. Les privilèges appropriés (sous Linux : la capacité CAP_SETGID) sont nécessaires. Le paramètre size indique le nombre d'identifiants de groupes additionnels du tampon pointé par list.

VALEUR RENVOYÉE
En cas de succès, getgroups() renvoie le nombre d'identifiants de groupes additionnels. En cas d'erreur, -1 est renvoyé et errno contient le code d'erreur. En cas de succès, setgroups() renvoie 0. En cas d'erreur, -1 est renvoyé et errno contient le code d'erreur.

ERREURS

EFAULT
    list pointe en dehors de l'espace d'adressage accessible.

getgroups() peut également échouer avec les erreurs suivantes :

EINVAL
    size est inférieur au nombre d'identifiants de groupes additionnels, et n'est pas nul.

setgroups() peut également échouer avec les erreurs suivantes :

EINVAL
    size est plus grand que NGROUPS_MAX (32 avant Linux 2.6.4 ; 65536 depuis Linux 2.6.4).

ENOMEM
    Plus de mémoire disponible.

EPERM
    L'appelant n'a pas les privilèges nécessaires.

CONFORMITÉ
SVr4, BSD 4.3. getgroups() est conforme à POSIX.1-2001. Comme setgroups() nécessite des privilèges, il n'est pas couvert par POSIX.1-2001.

NOTES
Un processus peut avoir jusqu'à NGROUPS_MAX identifiants de groupes additionnels en plus de son identifiant de groupe effectif. Le jeu d'identifiants de groupes additionnels est hérité du processus parent, et est préservé au travers des appels à execve(2). Le nombre maximal d'identifiants de groupes additionnels peut être obtenus avec sysconf(3) :
    long ngroups_max;
    ngroups_max = sysconf(_SC_NGROUPS_MAX);
La valeur de retour maximale de getgroups() ne peut pas être plus grande que 1 plus cette valeur. L'appel système getgid() original de Linux ne gérait que des identifiants de groupe sur 16 bits. En conséquence, Linux 2.4 a ajouté getgroups32() qui prend en charge des identifiants 32 bits. La fonction getgroups() de la glibc qui l'encapsule gère de manière transparente ces différences entre noyaux.

VOIR AUSSI
getgid(2), setgid(2), getgrouplist(3), initgroups(3), capabilities(7), credentials(7)

COLOPHON
Cette page fait partie de la publication 3.40 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <URL:http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <URL:http://perkamon.alioth.debian.org/>.

Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».