15751Smckusick /* Copyright (c) 1982 Regents of the University of California */ 25751Smckusick 3*5767Smckusic static char sccsid[] = "@(#)readdir.c 1.4 02/12/82"; 45751Smckusick 55751Smckusick #include <sys/types.h> 65751Smckusick #include <ndir.h> 75751Smckusick 85751Smckusick /* 9*5767Smckusic * read an old stlye directory entry and present it as a new one 10*5767Smckusic */ 11*5767Smckusic #ifndef DIRSIZ 12*5767Smckusic #define DIRSIZ 14 13*5767Smckusic #endif 14*5767Smckusic 15*5767Smckusic struct olddirect { 16*5767Smckusic ino_t d_ino; 17*5767Smckusic char d_name[DIRSIZ]; 18*5767Smckusic }; 19*5767Smckusic 20*5767Smckusic /* 215751Smckusick * get next entry in a directory. 225751Smckusick */ 235751Smckusick struct direct * 245751Smckusick readdir(dirp) 255751Smckusick register DIR *dirp; 265751Smckusick { 275766Smckusic register struct olddirect *dp; 285766Smckusic static union { 295766Smckusic struct direct un_dir; 305766Smckusic char pad[MAXDIRSIZ]; 315766Smckusic } dirun; 325766Smckusic #define dir dirun.un_dir 335751Smckusick 345751Smckusick for (;;) { 355751Smckusick if (dirp->dd_loc == 0) { 365756Smckusic dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 375756Smckusic MAXDIRSIZ); 385751Smckusick if (dirp->dd_size <= 0) 395751Smckusick return NULL; 405751Smckusick } 415751Smckusick if (dirp->dd_loc >= dirp->dd_size) { 425751Smckusick dirp->dd_loc = 0; 435751Smckusick continue; 445751Smckusick } 455766Smckusic dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); 465766Smckusic dirp->dd_loc += sizeof(struct olddirect); 475766Smckusic if (dp->d_ino == 0) 485766Smckusic continue; 495766Smckusic dir.d_ino = dp->d_ino; 505766Smckusic strncpy(dir.d_name, dp->d_name, DIRSIZ); 515766Smckusic dir.d_namlen = strlen(dir.d_name); 525766Smckusic dir.d_reclen = ((sizeof(struct direct) + dir.d_namlen) 535766Smckusic + 4) & ~03; 545766Smckusic return (&dir); 555751Smckusick } 565751Smckusick } 57