Files
Arquivotheca.Solaris-2.5/lib/libbc/libc/gen/common/readdir.c
seta75D 7c4988eac0 Init
2021-10-11 19:38:01 -03:00

42 lines
1.1 KiB
C
Executable File

#pragma ident "@(#)readdir.c 1.4 92/07/20 SMI"
#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);
}