Gestion des droits d'accès aux fichiers
(où répertoires...)
Vérifier les droits d’accès à un fichier
La fonction access() teste les conditions d'accès à un fichier.
#include <errno.h>
int access (char *path, int amode);
path pointe sur un chemin et un fichier.
amode contiend les droits à vérifier, Si amode
est 0 la fonction testera l'existence du fichier.
Si la fonction access retourne 0 les droits sont acceptés, sinon elle retourne -1 si erreur et errno indique l'erreur
Exemple:
int ret;
ret= access ( "/etc/passwd", 0444); /*doit retourner 0*/
Il est possible de déterminer/récupérer les droits d'accès d'un fichier via la récupération du status d'un fichier
Pour plus de détail voir aussi Status d'un fichier et information sur le fichier.
Modifier les droits d'accès à un fichier
Deux fonctions permettent de modifier les droits d'accès à un fichier.
Modifier les droits d'un fichier à partir de son nom : int chmod(const
char *pathname, mode_t mode);
Modifier les droits d'un fichier à partir de son descripteur:
int fchmod(int fildes, mode_t mode);
pathname pointe sur un chemin et un fichier.
mode pour indiquer les nouveaux droits. Pour modifier les droits d'accès, il faudra utiliser le | (ou logique) pour combiner les différentes valeurs possibles.
fildes pour indiquer le descripteur de fichier
Les includes à utiliser
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h> Pour utiliser les constantes permettant de définir
les droits d'accès
La fonction retourne 0 si pas de problème, sinon -1 et errno indique l'erreur
Changer le propriétaire ou le groupe d'un fichier
Il s'agit de la fonction chown()
#include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group);
En entrée:
path contient le nom et chemin d'un fichier (répertoire)
uid_t owner l'UID du nouvel utilisateur (-1 pour ne pas modifier)
gid_t group le GID du nouveau groupe (-1 pour ne pas modifier)
Le succès
de cette fonction sera limitées au privilèges du processus en
cours d'exécution ! Voir à positionner le SUID
pour un propriétaire root pour faire des essais, mais attention à
ce que vous allez faire dans ce code !
Donc en sortie:
La fonction retourne 0 si succès, -1 sinon et errno précise l'erreur rencontrée.