Participer au site avec un Tip
Rechercher
 

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 :

Fonction fchmod - Entête <sys/stat.h>

#include <sys/stat.h.h>

Fonction fchmod

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).

il est possible, en langage C, de spécifier un entier en base octale (base 8), en débutant votre entier via le caractère 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
Spécification des droits d'accès en base octale.

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
Spécification des droits d'accès via un masque binaire.

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).
la fonction 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.

Paramètres

Valeur de retour

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é.

Codes erreurs pouvant être retournés

Exemple de code

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;
}
Exemple d'utilisation de la fonction fchmod

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
$> 

Conformité

POSIX 88 (IEEE Std 1003.1-1988) et versions ultérieures.

Sujets connexes