Magellan Linux

Contents of /trunk/mkinitrd-magellan/klibc/usr/klibc/readdir.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (show annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 856 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

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 }