Provided by: manpages-fr-dev_4.23.1-1_all 

NOM
capget, capset - Configurer les capacités des threads
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <linux/capability.h> /* Definition of CAP_* and
_LINUX_CAPABILITY_* constants */
#include <sys/syscall.h> /* Definition of SYS_* constants */
#include <unistd.h>
int syscall(SYS_capget, cap_user_header_t hdrp,
cap_user_data_t datap);
int syscall(SYS_capset, cap_user_header_t hdrp,
const cap_user_data_t datap);
Note : la glibc ne fournit pas de fonction autour de cet appel système, l'utilisation de syscall(2) est
requise.
DESCRIPTION
Ces deux appels système constituent l'interface brute du noyau pour configurer ou lire les capacités d'un
thread. Non seulement ces appels système sont spécifiques à Linux, mais l'API du noyau est susceptible de
changer. L'utilisation de ces appels système (en particulier le format du type cap_user_*_t) risque
d'être étendue lors de nouvelles mises à jour du noyau, mais les anciens programmes continueront à
fonctionner.
Les interfaces portables sont constituées des fonctions cap_set_proc(3) et cap_get_proc(3) ; si possible,
utilisez plutôt ces routines dans vos applications ; voir les NOTES.
Détails actuels
Maintenant que vous avez été avertis, quelques détails du noyau actuel. Les structures sont définies
comme suit.
#define _LINUX_CAPABILITY_VERSION_1 0x19980330
#define _LINUX_CAPABILITY_U32S_1 1
/* V2 ajoutée à Linux 2.6.25 ; obsolète */
#define _LINUX_CAPABILITY_VERSION_2 0x20071026
#define _LINUX_CAPABILITY_U32S_2 2
/* V3 ajoutée à Linux 2.6.26 */
#define _LINUX_CAPABILITY_VERSION_3 0x20080522
#define _LINUX_CAPABILITY_U32S_3 2
typedef struct __user_cap_header_struct {
__u32 version;
int pid;
} *cap_user_header_t;
typedef struct __user_cap_data_struct {
__u32 effective;
__u32 permitted;
__u32 inheritable;
} *cap_user_data_t;
Les champs effective, permitted et inheritable sont des masques de bits de capacités définies dans
capabilities(7). Notez que les valeurs CAP_* sont indices de bits et nécessitent d'être décalées avant le
OU logique avec le champ de bits. Pour définir les structures à passer à l'appel système, vous devez
utiliser les noms struct __user_cap_header_struct et struct __user_cap_data_struct car les typedef ne
sont que des pointeurs.
Les noyaux antérieurs à Linux 2.6.25 préfèrent les capacités 32 bits avec la version
_LINUX_CAPABILITY_VERSION_1. Linux 2.6.25 a ajouté l'ensemble des capacités 64 bits avec la version
_LINUX_CAPABILITY_VERSION_2. Mais il y avait un bogue dans l'API, donc Linux 2.6.26 a ajouté
_LINUX_CAPABILITY_VERSION_3 pour corriger le problème.
Notez que les capacités 64 bits utilisent datap[0] et datap[1], tandis que celles 32 bits n'utilisent que
datap[0].
Sur les noyaux qui gèrent les capacités de fichier (VFS capabilities support), ces appels système se
comportent légèrement autrement. Cette prise en charge a été ajoutée en option à Linux 2.6.24, avant de
devenir incluse (non optionnelle) dans Linux 2.6.33.
Pour les appels capget(), on peut tester les capacités de n'importe quel processus en indiquant
l'identifiant du processus avec la valeur du champ hdrp->pid.
Pour les détails sur les données, consultez capabilities(7).
Avec la prise en charge des capacités VFS
Les capacités VFS utilisent un attribut de fichier étendu (voir xattr(7)) pour pouvoir se rattacher à des
exécutables. Ce modèle de privilèges rend obsolète la prise en charge par le noyau du paramétrage
asynchrone des capacités d'un processus par un autre. C'est-à-dire que, avec la prise en charge VFS, pour
les appels à capset() les seules valeurs permises pour hdrp->pid sont 0 ou, de manière équivalente, la
valeur renvoyée par gettid(2).
Sans la gestion des capacités VFS
Sur les anciens noyaux qui ne gèrent pas les capacités VFS, capset() peut être utilisé, si l'appelant a
la capacité CAP_SETPCAP, pour modifier non seulement les capacités propres à l'appelant, mais aussi les
capacités d'autres threads. L'appel s'applique aux capacités du thread indiqué par le champ pid de hdrp
lorsqu'il n'est pas nul, ou à celles du thread courant si pid vaut 0. Si pid correspond à un processus
n'utilisant pas les threads, pid peut être un identifiant de processus classique. Pour configurer les
capacités d'un thread faisant partie d'un processus multithread, il faut utiliser un identifiant de
thread du type que renvoie gettid(2). Pour capset(), pid peut également être -1, ce qui affecte tous les
threads sauf l'appelant et init(1), ou bien une valeur inférieure à -1, ce qui applique la modification à
tous les membres du groupe de processus identifiés par -pid.
VALEUR RENVOYÉE
En cas de succès, zéro est renvoyé. En cas d'erreur, -1 est renvoyé et errno est définie pour préciser
l'erreur.
Les appels échoueront avec l'erreur EINVAL, et définiront le champ version de hdrp avec la valeur
_LINUX_CAPABILITY_VERSION_? préférée par le noyau quand une version non prise en charge est fournie. De
cette façon, on peut tester quelle est la révision actuelle de capacité préférée.
ERREURS
EFAULT Mauvaise adresse mémoire. hdrp ne doit pas être NULL. datap ne peut être NULL que quand
l'utilisateur cherche à déterminer la version du format préféré des capacités gérée par le noyau.
EINVAL Un argument est non valable.
EPERM Une tentative a été opérée pour ajouter une capacité dans l'ensemble permitted, ou pour placer une
capacité dans l'ensemble effective hors de l'ensemble permitted.
EPERM Une tentative a été faite pour ajouter une capacité dans l'ensemble inheritable et soit :
- cette capacité n'était pas présente dans l'ensemble applicable à l'appel ; soit
- cette capacité n'était pas dans l'ensemble permitted pour l'appel et l'appelant n'avait pas de
capacité CAP_SETPCAP dans son ensemble effectif.
EPERM Le processus appelant a tenté d'utiliser capset() pour modifier les capacités d'un thread autre
que lui‐même, sans avoir les privilèges nécessaires. Pour les noyaux avec la gestion des capacités
VFS, ce n'est jamais permis. Pour les noyaux sans la gestion des capacités VFS, la capacité
CAP_SETPCAP est requise. (En raison d'un bogue dans les noyaux antérieurs à Linux 2.6.11, cette
erreur était aussi renvoyée si un thread sans cette capacité tentait de modifier ses propres
capacités en indiquant une valeur non nulle de pid (la valeur renvoyée par getpid(2), au lieu de
0).
ESRCH Pas de thread correspondant.
STANDARDS
Linux.
NOTES
L'interface portable pour les fonctions de lecture des capacités et de configuration est fournie par la
bibliothèque libcap disponible à :
http://git.kernel.org/cgit/linux/kernel/git/morgan/libcap.git
VOIR AUSSI
clone(2), gettid(2), capabilities(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess
<https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
<tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
<fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
<nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
<simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
<david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais
<fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
debian-l10n-french@lists.debian.org.
Pages du manuel de Linux 6.8 2 mai 2024 capget(2)