Mercurial > hg > Applications > mh
comparison miscellany/libndir/readdir.c @ 0:bce86c4163a3
Initial revision
author | kono |
---|---|
date | Mon, 18 Apr 2005 23:46:02 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:bce86c4163a3 |
---|---|
1 static char sccsid[] = "@(#)readdir.c 4.1 (Berkeley) 83/03/21"; | |
2 | |
3 #include <sys/types.h> | |
4 #include <dir.h> | |
5 | |
6 /* | |
7 * read an old stlye directory entry and present it as a new one | |
8 */ | |
9 #define ODIRSIZ 14 | |
10 | |
11 struct olddirect { | |
12 ino_t od_ino; | |
13 char od_name[ODIRSIZ]; | |
14 }; | |
15 | |
16 /* | |
17 * get next entry in a directory. | |
18 */ | |
19 struct direct * | |
20 readdir(dirp) | |
21 register DIR *dirp; | |
22 { | |
23 register struct olddirect *dp; | |
24 static struct direct dir; | |
25 | |
26 for (;;) { | |
27 if (dirp->dd_loc == 0) { | |
28 dirp->dd_size = read(dirp->dd_fd, dirp->dd_buf, | |
29 DIRBLKSIZ); | |
30 if (dirp->dd_size <= 0) | |
31 return NULL; | |
32 } | |
33 if (dirp->dd_loc >= dirp->dd_size) { | |
34 dirp->dd_loc = 0; | |
35 continue; | |
36 } | |
37 dp = (struct olddirect *)(dirp->dd_buf + dirp->dd_loc); | |
38 dirp->dd_loc += sizeof(struct olddirect); | |
39 if (dp->od_ino == 0) | |
40 continue; | |
41 dir.d_ino = dp->od_ino; | |
42 strncpy(dir.d_name, dp->od_name, ODIRSIZ); | |
43 dir.d_name[ODIRSIZ] = '\0'; /* insure null termination */ | |
44 dir.d_namlen = strlen(dir.d_name); | |
45 dir.d_reclen = DIRBLKSIZ; | |
46 return (&dir); | |
47 } | |
48 } |