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

POSIX C Discussion :

Afficher les droits d'un fichier


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Afficher les droits d'un fichier
    Bonjour,
    J'essaye de recoder la fonction Ls et j'ai un petit soucis quant à l'affichage des droits.
    Le code que j'utilise pour les afficher est :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
     
    #include <sys/stat.h>
     
    void    put(char c)
    {
      write(1, &c, 1);
    }
     
    void    aff_right(const mode_t mode, struct stat *s)
    {
      if (S_ISDIR(s->st_mode))
        put('d');
      else
        put('-');
      (mode & S_IRUSR) ? put('r') : put('-');
      (mode & S_IWUSR) ? put('w') : put('-');
      (mode & S_IXUSR) ? put('x') : put('-');
      (mode & S_IRGRP) ? put('r') : put('-');
      (mode & S_IWGRP) ? put('w') : put('-');
      (mode & S_IXGRP) ? put('x') : put('-');
      (mode & S_IROTH) ? put('r') : put('-');
      (mode & S_IWOTH) ? put('w') : put('-');
      (mode & S_IXOTH) ? put('x') : put('-');
      put(' ');
    }


    Cependant voilà mon résultat suivit du résultat que me donne ls -la :
    Le miens:

    --w-----wx
    --w-r---wx
    --wx-wx-wx
    --wxrwx-wx
    dr--rw--wx
    -r-x--x-wx
    -r-xrw--wx
    -rw--w--wx
    -rw-rwx-wx
    -rwx-wx-wx
    -rwxrwx-wx
    ----rw--wx
    Lui obtenu avec ls -la:

    -rw-r--r--
    -rw-r--r--
    -rw-r--r--
    -rw-r--r--
    -rw-r--r--
    -rw-r--r--
    -rwxr-xr-x
    -rw-r--r--
    drwxr-xr-x
    -rw-r--r--
    -rw-r--r--
    -rw-r--r--
    Ca va bientôt faire 5 heures que je suis bloqué dessus et je ne vois absolument pas d'où viens le problème... pourriez-vous m'aider?
    Merci !

  2. #2
    Responsable Systèmes

    Sans les noms de fichiers, c'est difficile de voir.

    ton implémentation de ls et le vrai ls n'affichant pas forcement les fichiers dans le même ordre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutor...s/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre à l'essai
    Citation Envoyé par chrtophe Voir le message
    Sans les noms de fichiers, c'est difficile de voir.

    ton implémentation de ls et le vrai ls n'affichant pas forcement les fichiers dans le même ordre.
    Ils ne sont pas affichés dans le même ordre, mais par exemple j'ai des "xw" à chaque fin quand le vrai n'a qu'un "x"..

  4. #4
    Modérateur

    Bonjour,

    Montre-nous la fonction qui appelle aff_right().

  5. #5
    Membre à l'essai
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    int     aff_direct(int argc, char **argv)
    {
      DIR           *directory;
      struct dirent *read;
      struct stat   s;
      char          *str;
     
      str = malloc(sizeof(char) * 25);
      directory = opendir(".");
      if (directory == NULL)
        exit(1);
      count_total();
      while ((read = readdir(directory)) != NULL)
        {
               if (stat(read->d_name,&s) == -1)
            {
              perror("stat");
              exit(EXIT_FAILURE);
            }
               if (read->d_name[0] != '.')
                 {
                   aff_right();
                   printf("%d ", s.st_nlink);
                   aff_user();
                   aff_group();
                   printf("%d ", s.st_size);
                   str = (ctime(&s.st_mtime));
                   aff_acces(str);
                   printf("%s ", str);
                   printf("%s\n", read->d_name);
                 }
        }
      if (argc != 2)
        exit(1);
      if (closedir(directory) == (-1))
        exit(-1);
      return (0);
    }

  6. #6
    Modérateur

    Citation Envoyé par SBRKH Voir le message
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    void    aff_right(const mode_t mode, struct stat *s)
    {


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
               if (read->d_name[0] != '.')
                 {
                   aff_right();
                   printf("%d ", s.st_nlink);
                   aff_user();
    aff_right() attend deux arguments mais tu l'appelles sans passer ces arguments ?

  7. #7
    Membre à l'essai
    Citation Envoyé par Obsidian Voir le message
    aff_right() attend deux arguments mais tu l'appelles sans passer ces arguments ?
    Effectivement... ^^

  8. #8
    Expert éminent sénior
    Au passage, les nombres magiques, caymal. Utilise STDOUT_FILENO comme descripteur de fichier à la place de 1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.