1 /* Copyright (c) 1982 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)readdir.c 1.4 02/12/82"; 4 5 #include <sys/types.h> 6 #include <ndir.h> 7 8 /* 9 * read an old stlye directory entry and present it as a new one 10 */ 11 #ifndef DIRSIZ 12 #define DIRSIZ 14 13 #endif 14 15 struct olddirect { 16 ino_t d_ino; 17 char d_name[DIRSIZ]; 18 }; 19 20 /* 21 * get next entry in a directory. 22 */ 23 struct direct * 24 readdir(dirp) 25 register DIR *dirp; 26 { 27 register struct olddirect *dp; 28 static union { 29 struct direct un_dir; 30 char pad[MAXDIRSIZ]; 31 } dirun; 32 #define dir dirun.un_dir 33 34 for (;;) { 35 if (dirp->dd_loc == 0) { 36 dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, 37 MAXDIRSIZ); 38 if (dirp->dd_size <= 0) 39 return NULL; 40 } 41 if (dirp->dd_loc >= dirp->dd_size) { 42 dirp->dd_loc = 0; 43 continue; 44 } 45 dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); 46 dirp->dd_loc += sizeof(struct olddirect); 47 if (dp->d_ino == 0) 48 continue; 49 dir.d_ino = dp->d_ino; 50 strncpy(dir.d_name, dp->d_name, DIRSIZ); 51 dir.d_namlen = strlen(dir.d_name); 52 dir.d_reclen = ((sizeof(struct direct) + dir.d_namlen) 53 + 4) & ~03; 54 return (&dir); 55 } 56 } 57