2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
5 POSIX function readdir().
8 #include "__arosc_privdata.h"
11 #include <proto/dos.h>
18 #include "__dirdesc.h"
21 #include <aros/debug.h>
23 /*****************************************************************************
28 struct dirent
*readdir(
37 dir - the directory stream pointing to the directory being read
40 The readdir() function returns a pointer to a dirent
41 structure, or NULL if an error occurs or end-of-file is
44 The data returned by readdir() is overwritten by subse
45 quent calls to readdir() for the same directory stream.
47 According to POSIX, the dirent structure contains a field
48 char d_name[] of unspecified size, with at most NAME_MAX
49 characters preceding the terminating null character. Use
50 of other fields will harm the portability of your pro
60 read(), opendir(), closedir(), rewinddir(), seekdir(),
65 ******************************************************************************/
67 struct aroscbase
*aroscbase
= __GM_GetBase();
68 int const max
= MAXFILENAMELENGTH
> NAME_MAX
? NAME_MAX
: MAXFILENAMELENGTH
;
75 D(bug("null)=EFAULT\n"));
80 desc
= __getfdesc(dir
->fd
);
83 D(bug("fd=%d)=EBADF\n", (int)dir
->fd
));
88 if (aroscbase
->acb_doupath
&& dir
->pos
== 0)
90 dir
->ent
.d_type
= DT_DIR
;
91 dir
->ent
.d_name
[0]='.';
92 dir
->ent
.d_name
[1]='\0';
93 dir
->ent
.d_reclen
= 1;
96 if (aroscbase
->acb_doupath
&& dir
->pos
== 1)
98 dir
->ent
.d_type
= DT_DIR
;
99 dir
->ent
.d_name
[0]='.';
100 dir
->ent
.d_name
[1]='.';
101 dir
->ent
.d_name
[2]='\0';
102 dir
->ent
.d_reclen
= 2;
106 struct FileInfoBlock
*fib
= (struct FileInfoBlock
*)dir
->priv
;
108 if (!ExNext(desc
->fcb
->fh
, fib
))
111 if (IoErr() != ERROR_NO_MORE_ENTRIES
)
113 errno
= __arosc_ioerr2errno(IoErr());
114 D(bug(") errno=%d\n", (int)errno
));
117 bug("NO_MORE_ENTRIES)\n"));
121 CONST_STRPTR name
= fib
->fib_FileName
;
125 if (aroscbase
->acb_doupath
&& name
[0] == '.')
137 strncpy(dir
->ent
.d_name
, name
, max
);
138 dir
->ent
.d_reclen
= strlen(name
);
140 switch (fib
->fib_DirEntryType
)
143 dir
->ent
.d_type
= DT_REG
;
147 dir
->ent
.d_type
= DT_DIR
;
152 dir
->ent
.d_type
= DT_LNK
;
155 dir
->ent
.d_type
= DT_FIFO
;
158 dir
->ent
.d_type
= DT_UNKNOWN
;
166 D(bug("%s) d_type=%d\n", dir
->ent
.d_name
, (int)dir
->ent
.d_type
));