16.05.2015 Views

Working with the Unix OS

Working with the Unix OS

Working with the Unix OS

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C Libraries<br />

/* dirwalk: apply fcn to all files in dir */<br />

#define MAX_PATH 1024<br />

void dirwalk(char *dir, void (*fcn) (char *))<br />

{<br />

char name[MAX_PATH];<br />

Dirent *dp;<br />

DIR *dfd;<br />

if ((dfd =opendir(dir)) == NULL){<br />

fprintf(stderr, "dirwalk:can’t open <strong>the</strong> %s\n",dir);<br />

return;<br />

}<br />

while ((dp = readdir(dfd) != NULL){<br />

if (strcmp(dp->name,".") == 0 || strcmp(dp->name,"..") == 0)<br />

continue; /* skip self and parent */<br />

if (strlen(dir)+strlen(dp->name)+2 > sizeof(name))<br />

fprintf(stderr,"dirwalk: name %s%s is too long\n", dir, dp->name);<br />

else<br />

{<br />

sprintf(name, "%s%s", dir, dp->name);<br />

(*fcn)(name);<br />

}<br />

}<br />

closedir(dfd);<br />

}<br />

The directory information in <br />

#ifndef DIRSIZ<br />

#define DIRSIZ 14<br />

#endif<br />

struct direct /* directory entry */<br />

{<br />

ino_t d_ino; /* inode number */<br />

char d_name[DIRSIZ]; /* long name does not have ’\0‘ */<br />

};<br />

/* opendir: open a directory for readdir calls */<br />

int fstat(int fd, struct stat *);<br />

DIR *opendir(char *dirname)<br />

{<br />

int fd;<br />

struct stat stbuf;<br />

DIR *dp;<br />

}<br />

if ((fd = open(dirname, O_RDONLY, 0)) == -1 || fstat(fd, &stbuf) == -1<br />

|| (stbuf.st_mode & S_IFMT) != S_IFDIR<br />

|| (dp = DIR *) malloc(sizeof(DIR))) == NULL)<br />

return NULL;<br />

dp->fd = fd;<br />

return dp;<br />

/* closedir: close directory opened by opendir */<br />

void closedir(DIR *dp)<br />

{<br />

if (dp)<br />

{<br />

close(dp->fd);<br />

free(dp);<br />

}<br />

}<br />

72

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!