Files
Arquivotheca.SunOS-4.1.4/lib/libc/gen/common/readdir.c
seta75D ff309bfe1c Init
2021-10-11 18:37:13 -03:00

44 lines
1.1 KiB
C

#if !defined(lint) && defined(SCCSIDS)
static char sccsid[] = "@(#)readdir.c 1.1 94/10/31 SMI";
#endif
#include <sys/param.h>
#include <dirent.h>
/*
* get next entry in a directory.
*/
struct dirent *
readdir(dirp)
register DIR *dirp;
{
register struct dirent *dp;
int saveloc = 0;
next:
if (dirp->dd_size != 0) {
dp = (struct dirent *)&dirp->dd_buf[dirp->dd_loc];
saveloc = dirp->dd_loc; /* save for possible EOF */
dirp->dd_loc += dp->d_reclen;
}
if (dirp->dd_loc >= dirp->dd_size)
dirp->dd_loc = dirp->dd_size = 0;
if (dirp->dd_size == 0 /* refill buffer */
&& (dirp->dd_size = getdents(dirp->dd_fd, dirp->dd_buf, dirp->dd_bsize)
) <= 0
) {
if (dirp->dd_size == 0) /* This means EOF */
dirp->dd_loc = saveloc; /* EOF so save for telldir */
return (NULL); /* error or EOF */
}
dp = (struct dirent *)&dirp->dd_buf[dirp->dd_loc];
if (dp->d_reclen <= 0)
return (NULL);
if (dp->d_fileno == 0)
goto next;
dirp->dd_off = dp->d_off;
return(dp);
}