Directory functions
Script started on Fri May 02 12:31:27 1997
sh-2.00$ cat dtree.c
/* dtree.c - print directory tree under argv[1]. */
/* Does an indented directory tree listing. */
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/param.h>
void do_a_directory(char * pathname, int level)
{
DIR * directory; /* Like a FILE *, but for directories. */
struct dirent * entry; /* Only used as a pointer - see dirent.h */
char * newname; /* Name of directory at next level. */
struct stat statbuf; /* So we can check which files are directories. */
long where; /* We will leave this directory and come */
/* back - need to remember where we were. */
int retval, i;
/* Print this directory name, properly indented. */
for( i = 0; i < level; i++)
printf(" ");
printf("%s\n", pathname);
/* Open a directory for directory reads. */
directory = opendir(pathname);
if(directory == NULL)
{
fprintf(stderr, "Cannot open %s\n", pathname);
perror("Reason");
return;
}
while( ( entry = readdir(directory)) != NULL)
{
/* Skip if . or .. */
if( strcmp(entry -> d_name, ".") == 0 ||
strcmp(entry -> d_name, "..") == 0 )
continue;
/* Manufacture pathname of entry relative to where we started. */
newname = (char *) malloc(MAXPATHLEN);
strcpy(newname, pathname);
strcat(newname, "/");
strcat(newname, entry -> d_name);
/* stat it to see if it is a directory. */
retval = stat(newname, &statbuf);
if (retval == 0 && ( statbuf.st_mode & S_IFDIR))
{
/* If it is, close current directory, do the lower one recursively */
/* and on return reopen the current directory, remembering to */
/* get back to where we were. */
where = telldir(directory);
closedir(directory);
do_a_directory(newname, level + 1);
directory = opendir(pathname);
if(directory == NULL)
{
fprintf(stderr, "Cannot open %s\n", pathname);
return;
}
seekdir(directory, where);
}
free(newname);
}
closedir(directory);
}
void main(int argc, char * argv[])
{
/* Usage check */
if( argc < 2)
{
fprintf(stderr,"Usage: dtree directory\n");
exit(1);
}
do_a_directory(argv[1], 0);
}
sh-2.00$ dtree /usr/local/BinProlog4.00
/usr/local/BinProlog4.00
/usr/local/BinProlog4.00/wam2c
/usr/local/BinProlog4.00/src
/usr/local/BinProlog4.00/src/progs
/usr/local/BinProlog4.00/library
/usr/local/BinProlog4.00/progs
/usr/local/BinProlog4.00/cparser
/usr/local/BinProlog4.00/cparser/progs
/usr/local/BinProlog4.00/multi
/usr/local/BinProlog4.00/multi/myprogs
/usr/local/BinProlog4.00/pl2c
/usr/local/BinProlog4.00/c_inter
/usr/local/BinProlog4.00/c_inter/progs
/usr/local/BinProlog4.00/dynpl2c
/usr/local/BinProlog4.00/doc
/usr/local/BinProlog4.00/TCL
/usr/local/BinProlog4.00/TCL/progs
/usr/local/BinProlog4.00/bin
sh-2.00$ exit
exit
script done on Fri May 02 12:31:50 1997