chiark / gitweb /
[PATCH] klibc: version 0.211
[elogind.git] / klibc / klibc / readdir.c
1 /*
2  * readdir.c: opendir/readdir/closedir
3  */
4
5 #include <unistd.h>
6 #include <fcntl.h>
7 #include <stdlib.h>
8
9 #define __KLIBC_DIRENT_INTERNALS
10 #include <dirent.h>
11
12 DIR *opendir(const char *name)
13 {
14   DIR *dp = malloc(sizeof(DIR));
15
16   if ( !dp )
17     return NULL;
18
19   dp->__fd = open(name, O_DIRECTORY|O_RDONLY);
20
21   if ( dp->__fd < 0 ) {
22     free(dp);
23     return NULL;
24   }
25
26   dp->bytes_left = 0;
27
28   return dp;
29 }
30
31 struct dirent *readdir(DIR *dir)
32 {
33   struct dirent *dent;
34   int rv;
35   
36   if ( !dir->bytes_left ) {
37     rv = getdents(dir->__fd, dir->buffer, sizeof(dir->buffer));
38     if ( rv <= 0 )
39       return NULL;
40     dir->bytes_left = rv;
41     dir->next = dir->buffer;
42   }
43
44   dent = dir->next;
45   dir->next = (struct dirent *)((char *)dir->next + dent->d_reclen);
46   dir->bytes_left -= dent->d_reclen;
47   
48   return dent;
49 }
50
51 int closedir(DIR *dir)
52 {
53   int rv;
54   rv = close(dir->__fd);
55   free(dir);
56   return rv;
57 }