#include #include #include #include #include #include DIR *opendir_carefully(const char *dir_name) { DIR *dir; if((dir = opendir(dir_name)) == NULL) { perror("Can't open directory"); exit(-1); } return dir; } void recurse_dir(const char *dir_name) { DIR *dir; struct dirent *entry; char old_dir_path[1024], dir_name_buf[1024]; // need to save old path... if (getcwd(old_dir_path, 1024) != old_dir_path) { perror("Current path way too long"); exit(-1); } chdir(dir_name); dir = opendir_carefully("."); while((entry = readdir(dir)) != NULL) { printf("(%s)/(%s)/%s\n",old_dir_path,dir_name,entry->d_name); if ((entry->d_type == DT_DIR) && strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { // first save our state and close current dir off_t dir_offset = telldir(dir); closedir(dir); if (strlen(entry->d_name) >= 1024) { perror("Directory entry way too long"); exit(-1); } strcpy(dir_name_buf, entry->d_name); recurse_dir(dir_name_buf); // reopen dir and restore our state dir = opendir_carefully("."); seekdir(dir, dir_offset); } } closedir(dir); chdir(old_dir_path); } int main(int argc, char **argv) { recurse_dir("."); }