Comprobando si la ruta del archivo es legible y escribible

Estoy tratando de enumerar recursivamente todos los archivos y subdirectorios dada una ruta de archivo. Esto funciona, hasta que cuando bash agregar el código para verificar si la ruta del archivo es legible / escribible (lo que comenté en las líneas). Ahora no entra en el bucle recursivo. Este es mi codigo

#include  #include  #include  #include  void listDir(char *name, FILE *fp) { DIR *dir; struct dirent *entry; if (!(dir = opendir(name))) return; if (!(entry = readdir(dir))) return; do { FILE *fileCopy; char read[50]; char write[50]; char path[1024]; int len = snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); path[len] = 0; if (entry->d_type == DT_DIR) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; // if((fileCopy = fopen(path, "rb")) == NULL){ // strcpy(read,"Not Readable"); // } // else{ // strcpy(read,"Readable"); // } // if((fileCopy = fopen(path, "wb")) == NULL){ // strcpy(write,"Not Writable"); // } // else{ // strcpy(write,"Writable"); // } fprintf(fp,"[D]%s - %s,%s\n", path,read,write); listDir(path ,fp); } else { // if((fileCopy = fopen(path, "rb")) == NULL){ // strcpy(read,"Not Readable"); // } // else{ // strcpy(read,"Readable"); // } // if((fileCopy = fopen(path, "wb")) == NULL){ // strcpy(write,"Not Writable"); // } // else{ // strcpy(write,"Writable"); // } fprintf(fp,"[F]%s - %s,%s\n", path,read,write); } } while ((entry = readdir(dir))); closedir(dir); } int main(void) { FILE *fp; fp = fopen("/var/mobile/Applications/FileIOAccess.txt", "w"); listDir("/var",fp); fclose(fp); return 0; } 

Este ejemplo usa el access para reemplazar su uso de fopen para probar los permisos de archivo.

 void listDir(char *name, FILE *fp) { DIR *dir; struct dirent *entry; if (!(dir = opendir(name))) return; if (!(entry = readdir(dir))) return; do { char readString[50] = {0}; char writeString[50] = {0}; char path[1024]; char filetype; snprintf(path, sizeof(path)-1, "%s/%s", name, entry->d_name); if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; if (access(path, R_OK) == 0) strcpy(readString, "Readable"); else strcpy(readString, "Not Readable"); if (access(path, W_OK) == 0) strcpy(writeString, "Writable"); else strcpy(writeString, "Not Writable"); switch (entry->d_type) { case DT_UNKNOWN: filetype = '?'; break; case DT_FIFO: filetype = 'P'; break; case DT_CHR: filetype = 'C'; break; case DT_DIR: filetype = 'D'; break; case DT_BLK: filetype = 'B'; break; case DT_REG: filetype = 'F'; break; case DT_LNK: filetype = 'L'; break; case DT_SOCK: filetype = 'S'; break; case DT_WHT: filetype = 'W'; break; default: filetype = '?'; break; } fprintf(fp,"[%c]%s - %s,%s\n", filetype, path, readString, writeString); if (entry->d_type == DT_DIR) listDir(path, fp); } while ((entry = readdir(dir))); closedir(dir); }