IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Mode litteral -> mode octal


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Par défaut Mode litteral -> mode octal
    salut,

    je souhaite récupérer le listage d'un repertoire façon Linux ('ls -l')
    J'ai vu que la fonction stat retourne un variable de type struct stat.

    Dans cette strcuture, on trouve un champ st_mode qui donne les droits sur le fichier.
    Or ce mode est exprimé en littéral.
    Quand on l'affiche avec un printf("%d",s.st_mode) on recoit un nombre qui ne ressemblepas du tout aux habituels 755, ou 644 de linux.

    Comment peut on passer du mode litteral au mode octal ( droits linux) ?

    merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quand on l'affiche avec un printf("%d",s.st_mode) on recoit un nombre qui ne ressemblepas du tout aux habituels 755, ou 644 de linux.

    Comment peut on passer du mode litteral au mode octal ( droits linux) ?
    printf("%o",s.st_mode) sort le nombre exprimé en octal

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Par défaut
    J'avais essayé avec ce spécificateur de format %o mais je recupere un chiffre encore tres éloigné (33188 par ex) des droits Unix.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'avais essayé avec ce spécificateur de format %o mais je recupere un chiffre encore tres éloigné (33188 par ex) des droits Unix.
    C'est impossible, 8 n'est pas un chiffre octal!
    Peux tu donner un exemple précis de ce que tu obtiens et ce que tu attends ?

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    on trouve un champ st_mode qui donne les droits sur le fichier
    J'ai consulté la doc là dessus. Elle dit simplement qu'un bit de ce champ indique si l'utilisateur a le droit de lecture et un autre s'il a le droit d'écriture. Pas que les permissions sont codés comme on a l'habitude de les voir.
    Elle donne l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       if (statbuf.st_mode & S_IREAD)
          printf("User has read permission on file.\n");
       if (statbuf.st_mode & S_IWRITE)
          printf("User has write permission on file.\n");

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Par défaut
    OK.
    Je viens de toruver cette page également
    http://dpobel.free.fr/man/html/html.2/stat.htm

    Voici des fichiers avec un listage classique:
    [tequila:/home/mat/projet_ftp]$ ls -al
    total 1760
    drwxr-xr-x 2 mat mat 4096 2005-06-19 23:14 .
    drwxr-xr-x 49 mat mat 4096 2005-06-19 23:14 ..

    Voici les memes fichiers en exploitant la structure stat:
    [tequila:/home/mat/projet_ftp]$ ./scan
    16877 2 1000 1000 4096 19/06/2005 23:14:14 .
    16877 49 1000 1000 4096 19/06/2005 23:14:14 ..
    On voit que les droits rwxrwxrwx sont devenus, par l'intermediaire du champ st_mode des nombres difficiles à mettre en relation avec les droits.

    J'aurais besoin d'une fonction, d'une structure capable de faire la convertion entre 16877 et rwxr-xr-x pour envoyer un listage 'lisible' du contenu d'un repertoire (avec les droits associés aux fichiers) à une appli cliente.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par EvilAngel
    J'aurais besoin d'une fonction, d'une structure capable de faire la convertion entre 16877 et rwxr-xr-x pour envoyer un listage 'lisible' du contenu d'un repertoire (avec les droits associés aux fichiers) à une appli cliente.
    Il suffit de connaitre la sémantique de chaque bits et de l'interpréter comme il faut... C'est pas dans la doc ?

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    16877 donne en octal 40755 ou si on préfère en binaire 100 000 111 101 101
    Le dernier 101 sont les droits du monde dans l'ordre rwx donc donne r-x
    le précédent 101 sont les droits du groupe donc donne r-x
    le 111 sont les droits du propriétaire et donne rwx
    les trois bits précédents à 0 correspondent (du poids fort au poids faible) à
    setuid, setgid, sticky.
    Je suppose, je n'ai pas vérifié, que le 4 indique un répertoire.
    donc un chiffre octal correspond à un droit :
    0->--- ; 4->r--
    1->--x ; 5->r-x
    2->-w- ; 6->rw-
    3->-wx ; 7->rwx

    Il suffit d'isoler la repésentation binaire par paquet de trois bits (à partir du poids faible), ou si on préfère calculer :
    16877 % 8 = 5 -> Monde = r-x
    16877/8 = 2109 ; 2109%8 = 5 ->Groupe = r-x
    2109/8 =263 ; 263%8 = 7 ->Propriétaire = rwx
    Mettre peut être la correspondance dans un tableau de chaine et on a qq chose d'assez simple.

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2004
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 236
    Par défaut
    Super diogene
    Merci

    Je pense aussi que le tableau c'est le plus simple

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. difference en mode debug et mode release
    Par jiraya43 dans le forum MFC
    Réponses: 10
    Dernier message: 01/06/2006, 19h45
  2. Logiciel en mode ASP ou mode TSE
    Par bob33 dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 29/05/2006, 10h49
  3. Passage du mode console au mode graphique
    Par just1980 dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 23/10/2005, 20h48
  4. Réponses: 6
    Dernier message: 22/06/2005, 10h05
  5. Réponses: 5
    Dernier message: 11/12/2002, 12h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo