#include #include #include #include #include #include #include #define SIZE 256 void usage(char *name) { printf("Usage : %s [directory]\n", name); } int lister(char *directory) { DIR *dir = NULL; struct dirent *file = NULL; if((dir = opendir(directory)) == NULL) { fprintf(stderr, "Error %s\n", directory); return EXIT_FAILURE; } printf("Directory %s :\n", directory); while((file = readdir(dir)) != NULL) { if(strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { struct stat s_stat; char savedirectory[SIZE]; memset(savedirectory, 0, SIZE); strcpy(savedirectory, directory); if(savedirectory[strlen(savedirectory) - 1] != '/') { if(SIZE - strlen(savedirectory) - 1) == 0) { fprintf(stderr, "Error cannot add the '/'\n"); return EXIT_FAILURE; } strncat(savedirectory, "/", SIZE - strlen(savedirectory) - 1); } stat(strncat(savedirectory, file->d_name, SIZE - strlen(savedirectory) - 1), &s_stat); if(S_ISDIR(s_stat.st_mode)) { lister(savedirectory); } else { printf("\t%s\n", savedirectory); } } } printf("End directory %s\n", directory); closedir(dir); return EXIT_SUCCESS; } int main(int argc, char **argv) { char directory[SIZE]; if(argc < 2) { usage(argv[0]); return EXIT_FAILURE; } strncpy(directory, argv[1], SIZE - 1); return lister(directory); }