CAPGET(2)

NOM
capget, capset - Configurer les capacités

SYNOPSIS
#undef _POSIX_SOURCE
#include <sys/capability.h>

int capget(cap_user_header_t p_entête, cap_user_data_t p_données);

int capset(cap_user_header_t p_entête, const cap_user_data_t p_données);

DESCRIPTION
Depuis Linux 2.2, la toute puissance du superutilisateur (Ndt : root) a été scindée en plusieurs ensembles distincts. Chaque thread dispose d'un ensemble de capacités effectives permettant d'identifier ses droits de réaliser certaines actions. Chaque thread a aussi un ensemble de capacités héritables, qu'il peut transmettre au travers d'un execve(2) et un ensemble de capacités éventuelles qu'il peut rendre effectives ou héritables.

Ces deux fonctions constituent l'interface brute du noyau pour configurer ou lire les capacités d'un processus. Non seulement ces appels système sont spécifiques Linux, mais l'API du noyau est susceptible de changer. L'utilisation de ces fonctions (en particulier le format du type cap_user_*_t) risque de varier lors de nouvelles mises à jour du noyau.

L'interface portable est constituée des fonctions cap_set_proc(3) et cap_get_proc(3) ; si possible, utilisez plutôt ces routines dans vos applications. Si vous désirez vraiment utiliser les extensions Linux, essayez d'employer plutôt les interfaces plus simples capsetp(3) et capgetp(3).

  Détails actuels
Maintenant que vous avez été avertis, quelques détails du noyau courant. Les structures sont définies comme suit.

#define _LINUX_CAPABILITY_VERSION  0x19980330
typedef struct __user_cap_header_struct {
    int version;
    int pid;
} *cap_user_header_t;
typedef struct __user_cap_data_struct {
    int effective;
    int permitted;
    int inheritable;
} *cap_user_data_t;

Les appels retourneront EINVAL, et écriront _LINUX_CAPABILITY_VERSION dans le champ version de p_entête lorsqu'une autre version sera spécifiée. Les appels se réfèreront aux capacités du thread indiqué par le champ pid de p_entête lorqu'il n'est pas nul ou aux capacités du thread courant si pid vaut 0. Si pid fait réréfence à un processus simple thread, pid peut être spécifié comme un PID traditionnel ; opérer sur un thread d'un processus multithread nécessite un TID du type renvoyé par gettid(2). Pour capset(), pid peut également être : -1, signifiant effectuer la modification sur tous les threads excepté l'appelant et init(8) ; ou une valeur inférieure à -1, auquel cas la modification est appliquée à tous les membres du groupe de processus dont l'ID est -pid. Pour les détails sur les données, voir capabilities(7).

VALEUR RENVOYÉE
Si elles réussissent, ces routines renvoient 0. Sinon elles renvoient -1 et configurent errno avec le code d'erreur approprié.

ERREURS

EFAULT
    Mauvaise adresse mémoire. Ni p_entête ni p_données ne doivent être NULL.

EINVAL
    Un argument est invalide.

EPERM
    On a essayé d'ajouter une capacité dans l'ensemble éventuel, ou de placer une capacité dans l'ensemble effectif ou héritable qui ne se trouvait pas dans l'ensemble éventuel.

EPERM
    L'appelant a essayé d'utiliser capset() pour modifier les capacités d'un thread autre que lui-même mais il ne possède pas les privilèges suffisants ; la capacité CAP_SETPCAP est nécessaire. (Un bogue dans les noyaux précédant le 2.6.11 faisait que cette erreur pouvait également survenir si un thread sans cette capacité essayait de modifier ses propres capacités en spécifiant une valeur non nulle pour le champ pid (c'est-à-dire la valeur renvoyée par getpid(2)) au lieu de 0.)

ESRCH
    Pas de thread correspondant.

CONFORMITÉ
Ces appels système sont spécifiques à Linux.

NOTES
L'interface portable pour les fonctions de configuration et de lecture des permissions est fournie par la bibliothèque libcap disponible à :
ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs

VOIR AUSSI
clone(2), gettid(2), capabilities(7)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 4 janvier 2000 et révisée le 23 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 capget ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.