Commit | Line | Data |
---|---|---|
f20e5624 KM |
1 | /* Copyright (c) 1982 Regents of the University of California */ |
2 | ||
6a2babc1 | 3 | static char sccsid[] = "@(#)readdir.c 1.4 %G%"; |
f20e5624 KM |
4 | |
5 | #include <sys/types.h> | |
6 | #include <ndir.h> | |
7 | ||
6a2babc1 KM |
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 | ||
f20e5624 KM |
20 | /* |
21 | * get next entry in a directory. | |
22 | */ | |
23 | struct direct * | |
24 | readdir(dirp) | |
25 | register DIR *dirp; | |
26 | { | |
d3d77310 KM |
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 | |
f20e5624 KM |
33 | |
34 | for (;;) { | |
35 | if (dirp->dd_loc == 0) { | |
7d09c938 KM |
36 | dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, |
37 | MAXDIRSIZ); | |
f20e5624 KM |
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 | } | |
d3d77310 KM |
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); | |
f20e5624 KM |
55 | } |
56 | } |