2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
5 POSIX function readdir().
8 #include "__arosc_privdata.h"
11 #include <proto/dos.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 int const max
= MAXFILENAMELENGTH
> NAME_MAX
? NAME_MAX
: MAXFILENAMELENGTH
;
74 D(bug("null)=EFAULT\n"));
79 desc
= __getfdesc(dir
->fd
);
82 D(bug("fd=%d)=EBADF\n", (int)dir
->fd
));
87 if (__doupath
&& dir
->pos
== 0)
89 dir
->ent
.d_type
= DT_DIR
;
90 dir
->ent
.d_name
[0]='.';
91 dir
->ent
.d_name
[1]='\0';
92 dir
->ent
.d_reclen
= 1;
95 if (__doupath
&& dir
->pos
== 1)
97 dir
->ent
.d_type
= DT_DIR
;
98 dir
->ent
.d_name
[0]='.';
99 dir
->ent
.d_name
[1]='.';
100 dir
->ent
.d_name
[2]='\0';
101 dir
->ent
.d_reclen
= 2;
105 struct FileInfoBlock
*fib
= (struct FileInfoBlock
*)dir
->priv
;
107 if (!ExNext(desc
->fcb
->fh
, fib
))
110 if (IoErr() != ERROR_NO_MORE_ENTRIES
)
112 errno
= IoErr2errno(IoErr());
113 D(bug(") errno=%d\n", (int)errno
));
116 bug("NO_MORE_ENTRIES)\n"));
120 CONST_STRPTR name
= fib
->fib_FileName
;
124 if (__doupath
&& name
[0] == '.')
136 strncpy(dir
->ent
.d_name
, name
, max
);
137 dir
->ent
.d_reclen
= strlen(name
);
139 switch (fib
->fib_DirEntryType
)
142 dir
->ent
.d_type
= DT_REG
;
146 dir
->ent
.d_type
= DT_DIR
;
151 dir
->ent
.d_type
= DT_LNK
;
154 dir
->ent
.d_type
= DT_FIFO
;
157 dir
->ent
.d_type
= DT_UNKNOWN
;
165 D(bug("%s) d_type=%d\n", dir
->ent
.d_name
, (int)dir
->ent
.d_type
));