#include <sys/stat.h.h>
int chmod( const char * path, mode_t mode );
Cette fonction permet de changer les droits d'accès du fichier spécifié en paramètre (chmod = 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 = chmod( "filename", 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 = chmod( "filename", 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). |
fchmod
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é.
path
spécifié en paramètre pointe en dehors de l'espace d'adressage autorisé.PATH_MAX
caractères, ou l'un de ses éléments constitutifs dépasse NAME_MAX
.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 |
#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> // chmod #define FILE_NAME "demo.txt" int main() { // Création d'un fichier de démonstration FILE * file = fopen( FILE_NAME, "w" ); if ( file == NULL ) { fprintf( stderr, "Impossible de créer le fichier de démonstration\n" ); exit( EXIT_FAILURE ); } fprintf( file, "Ok\n" ); fclose( file ); // On change à plusieurs reprises les droits d'accès et on les affiche. int result = chmod( FILE_NAME, 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); chmod( FILE_NAME, 0640 ); system(buffer); chmod( FILE_NAME, 0644 ); system(buffer); chmod( FILE_NAME, 0755 ); system(buffer); 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 :