#include "read_dir.h" int main(int argc,char *argv[]) { void process(char *name); if (argc != 2) { printf(" usage: %s dirname \n", argv[0]); exit(1); } else { process(argv[1]); /* pass in the starting directory */ } return 0; } void process(char *root) { int numOfFiles = 0; void Enq(char *name, que_t *q); void Deq(que_t *q); void Front(char *name,que_t q); enum boolean Empty(que_t q); void initq(que_t *q); que_t nameq; char dname[MAXL], cname[MAXL], buf[MAXL], prefix[MAXL]; struct dirent *dp; DIR *dirp; struct stat statbuf; // status buffer initq(&nameq); Enq(root,&nameq); while (Empty(nameq) != TRUE) { Front(dname,nameq); Deq(&nameq); dirp = opendir(dname); if (dirp != NULL) /* it is a directory */ { printf("directory : %s\n",dname); strcpy(prefix,dname); strcat(prefix,"/"); for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { if ((strcmp(dp->d_name,"..") != 0) && (strcmp(dp->d_name,".") != 0)) { /* prevent from infinite loop */ strcpy(cname,prefix); strcat(cname,dp->d_name); /* concatenate the prefix */ if (lstat(cname,&statbuf) == 0) { if ((statbuf.st_mode & 0xF000) != S_IFLNK) // not a symbolic link Enq(cname,&nameq); else cerr << "skipped s-link " << prefix << dp->d_name << endl; } } } closedir (dirp); } else /* it is a regular file */ { cout << " processing file : " << dname << endl; numOfFiles ++; } /* if (dirp != NULL) else */ } /* while */ cout << " a total of " << numOfFiles << " files were counted\n"; } void initq(que_t *q) { q->head = q->tail = NULL; } enum boolean Empty(que_t q) { if (q.head == NULL) return TRUE; else return FALSE; } void Enq(char *name, que_t *q) { item_t *temp; temp = (item_t *)malloc(sizeof(item_t)); strcpy(temp->name,name); temp->next = NULL; if (Empty(*q) == TRUE) { q->head = temp; q->tail = temp; } else { q->tail->next = temp; q->tail = q->tail->next; } } void Deq(que_t *q) { item_t *temp; if (Empty(*q) == TRUE) { printf(" error in dequeue \n"); exit(1); } else { temp = q->head; q->head = q->head->next; free(temp); } } void Front(char *name,que_t q) { if (Empty(q) == TRUE) { printf(" error in dequeue \n"); exit(1); } else strcpy(name, q.head->name); }