use isinf(3) and isnan(3) instead of rolling our own
[unix-history] / usr / src / lib / libc / gen / readdir.c
CommitLineData
bb0cfa24
DF
1/*
2 * Copyright (c) 1983 Regents of the University of California.
d99e6414
KB
3 * All rights reserved.
4 *
269a7923 5 * %sccs.include.redist.c%
bb0cfa24
DF
6 */
7
2ce81398 8#if defined(LIBC_SCCS) && !defined(lint)
269a7923 9static char sccsid[] = "@(#)readdir.c 5.7 (Berkeley) %G%";
d99e6414 10#endif /* LIBC_SCCS and not lint */
f20e5624 11
c4a04593 12#include <sys/param.h>
8c6e64bc 13#include <dirent.h>
6a2babc1 14
f20e5624
KM
15/*
16 * get next entry in a directory.
17 */
8c6e64bc 18struct dirent *
f20e5624
KM
19readdir(dirp)
20 register DIR *dirp;
21{
8c6e64bc 22 register struct dirent *dp;
f20e5624
KM
23
24 for (;;) {
25 if (dirp->dd_loc == 0) {
d46abbe3
KM
26 dirp->dd_size = getdirentries(dirp->dd_fd,
27 dirp->dd_buf, dirp->dd_len, &dirp->dd_seek);
f20e5624
KM
28 if (dirp->dd_size <= 0)
29 return NULL;
30 }
31 if (dirp->dd_loc >= dirp->dd_size) {
32 dirp->dd_loc = 0;
33 continue;
34 }
8c6e64bc 35 dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc);
13cfd6f7
KB
36 if ((int)dp & 03) /* bogus pointer check */
37 return NULL;
c9f0b4d5 38 if (dp->d_reclen <= 0 ||
d46abbe3 39 dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc)
c9f0b4d5
KM
40 return NULL;
41 dirp->dd_loc += dp->d_reclen;
d3d77310
KM
42 if (dp->d_ino == 0)
43 continue;
c9f0b4d5 44 return (dp);
f20e5624
KM
45 }
46}