diff options
Diffstat (limited to 'mdk-stage1/dietlibc/lib/opendir.c')
-rw-r--r-- | mdk-stage1/dietlibc/lib/opendir.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c index 5c0c4a305..2530d1ac9 100644 --- a/mdk-stage1/dietlibc/lib/opendir.c +++ b/mdk-stage1/dietlibc/lib/opendir.c @@ -1,18 +1,26 @@ #include "dietdirent.h" +#include <sys/mman.h> #include <unistd.h> #include <dirent.h> #include <stdlib.h> #include <fcntl.h> -DIR *opendir (const char *name) { - DIR *t=(DIR*)malloc(sizeof(DIR)); - if (t) { - if ((t->fd=open(name,O_RDONLY|O_DIRECTORY))>=0) { - t->num=t->cur=0; - } else { - free(t); - t=0; - } +DIR* opendir ( const char* name ) { + int fd = open (name, O_RDONLY | O_DIRECTORY); + DIR* t = NULL; + + if ( fd >= 0 ) { + if (fcntl (fd, F_SETFD, FD_CLOEXEC) < 0) + goto lose; + t = (DIR *) mmap (NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (t == MAP_FAILED) +lose: + close (fd); + else + t->fd = fd; } + + return t; } |