1570af302Sopenharmony_ci#include <dirent.h>
2570af302Sopenharmony_ci#include <errno.h>
3570af302Sopenharmony_ci#include <stddef.h>
4570af302Sopenharmony_ci#include "__dirent.h"
5570af302Sopenharmony_ci#include "syscall.h"
6570af302Sopenharmony_ci#ifndef __LITEOS__
7570af302Sopenharmony_ci#include "param_check.h"
8570af302Sopenharmony_ci#endif
9570af302Sopenharmony_ci
10570af302Sopenharmony_citypedef char dirstream_buf_alignment_check[1-2*(int)(
11570af302Sopenharmony_ci	offsetof(struct __dirstream, buf) % sizeof(off_t))];
12570af302Sopenharmony_ci
13570af302Sopenharmony_cistruct dirent *readdir(DIR *dir)
14570af302Sopenharmony_ci{
15570af302Sopenharmony_ci#ifndef __LITEOS__
16570af302Sopenharmony_ci	PARAM_CHECK(dir);
17570af302Sopenharmony_ci#endif
18570af302Sopenharmony_ci	struct dirent *de;
19570af302Sopenharmony_ci
20570af302Sopenharmony_ci	if (dir->buf_pos >= dir->buf_end) {
21570af302Sopenharmony_ci		int len = __syscall(SYS_getdents, dir->fd, dir->buf, sizeof dir->buf);
22570af302Sopenharmony_ci		if (len <= 0) {
23570af302Sopenharmony_ci			if (len < 0 && len != -ENOENT) errno = -len;
24570af302Sopenharmony_ci			return 0;
25570af302Sopenharmony_ci		}
26570af302Sopenharmony_ci		dir->buf_end = len;
27570af302Sopenharmony_ci		dir->buf_pos = 0;
28570af302Sopenharmony_ci	}
29570af302Sopenharmony_ci	de = (void *)(dir->buf + dir->buf_pos);
30570af302Sopenharmony_ci	dir->buf_pos += de->d_reclen;
31570af302Sopenharmony_ci	dir->tell = de->d_off;
32570af302Sopenharmony_ci	return de;
33570af302Sopenharmony_ci}
34570af302Sopenharmony_ci
35570af302Sopenharmony_ciweak_alias(readdir, readdir64);
36