15751Smckusick /* Copyright (c) 1982 Regents of the University of California */ 25751Smckusick 3*6712Smckusick static char sccsid[] = "@(#)readdir.c 4.4 05/07/82"; 45751Smckusick 56370Smckusic #include <sys/param.h> 6*6712Smckusick #include <dir.h> 75751Smckusick 85751Smckusick /* 95751Smckusick * get next entry in a directory. 105751Smckusick */ 115751Smckusick struct direct * 125751Smckusick readdir(dirp) 135751Smckusick register DIR *dirp; 145751Smckusick { 15*6712Smckusick register struct direct *dp; 165751Smckusick 175751Smckusick for (;;) { 185751Smckusick if (dirp->dd_loc == 0) { 195756Smckusic dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 205872Smckusic DIRBLKSIZ); 215751Smckusick if (dirp->dd_size <= 0) 225751Smckusick return NULL; 235751Smckusick } 245751Smckusick if (dirp->dd_loc >= dirp->dd_size) { 255751Smckusick dirp->dd_loc = 0; 265751Smckusick continue; 275751Smckusick } 28*6712Smckusick dp = (struct direct *)(dirp->dd_buf + dirp->dd_loc); 29*6712Smckusick if (dp->d_reclen <= 0 || 30*6712Smckusick dp->d_reclen > DIRBLKSIZ + 1 - dirp->dd_loc) 31*6712Smckusick return NULL; 32*6712Smckusick dirp->dd_loc += dp->d_reclen; 335766Smckusic if (dp->d_ino == 0) 345766Smckusic continue; 35*6712Smckusick return (dp); 365751Smckusick } 375751Smckusick } 38