EXECVEAT(2) Manuel du programmeur Linux EXECVEAT(2)

execveat - Exécuter un programme relatif au descripteur de fichier d'un répertoire

#include <unistd.h>
int execveat(int dirfd, const char *pathname,
             const char *const argv[], const char *const envp[],
             int flags);

Note : il n'existe pas d'enveloppe pour cet appel système dans la glibc ; voir NOTES.

L'appel système execveat() exécute le programme auquel renvoient dirfd et pathname. Il opère exactement de la même manière que execve(2), excepté les différences décrites dans cette page de manuel.

Si le nom de chemin fourni dans pathname est relatif, il est interprété relativement au répertoire référencé par le descripteur de fichier dirfd (plutôt que relativement au répertoire de travail courant du processus appelant, comme cela est fait par execve(2) pour un chemin relatif).

Si pathname est relatif et que dirfd est la valeur spéciale AT_FDCWD, pathname est interprété relativement au répertoire de travail courant du processus appelant (comme avec execve(2)).

Si pathname est absolu, alors dirfd est ignoré.

Si pathname est une chaîne vide et si le drapeau AT_EMPTY_PATH est indiqué, le descripteur de fichier dirfd spécifie le fichier à exécuter (c-est-à-dire que dirfd renvoie à un fichier exécutable et non à un répertoire).

L'argument flags est un masque de bit qui peut comprendre zéro ou plusieurs des drapeaux suivants :

AT_EMPTY_PATH
Si pathname est une chaîne vide, opérer sur le fichier auquel renvoie dirfd (qu'on peut obtenir en utilisant le drapeau O_PATH de open(2)).
AT_SYMLINK_NOFOLLOW
Si le fichier identifié par dirfd est un pathname non NULL est un lien symbolique, l'appel échoue avec l'erreur ELOOP.

On success, execveat() does not return. On error, -1 is returned, and errno is set to indicate the error.

Les mêmes erreurs qui apparaissent pour execve(2) peuvent apparaître pour execveat(2). Les erreurs supplémentaires suivantes peuvent également se produire pour execveat(2) :
EBADF
dirfd n'est pas un descripteur de fichier valable.
EINVAL
flags contient un attribut non valable.
ELOOP
flags comprend AT_SYMLINK_NOFOLLOW et le fichier identifié par dirfd et un pathname non NULL est un lien symbolique.
ENOENT
Le programme identifié par dirfd et pathname exige d'utiliser un interpréteur (tel qu'un script qui commence par « #! », mais le descripteur de fichier dirfd a été ouvert avec le drapeau O_CLOEXEC, d'où il s'en suit que le fichier du programme est inaccessible à l'interpréteur lancé. Voir BOGUES.
ENOTDIR
pathname est relatif et dirfd est un descripteur de fichier faisant référence à un fichier qui n'est pas un dossier.

execveat() was added to Linux in kernel 3.19.

L'appel système execveat() est spécifique à Linux.

Outre les raisons expliquées dans openat(2), l'appel système execveat() est également nécessaire pour permettre à fexecve(3) d'être implémenté sur des systèmes où aucun système de fichiers /proc n'est monté.

Si on lui demande d'exécuter un fichier script, argv[0] qui est passé à l'interpréteur de script est une chaîne sous la forme /dev/fd/N ou /dev/fd/N/P, où N est le numéro du descripteur de fichier passé via l'argument dirfd. Une chaîne sous la première forme apparaît quand AT_EMPTY_PATH est utilisé. Une chaîne sous la deuxième forme apparaît quand le script est indiqué via dirfd et pathname ; dans ce cas, P est la valeur donnée à pathname.

Pour les mêmes raisons décrites dans fexecve(3), l'usage naturel quand on utilise execveat() est de positionner l'attribut close-on-exec sur dirfd (mais voir BOGUES).

La glibc ne fournit pas de fonction autour de cet appel système ; appelez-le avec syscall(2).

L'erreur ENOENT décrite ci-dessus signifie qu'il n'est pas possible de positionner l'attribut close-on-exec sur le descripteur de fichier donné à l'appel sous la forme :

execveat(fd, "", argv, envp, AT_EMPTY_PATH);

Cependant, l'impossibilité de positionner l'attribut close-on-exec signifie qu'un descripteur de fichier renvoyant à un script a une fuite via le script lui-même. Outre qu'elle gaspille le descripteur de fichier, cette fuite peut l'épuiser dans des scénari où les scripts utilisent execveat() de manière récursive.

execve(2), openat(2), fexecve(3)

Cette page fait partie de la publication 5.11 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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> 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.

22 mars 2021 Linux