Signed-off-by: Yoshinori Sato ysato@users.sourceforge.jp --- libc/misc/dirent/__readdir.c | 39 ++++++++++++++++++++++++++++++++++++++ libc/misc/dirent/readdir.c | 45 ++++---------------------------------------- libc/misc/dirent/readdir64.c | 12 ++++++++++-- 3 files changed, 53 insertions(+), 43 deletions(-) create mode 100644 libc/misc/dirent/__readdir.c
diff --git a/libc/misc/dirent/__readdir.c b/libc/misc/dirent/__readdir.c new file mode 100644 index 0000000..18f6d79 --- /dev/null +++ b/libc/misc/dirent/__readdir.c @@ -0,0 +1,39 @@ +__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; + + /* Skip deleted files. */ + } while (de->d_ino == 0); + +all_done: + __UCLIBC_MUTEX_UNLOCK(dir->dd_lock); + return de; +} diff --git a/libc/misc/dirent/readdir.c b/libc/misc/dirent/readdir.c index 7517106..b5a23bb 100644 --- a/libc/misc/dirent/readdir.c +++ b/libc/misc/dirent/readdir.c @@ -10,53 +10,16 @@ #include <stddef.h> #include "dirstream.h"
-#ifndef __READDIR +#if !defined __ARCH_HAS_DEPRECATED_SYSCALLS__ # 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;
- /* Skip deleted files. */ - } while (de->d_ino == 0); +# include "__readdir.c"
-all_done: - __UCLIBC_MUTEX_UNLOCK(dir->dd_lock); - return de; -} libc_hidden_def(__READDIR) -#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 +# if WORDSIZE == 64 strong_alias_untyped(readdir,readdir64) libc_hidden_def(readdir64) +# endif #endif diff --git a/libc/misc/dirent/readdir64.c b/libc/misc/dirent/readdir64.c index 17577a7..e16d6a1 100644 --- a/libc/misc/dirent/readdir64.c +++ b/libc/misc/dirent/readdir64.c @@ -6,11 +6,19 @@
#include <_lfs_64.h> #include <dirent.h> +#include <errno.h> +#define __need_NULL +#include <stddef.h> +#include "dirstream.h"
#if __WORDSIZE != 64 # define __READDIR readdir64 # define __DIRENT_TYPE struct dirent64 # define __GETDENTS __getdents64 - -# include "readdir.c" #endif + +# include "__readdir.c" + +libc_hidden_def(__READDIR) +strong_alias_untyped(readdir64,readdir) +libc_hidden_def(readdir)