2016-12-22 8 views
1

Я пытаюсь изменить разрешения группы файлов, которые находятся в определенном каталоге. Я использую chmod для этого. Функция не возвращает никаких ошибок, но когда я печатаю старые и новые разрешения, это не похоже, что это что-то меняет.C - chmod() не меняя разрешения

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); 
} 

Я пока не смог найти ошибку. Есть идеи?

ВЫВОД:

a4: 33204 -> 33204

a2: 33204 -> 33204

A3: 33204 -> 33204

a5: 33204 -> 33204

a1: 33204 -> 33204

+0

Разрешения были бы легче понять, если вы используете '% o' для печати в восьмеричном, а не'% u', чтобы печатать их в десятичном формате. Ваша переменная 'archivo' захватывает разрешения в момент вызова' stat() '. Он не отслеживает изменения, сделанные 'chmod()'; вы должны снова вызвать 'stat()' для получения обновленного значения. –

ответ

6

Проблема в том, что вы не получаете новых флагов для файла, вы печатаете те же самые старые флаги, которые вы выбрали до, вызывая chmod.

+0

Я не совсем понимаю. Я сохраняю старый режим в «permisos», меняя разрешения, а затем печатая имя файла, старый и новый, не так ли? –

+4

@EduardoRamos 'archivo' не« отслеживает »статус файла - вы должны вызывать' stat (rutaRel, & archivo); 'снова, после изменения разрешения. –

+0

О, я вижу. Спасибо, чувак! –