Syntaxe
Paramètres
Nom |
Description |
pathname |
Ce paramètre permet d'indiquer le chemin de répertoire et/de fichiers à vérifier |
mode |
Ce paramètre permet d'indiquer le numéro du mode d'accès : |
F_OK |
0 |
Cette constante permet d'indiquer une vérification de l'existence seulement |
X_OK |
2 |
Cette constante permet d'indiquer une vérification de la possibilité d'exécution |
W_OK |
4 |
Cette constante permet d'indiquer une vérification de la possibilité d'écriture |
R_OK |
6 |
Cette constante permet d'indiquer une vérification de la possibilité de lecture |
N.B.: Il est possible d'effectuer des combinaisons de vérification comme par exemple «W_OK | R_OK» permet de vérifier la possibilité de lecture et d'écriture |
Retour
Valeur |
Description |
0 |
Cette valeur permet d'indiquer que le fichier existe et que l'accès spécifié correspond. |
-1 |
Cette valeur permet d'indiquer que le fichier n'existe pas ou que le mode d'accès spécifié ne correspond pas. Dans ce cas, il sera possible d'obtenir des informations supplémentaires en consultant la variable errno. |
Description
Cette fonction permet de vérifier le mode d'accès d'un fichier.
Remarques
- L'utilisation de la fonction access() pour vérifier si un utilisateur est autorisé, par exemple, à ouvrir un fichier avant de le faire en utilisant
open crée une faille de sécurité, car l'utilisateur peut exploiter le court intervalle de temps entre la vérification et l'ouverture du fichier pour le
manipuler. Pour cette raison, l'utilisation de cet appel système doit être évitée. Dans l'exemple venant d'être décrit, une alternative plus sûre serait de basculer temporairement
l'identificateur utilisateur effectif du processus sur l'identificateur réel, puis d'appeler open.
- La fonction access() déréférence toujours les liens symboliques. Si vous devez vérifier les autorisations sur un lien symbolique, utilisez
faccessat avec le drapeau AT_SYMLINK_NOFOLLOW.
- La fonction access() renvoie une erreur si l'un des types d'accès en mode est refusé, même si certains des autres types d'accès en mode sont autorisés.
- Si le processus appelant dispose des privilèges appropriés (c'est-à-dire qu'il est un super utilisateur), la norme POSIX.1-2001 autorise une mise en oeuvre pour
indiquer le succès d'une vérification X_OK même si aucun des bits d'autorisation d'exécution de fichier n'est défini. Tandis que les distributions Linux n'agissent pas
comme cela.
- Un fichier n'est accessible que si les autorisations sur chacun des répertoires du préfixe de chemin d'accès du nom de chemin accordent (c'est-à-dire, exécutent) l'accès.
Si un répertoire est inaccessible, l'appel à la fonction access() échouera, quelles que soient les autorisations sur le fichier lui-même.
- Seuls les bits d'accès sont vérifiés, pas le type ou le contenu du fichier. Par conséquent, si un répertoire est accessible en écriture, cette situation signifie probablement que des
fichiers peuvent être créés dans le répertoire et non pas que le répertoire peut être écrit en tant que fichier. De même, un fichier DOS peut être
considéré comme exécutable, mais l'appel à la fonction execve échouera toujours.
- La fonction access() peut ne pas fonctionner correctement sur les systèmes de fichiers NFS avec la cartographie UID activé, car la cartographie UID
est effectué sur le serveur et masqué par le client, vérifiant les autorisations. Des problèmes similaires peuvent survenir pour les montages FUSE.
- Dans le noyau 2.4 (et versions antérieures) de Linux, il existe une certaine étrangeté dans la gestion des tests X_OK pour
le super utilisateur. Ainsi, si toutes les catégories d'autorisations d'exécution sont désactivées pour un fichier non-répertoire, le test unique access() renvoyant -1 est lorsque le
mode est spécifié comme étant simplement X_OK; si R_OK ou W_OK est également spécifié en mode, alors la fonction access() renvoie 0 pour ces fichiers.
Les premiers noyaux 2.6 (jusqu'à 2.6.3 inclus) se sont également comportés de la même manière que le noyau 2.4. Dans les noyaux antérieurs à 2.6.20, la fonction access() ignorait
l'effet de le drapeau MS_NOEXEC s'il était utilisé par un mount pour le système de fichiers sous-jacent. Depuis le noyau 2.6.20, la fonction access() fixe correctement
ce drapeau.
- Les codes d'erreurs retournés par la variable «errno» correspondent généralement à ceci :
EACCES |
Cette constante permet d'indiquer un accès refusé ou recherche de permission à un dossier dans le préfixe du chemin étant inaccessible. |
ELOOP |
Cette constante permet d'indiquer qu'il y a trop de liens symboliques rencontré afin de résoudre le chemin de nom de fichier. |
ENAMETOOLONG |
Cette constante permet d'indiquer que le fichier est trop long |
ENOENT |
Cette constante permet d'indiquer qu'une composante du chemin n'existe pas ou que le chemin est une chaine de caractères vide. |
ENOTDIR |
Cette constante permet d'indiquer que le chemin spécifié n'est pas un répertoire. |
EROFS |
Cette constante permet d'indiquer que le système de fichiers est en mode lecture seulement. |
EFAULT |
Cette constante permet d'indiquer que l'adresse est invalide. |
EINVAL |
Cette constante permet d'indiquer que le paramètre est invalide. |
EIO |
Cette constante permet d'indiquer qu'une erreur d'entrée/sortie s'est produite. |
ENOMEM |
Cette constante permet d'indiquer qu'il n'y a pas d'espace de disponible. |
ETXTBSY |
Cette constante permet d'indiquer que le fichier texte est occupé. |
Exemple
Voici un exemple, du nom de fichier «ACCESS.C» permettant de tester si le fichier du même nom existe :
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- int main() {
- if(access("ACCESS.C",F_OK)==0) {
- printf("Le fichier «ACCESS.C» existe !\n");
- } else {
- printf("Le fichier «ACCESS.C» n'existe pas !\n");
- }
- return 0;
- }
on obtiendra le résultat suivant :
Le fichier «ACCESS.C» existe !
Dernière mise à jour : Jeudi, le 23 juillet 2015