15751Smckusick /* Copyright (c) 1982 Regents of the University of California */ 25751Smckusick 3*5766Smckusic static char sccsid[] = "@(#)readdir.c 1.3 02/12/82"; 45751Smckusick 55751Smckusick #include <sys/types.h> 65751Smckusick #include <ndir.h> 75751Smckusick 85751Smckusick /* 95751Smckusick * get next entry in a directory. 105751Smckusick */ 115751Smckusick struct direct * 125751Smckusick readdir(dirp) 135751Smckusick register DIR *dirp; 145751Smckusick { 15*5766Smckusic register struct olddirect *dp; 16*5766Smckusic static union { 17*5766Smckusic struct direct un_dir; 18*5766Smckusic char pad[MAXDIRSIZ]; 19*5766Smckusic } dirun; 20*5766Smckusic #define dir dirun.un_dir 215751Smckusick 225751Smckusick for (;;) { 235751Smckusick if (dirp->dd_loc == 0) { 245756Smckusic dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 255756Smckusic MAXDIRSIZ); 265751Smckusick if (dirp->dd_size <= 0) 275751Smckusick return NULL; 285751Smckusick } 295751Smckusick if (dirp->dd_loc >= dirp->dd_size) { 305751Smckusick dirp->dd_loc = 0; 315751Smckusick continue; 325751Smckusick } 33*5766Smckusic dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); 34*5766Smckusic dirp->dd_loc += sizeof(struct olddirect); 35*5766Smckusic if (dp->d_ino == 0) 36*5766Smckusic continue; 37*5766Smckusic dir.d_ino = dp->d_ino; 38*5766Smckusic strncpy(dir.d_name, dp->d_name, DIRSIZ); 39*5766Smckusic dir.d_namlen = strlen(dir.d_name); 40*5766Smckusic dir.d_reclen = ((sizeof(struct direct) + dir.d_namlen) 41*5766Smckusic + 4) & ~03; 42*5766Smckusic return (&dir); 435751Smckusick } 445751Smckusick } 45