readdir.c 617 B

123456789101112131415161718192021222324252627
  1. #include <dirent.h>
  2. #include <errno.h>
  3. #include <stddef.h>
  4. #include "__dirent.h"
  5. #include "syscall.h"
  6. typedef char dirstream_buf_alignment_check[1-2*(int)(
  7. offsetof(struct __dirstream, buf) % sizeof(off_t))];
  8. struct dirent *readdir(DIR *dir)
  9. {
  10. struct dirent *de;
  11. if (dir->buf_pos >= dir->buf_end) {
  12. int len = __syscall(SYS_getdents, dir->fd, dir->buf, sizeof dir->buf);
  13. if (len <= 0) {
  14. if (len < 0 && len != -ENOENT) errno = -len;
  15. return 0;
  16. }
  17. dir->buf_end = len;
  18. dir->buf_pos = 0;
  19. }
  20. de = (void *)(dir->buf + dir->buf_pos);
  21. dir->buf_pos += de->d_reclen;
  22. dir->tell = de->d_off;
  23. return de;
  24. }