#include <sys/stat.h.h>
int fchmod( int fileDescriptor, mode_t mode );
Cette fonction permet de changer les droits d'accès du fichier associé au descripteur de fichier passé en paramètre (fchmod = file change mode).
0
.
La gestion des droits Unix/Linux étant basée sur une représentation en base octale, je vous recommande conserver cette façon de faire pour spécifier les nouveaux droits d'accès de votre fichier (ou de votre dossier).
1 |
int result = fchmod( fd, 0755 ); // -rwxr-xr-x |
Pour autant, il est aussi possible de spécifier les droits d'accès via un masque binaire et un jeu de constantes proposé par l'entête <sys/stat.h>. Voici un exemple d'utilisation de cette possibilité.
1 2 |
mode_t rights = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | IROTH | IXOTH; int result = fchmod( fd, rights ); // -rwxr-xr-x |
Le tableau suivant présente les constantes relatives aux droits d'accès sur un fichier (ou un dossier).
Nom de la constante | Valeur numérique | Description |
---|---|---|
Constantes applicables au propriétaire du fichier | ||
S_IRUSR | 00400 | Accès en lecture pour le propriétaire du fichier. |
S_IWUSR | 00200 | Accès en écriture pour le propriétaire du fichier. |
S_IXUSR | 00100 | Accès en exécution pour le propriétaire du fichier (ou droit de traverser pour un dossier). |
S_IRWXU | 00700 |
Accès en lecture, écriture et exécution pour le propriétaire du fichier. Equivaut à S_IRUSR | S_IWUSR | S_IXUSR .
|
Constantes applicables au groupe primaire du fichier | ||
S_IRGRP | 00040 | Accès en lecture pour le groupe primaire du fichier. |
S_IWGRP | 00020 | Accès en écriture pour le groupe primaire du fichier. |
S_IXGRP | 00010 | Accès en exécution pour le groupe primaire du fichier (ou droit de traverser pour un dossier). |
S_IRWXG | 00070 |
Accès en lecture, écriture et exécution pour le groupe primaire du fichier. Equivaut à S_IRGRP | S_IWGRP | S_IXGRP .
|
Constantes applicables aux autres utilisateurs du fichier | ||
S_IROTH | 00004 | Accès en lecture pour les autres utilisateurs du fichier. |
S_IWOTH | 00002 | Accès en écriture pour les autres utilisateurs du fichier. |
S_IXOTH | 00001 | Accès en exécution pour les autres utilisateurs du fichier (ou droit de traverser pour un dossier). |
S_IRWXO | 00007 |
Accès en lecture, écriture et exécution pour les autres utilisateurs du fichier. Equivaut à S_IROTH | S_IWOTH | S_IXOTH .
|
Autres constantes | ||
S_ISUID | 04000 | Défini l'identifiant utilisateur (UID) effectif d'un processus lors de son exécution. |
S_ISGID | 02000 | Défini l'identifiant de groupe (GID) effectif d'un processus lors de son exécution. |
S_ISVTX | 01000 | Défini le « Sticky Bit » (attribut de suppression restreinte). S'il est apposé sur un répertoire et si la modification est permise (w), alors seul le propriétaire du dossier peut y supprimer des fichiers. Les autres utilisateurs autorisés ne peuvent que modifier le contenu du répertoire (mais sans possibilité de suppression de fichiers). |
chmod
est très proche de la fonction présentée dans ce document.
La différence réside dans la manière de spécifier le fichier sur lequel changer les droits d'accès : chmod
attend une
chaîne de caractères, alors que fchmod
attend un descripteur de fichier.
Si le changement de droits se passe bien, la fonction renvoie la valeur 0
.
Dans le cas contraire, la valeur -1
vous sera retournée et la variable errno sera fixée avec le code erreur
constaté.
Voici un exemple de code qui modifie les droits d'accès sur un fichier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> // O_WRONLY, O_CREAT #include <sys/stat.h> // fchmod #include <unistd.h> // open, write, close #define FILE_NAME "demo.txt" int main() { // Création d'un fichier de démonstration int fd = open( FILE_NAME, O_WRONLY | O_CREAT, 0644 ); if ( fd < 0 ) { fprintf( stderr, "Impossible de créer le fichier de démonstration\n" ); exit( EXIT_FAILURE ); } write( fd, "ok\n", 3 ); // On change à plusieurs reprises les droits d'accès et on les affiche. int result = fchmod( fd, 0600 ); if ( result != EXIT_SUCCESS ) { switch( errno ) { case EACCES: fprintf( stderr, "Tu n'as pas les autorisations nécessaires\n" ); break; default: fprintf( stderr, "Ca ne marche pas et je ne t'en dirais pas plus ;-)\n" ); } exit( EXIT_FAILURE ); } char buffer[20]; strcat(strcpy(buffer, "ls -l "), FILE_NAME); system(buffer); fchmod( fd, 0640 ); system(buffer); fchmod( fd, 0644 ); system(buffer); fchmod( fd, 0755 ); system(buffer); // On ferme le fichier close( fd ); return EXIT_SUCCESS; } |
Et voici les résultats produits par cet exemple de code.
$> gcc -o sample sample.c $> ./sample -rw-------. 1 dominique dominique 3 4 janv. 10:49 demo.txt -rw-r-----. 1 dominique dominique 3 4 janv. 10:49 demo.txt -rw-r--r--. 1 dominique dominique 3 4 janv. 10:49 demo.txt -rwxr-xr-x. 1 dominique dominique 3 4 janv. 10:49 demo.txt $>
POSIX 88 (IEEE Std 1003.1-1988) et versions ultérieures.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :