#include #include #include #include #include #include #include int main(int argc, char**argv) { if(argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } /* run command 'ls ' and output the result in f */ char command[1024]; sprintf(command, "ls %s", argv[1]); FILE *f = popen(command, "r"); printf("Entering %s\n", argv[1]); sleep(1); char* ret = NULL; do { char filename[1024]; ret = fgets(filename, 1024, f); if(!ret) { break; } char* substr = strstr(filename, "\n"); if(substr) { substr[0]='\0'; } char full_filename[1024]; snprintf(full_filename, 1024, "%s/%s", argv[1], filename); struct stat s; stat(full_filename, &s); if(s.st_mode & S_IFDIR) { printf("New directory: %s\n", full_filename); /* create a new process and run recursively */ int ret = fork(); if(ret == 0) { execlp(argv[0], argv[0], (char*)full_filename, (char*)NULL); perror("execle"); } else if(ret > 0){ /* wait for the child process */ int status; int ret = wait(&status); if(ret < 0) { perror("wait"); } } else { perror("fork"); } } else { printf("New file: %s\n", full_filename); } } while(ret); printf("Leaving %s\n", argv[1]); pclose(f); return EXIT_SUCCESS; }