ACCESS(2) Manuel du programmeur Linux ACCESS(2)
NOM
access - Vérifier les permissions d'accès à un fichier.
SYNOPSIS
#include <unistd.h>
int access(const char *pathname, int mode);
DESCRIPTION
access vérifie si le processus serait autorisé à lire,
écrire, exécuter, ou tester l'existence d'un fichier (ou
d'un autre objet appartenant au système de fichiers), dont
le nom est pathname.
Si pathname est un lien symbolique, ce sont les permis
sions du fichier pointé par celui-ci qui sont testées.
mode est un masque constitué d'un ou plusieurs arguments
liés par un OU binaire ( | ) R_OK, W_OK, X_OK et F_OK.
Les requêtes R_OK, W_OK et X_OK servent respectivement à
tester la lecture, l'écriture, et l'exécution du fichier.
La requête F_OK teste si la vérification d'existence du
fichier serait autorisée (ceci dépendant des permissions
des répertoires apparaissant dans le chemin pathname et
éventuellement des liens symboliques rencontrés sur ce
chemin).
Le test est effectué avec les User-ID et Group-ID réels du
processus, plutôt qu'avec les IDs effectifs qui sont
utilisés lorsque l'on tente l'opération. Ceci permet aux
programmes Set-UID de déterminer les autorisations de
l'utilisateur ayant invoqué le programme.
Seuls les bits d'accès sont vérifiés, et non pas le con
tenu du fichier. Ainsi si l'écriture est autorisée dans
un répertoire, ceci signifie que l'on peut créer des
fichiers dans ce répertoire, et non pas que l'on puisse y
écrire comme dans un fichier. Egalement, un fichier DOS
peut être considéré comme exécutable, alors que l'appel
système execve(2) échouera évidemment.
VALEUR RENVOYÉE
access renvoie 0 s'il réussit (toutes les requêtes sont
autorisées), ou -1 s'il échoue (au moins une requête est
interdite), auquel cas errno contient le code d'erreur.
ERREURS
EACCES L'accès serait refusé au fichier lui-même, ou il
n'est pas permis de parcourir l'un des répertoires
de pathname.
EROFS On demande une écriture sur un système de fichiers
Linux 26 Avril 1998 1
ACCESS(2) Manuel du programmeur Linux ACCESS(2)
en lecture-seule.
EFAULT pathname pointe en dehors de l'espace d'adressage
accessible.
EINVAL mode était mal spécifié.
ENAMETOOLONG
pathname est trop long.
ENOENT Un répertoire contenu dans le pathname aurait été
accessible mais n'existe pas, ou est un lien sym
bolique pointant dans le vide.
ENOTDIR Un élément contenu dans le chemin pathname n'est
pas un répertoire.
ENOMEM Pas assez de mémoire pour le noyau.
ELOOP pathname contient une référence circulaire (à
travers un lien symbolique).
EIO erreur générique d'entrée/sortie.
EXEMPLE
#include <stdio.h>
#include <unistd.h>
int
main (void)
{
char * nom_fichier = "/etc/passwd";
if (access (nom_fichier, W_OK) == 0) {
fprintf (stdout, "Ecriture Ok !");
if (getuid() != 0) { /* 0 <=> Super-User */
fprintf (stdout, "Danger !");
}
}
return (0);
}
RESTRICTIONS
access renvoie une erreur si l'un quelconque des types
d'accès est refusé, même si les autres sont acceptés.
Il est possible qu'access ne fonctionne pas correctement
sur un serveur NFS si les correspondances d'UID sont
activées, car ces correspondances sont gérées par le
serveur, et masquées au client qui effectue les vérifica
tions d'autorisation.
Utiliser access pour vérifier si un utilisateur a le
droit, par exemple, d'ouvrir un fichier avant d'effectuer
réellement l'ouverture, risque de créer un trou de
Linux 26 Avril 1998 2
ACCESS(2) Manuel du programmeur Linux ACCESS(2)
sécurité. En effet, l'utilisateur peut exploiter le petit
intervalle de temps entre la vérification et l'accès
effectif pour modifier le fichier.
CONFORMITÉ
SVID, AT&T, POSIX, X/OPEN, BSD 4.3
VOIR AUSSI
stat(2) open(2) chmod(2) chown(2) setuid(2) setgid(2).
TRADUCTION
Christophe Blaess, 1997.
Linux 26 Avril 1998 3