2016-12-22 1 views
1

J'essaie de changer les permissions d'un tas de fichiers qui se trouvent dans un répertoire spécifique. J'utilise chmod pour le faire. La fonction ne renvoie aucune erreur, mais lorsque j'imprime l'ancienne et la nouvelle permissions, il ne semble pas qu'elle change quoi que ce soit.C - chmod() ne change pas les permissions

void main(int argc, char *argv[]){ 
    struct stat archivo;  
    char *directorio = "/home/edu/Escritorio/P7/practica7/prueba"; 
    char *rutaRel = malloc(strlen(directorio) + 1 + NAME_MAX); 
    mode_t permisos; 

    modo = strtol(argv[2], NULL, 0); //I am trying with 0664 

    strcpy(rutaRel, directorio); 
    rutaRel[strlen(directorio)] = '/'; 
    while (ep = readdir (dp)){ 
     strcpy(rutaRel + strlen(directorio) + 1, ep->d_name); 
     stat(rutaRel, &archivo); 
     if(S_ISREG(archivo.st_mode)){ 
      permisos=archivo.st_mode; 
      if((chmod(rutaRel,modo))==-1){ 
       perror("Error: \n"); 
      } 
      printf(" %s: %u -> %u\n",ep->d_name,permisos,archivo.st_mode); 
     } 
    } 

    closedir(dp); 
} 

Je n'ai pas réussi à localiser l'erreur jusqu'à présent. Des idées?

SORTIE:

a4: 33204 -> 33204

a2: 33204 -> 33204

A3: 33204 -> 33204

a5: 33204 -> 33204

a1: 33204 -> 33204

+0

Les permissions seraient plus faciles à comprendre si vous utilisiez '% o' pour les imprimer en octal plutôt que'% u' pour les imprimer en décimal. Votre variable 'archivo' capture les permissions au moment où' stat() 'est appelé. Il ne suit pas la modification apportée par 'chmod()'; vous devez appeler 'stat()' à nouveau pour obtenir la valeur mise à jour. –

Répondre

6

Le problème est que vous n'obtenez pas les nouveaux drapeaux pour le fichier, vous imprimez les mêmes vieux drapeaux que vous avez récupérés avant en appelant chmod.

+0

Je ne comprends pas tout à fait. Je sauve l'ancien mode dans "permisos", en changeant les autorisations et en imprimant le nom de fichier, l'ancien et le nouveau mode, n'est-ce pas? –

+4

@EduardoRamos 'archivo' ne suit pas le statut du fichier - vous devez appeler' stat (rutaRel, & archivo); 'à nouveau, après le changement d'autorisation. –

+0

Oh, je vois. Merci mec! –