#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 :