2010-11-09 9 views
2

J'ai ce code:C: comportement étrange avec nftw()

#include <ftw.h> 
#include <stdio.h> 
#include <string.h> 

int nftw_stat(const char *path, const struct stat *stat, int flags, 
       struct FTW *ftw) 
{ 
    if (strcmp(path, "/home/pf/.gvfs\0") == 0) { 
     printf("nftw()\n"); 
     printf("mode = %d\n", stat->st_mode); 
     printf("size = %d\n", (int) stat->st_size); 
    } 

    return 0; 
} 

int main() 
{ 
    if (nftw("/home/pf", &nftw_stat, 1, FTW_PHYS)) { 
     perror("nftw"); 
     return 2; 
    } 
} 

Si je l'exécute normalement, il retourne la même manière que la fonction stat():

mode = 16704 (S_IFDIR | S_IRUSR | S_IXUSR) 
size = 0

Mais quand Je l'exécute avec sudo, il renvoie ceci:

mode = 16832 (S_IFDIR | S_IRWXU) 
size = 4096

Que se passe-t-il? Si j'utilise stat() avec sudo il me donne l'erreur Permission refusée. Cela se produit uniquement avec le répertoire .gvfs, dont les autorisations sont 500 (dr-x ------). Si sudo ne peut pas lire avec stat(), pourquoi cela fonctionne-t-il avec nftw()? : |

+0

Quelles sont les protections du répertoire/home/pf? Cela contrôle ce que vous voyez, pas le masque d'autorisation sur le répertoire .gvfs lui-même. –

+2

btw, vous n'avez pas besoin d'ajouter '\\ 0' aux chaînes C vous-même. – Hasturkun

+0

Bon à savoir @Hasturkun. Merci pour le conseil! (Je suis nouveau en C) –

Répondre

3

Qu'est-ce qui se passe probablement, c'est que stat a échoué sur le répertoire, mais vous imprimez les valeurs de la structure de statistiques, ce qui signifie que vous obtenez des ordures. Vous devez vérifier la valeur du typeflag, que vous appelez "flags" dans votre routine nftw_stat pour vous assurer que stat a correctement défini la structure de statistiques.

int nftw_stat(const char *path, const struct stat *stat, int typeflag, 
      struct FTW *ftw) 
{ 
    if (typeflag == FTW_NS) { 
    printf("stat failed on %s\n", path); 
    return 1; 
    } 
    if (strcmp(path, "/home/pf/.gvfs\0") == 0) { 
    printf("nftw()\n"); 
    printf("mode = %d\n", stat->st_mode); 
    printf("size = %d\n", (int) stat->st_size); 
    } 
    return 0; 
} 
+2

J'ajouterais aussi 'FTW_DNR' au typeflag check – Hasturkun

+0

+1 pour le commentaire, en utilisant des choses comme stat, vous devriez attraper autant d'erreurs que possible, et lire la documentation ... – steabert

+0

Merci pour le conseil FTW_DNR aussi, @Hasturkun. Ce sera utile. Merci @steabert pour la réponse claire, j'ai raté l'importance de l'argument typeflag. –