summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/readdir.c
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
commit167217bec15c9c7aa70ba2a3dc9c689b3cd91872 (patch)
tree7c0c62debf8f9f145643102fb52b81afce743594 /mdk-stage1/dietlibc/lib/readdir.c
parent9097327dc1c667fc51b8e05cc7c0626fac96665d (diff)
downloaddrakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar
drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.gz
drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.bz2
drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.xz
drakx-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.zip
import new version of dietlibc
Diffstat (limited to 'mdk-stage1/dietlibc/lib/readdir.c')
-rw-r--r--mdk-stage1/dietlibc/lib/readdir.c86
1 files changed, 8 insertions, 78 deletions
diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c
index 5accd32a1..689f5d08b 100644
--- a/mdk-stage1/dietlibc/lib/readdir.c
+++ b/mdk-stage1/dietlibc/lib/readdir.c
@@ -1,83 +1,13 @@
-#if 0
-
-Sorry, currently broken
-
-#include <dirent.h>
-#include <errno.h>
+#include "dietdirent.h"
#include <unistd.h>
+#include <dirent.h>
#include <stdlib.h>
-#include <string.h>
-
-#include "dirstream.h"
-
-#ifdef __ELF__
-#pragma weak readdir = __libc_readdir
-#endif
-
-struct dirent *
-__libc_readdir(DIR * dir)
-{
- int result;
- struct dirent *de;
-
- if (!dir) {
- errno = EBADF;
- return NULL;
- }
-
- /* Are we running an old kernel? */
- if (dir->dd_getdents == no_getdents)
- {
- abort();
- }
-
- if (dir->dd_size <= dir->dd_nextloc)
- {
- /* read dir->dd_max bytes of directory entries. */
- result=getdents(dir->dd_fd,dir->dd_buf,dir->dd_max);
-
- /* We assume we have getdents (). */
- dir->dd_getdents = have_getdents;
- if (result <= 0)
- {
- result = -result;
- if (result > 0)
- {
- /* Are we right? */
- if (result == ENOSYS)
- {
- dir->dd_getdents = no_getdents;
- abort();
- }
- errno = result;
- }
- return NULL;
- }
-
- dir->dd_size = result;
- dir->dd_nextloc = 0;
+struct dirent* readdir(DIR *d) {
+ if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) {
+ int res=getdents(d->fd,(struct dirent*)d->buf,1023);
+ if (res<=0) return 0;
+ d->num=res; d->cur=0;
}
-
- de = (struct dirent *) (((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;
-
- /* convert */
- dir->convbuf.d_ino=de->d_ino;
- dir->convbuf.d_off=de->d_off;
- dir->convbuf.d_reclen=de->d_reclen;
- dir->convbuf.d_type=0;
- if (strlen((char*)&de->d_type)>10)
- de->d_name[10]=0;
- strcpy(dir->convbuf.d_name,(char*)&de->d_type);
- errno=0;
-
- return &dir->convbuf;
+ return (struct dirent*)(d->buf+d->cur);
}
-
-#endif