OSDN Git Service

revert changes
[uclinux-h8/uclibc-ng.git] / libc / misc / dirent / readdir.c
index b5a23bb..7517106 100644 (file)
 #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