get rid of old style directory entries (known only in readdir.c)
[unix-history] / usr / src / lib / libc / gen / readdir.c
CommitLineData
f20e5624
KM
1/* Copyright (c) 1982 Regents of the University of California */
2
6a2babc1 3static 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
15struct olddirect {
16 ino_t d_ino;
17 char d_name[DIRSIZ];
18};
19
f20e5624
KM
20/*
21 * get next entry in a directory.
22 */
23struct direct *
24readdir(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}