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