#include <stddef.h>
#include "dirstream.h"
-#if !defined __ARCH_HAS_DEPRECATED_SYSCALLS__
+#ifndef __READDIR
# define __READDIR readdir
# define __DIRENT_TYPE struct dirent
# define __GETDENTS __getdents
+#endif
+
+__DIRENT_TYPE *__READDIR(DIR * dir)
+{
+ ssize_t bytes;
+ __DIRENT_TYPE *de;
+
+ if (!dir) {
+ __set_errno(EBADF);
+ return NULL;
+ }
+
+ __UCLIBC_MUTEX_LOCK(dir->dd_lock);
+
+ do {
+ if (dir->dd_size <= dir->dd_nextloc) {
+ /* read dir->dd_max bytes of directory entries. */
+ bytes = __GETDENTS(dir->dd_fd, dir->dd_buf, dir->dd_max);
+ if (bytes <= 0) {
+ de = NULL;
+ goto all_done;
+ }
+ dir->dd_size = bytes;
+ dir->dd_nextloc = 0;
+ }
+
+ de = (__DIRENT_TYPE *) (((char *) dir->dd_buf) + dir->dd_nextloc);
+
+ /* Am I right? H.J. */
+ dir->dd_nextloc += de->d_reclen;
+
+ /* We have to save the next offset here. */
+ dir->dd_nextoff = de->d_off;
-# include "__readdir.c"
+ /* Skip deleted files. */
+ } while (de->d_ino == 0);
+all_done:
+ __UCLIBC_MUTEX_UNLOCK(dir->dd_lock);
+ return de;
+}
libc_hidden_def(__READDIR)
-# if WORDSIZE == 64
+#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64
strong_alias_untyped(readdir,readdir64)
libc_hidden_def(readdir64)
-# endif
#endif
#include <_lfs_64.h>
#include <dirent.h>
-#include <errno.h>
-#define __need_NULL
-#include <stddef.h>
-#include "dirstream.h"
-#define __READDIR readdir64
-#define __DIRENT_TYPE struct dirent64
-#define __GETDENTS __getdents64
+#if __WORDSIZE != 64
+# define __READDIR readdir64
+# define __DIRENT_TYPE struct dirent64
+# define __GETDENTS __getdents64
-# include "__readdir.c"
-
-libc_hidden_def(__READDIR)
-strong_alias_untyped(readdir64,readdir)
-libc_hidden_def(readdir)
+# include "readdir.c"
+#endif