EXECVEAT(2)

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

SYNOPSIS
#include <unistd.h>

int execveat(int dirfd, const char *pathname,
char *const argv[], char *const envp[],
int flags);

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

VALEUR RENVOYÉE
En cas de réussite, execveat() ne renvoie rien. En cas d'échec il renvoie -1 et errno est positionné en fonction.

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

VERSIONS
execveat() a été ajouté au noyau Linux dans sa version 3.19. La gestion dans la bibliothèque C de GNU est en attente.

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

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

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

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

COLOPHON
Cette page fait partie de la publication 5.10 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/.

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> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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.