1#include <dirent.h> 2#include <errno.h> 3#include "__dirent.h" 4#include "syscall.h" 5#include "libc.h" 6 7int __getdents(int, struct dirent *, size_t); 8 9struct dirent *readdir(DIR *dir) 10{ 11 struct dirent *de; 12 13 if (dir->buf_pos >= dir->buf_end) { 14 int len = __syscall(SYS_getdents, dir->fd, dir->buf, sizeof dir->buf); 15 if (len <= 0) { 16 if (len < 0 && len != -ENOENT) errno = -len; 17 return 0; 18 } 19 dir->buf_end = len; 20 dir->buf_pos = 0; 21 } 22 de = (void *)(dir->buf + dir->buf_pos); 23 dir->buf_pos += de->d_reclen; 24 dir->tell = de->d_off; 25 return de; 26} 27 28LFS64(readdir); 29