1*13582Ssam #ifndef lint 2*13582Ssam static char sccsid[] = "@(#)readdir.c 4.5 (Berkeley) 07/01/83"; 3*13582Ssam #endif 45751Smckusick 56370Smckusic #include <sys/param.h> 6*13582Ssam #include <sys/dir.h> 75751Smckusick 85751Smckusick /* 95751Smckusick * get next entry in a directory. 105751Smckusick */ 115751Smckusick struct direct * 125751Smckusick readdir(dirp) 135751Smckusick register DIR *dirp; 145751Smckusick { 156712Smckusick 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 } 286712Smckusick dp = (struct direct *)(dirp->dd_buf + dirp->dd_loc); 296712Smckusick if (dp->d_reclen <= 0 || 306712Smckusick dp->d_reclen > DIRBLKSIZ + 1 - dirp->dd_loc) 316712Smckusick return NULL; 326712Smckusick dirp->dd_loc += dp->d_reclen; 335766Smckusic if (dp->d_ino == 0) 345766Smckusic continue; 356712Smckusick return (dp); 365751Smckusick } 375751Smckusick } 38