2 Copyright © 1995-2013, The AROS Development Team. All rights reserved.
5 POSIX.1-2008 function readdir().
8 #include "__posixc_intbase.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 PosixCIntBase
*PosixCBase
=
68 (struct PosixCIntBase
*)__aros_getbase_PosixCBase();
69 int const max
= MAXFILENAMELENGTH
> NAME_MAX
? NAME_MAX
: MAXFILENAMELENGTH
;
76 D(bug("null)=EFAULT\n"));
81 desc
= __getfdesc(dir
->fd
);
84 D(bug("fd=%d)=EBADF\n", (int)dir
->fd
));
89 if (PosixCBase
->doupath
&& dir
->pos
== 0)
91 dir
->ent
.d_type
= DT_DIR
;
92 dir
->ent
.d_name
[0]='.';
93 dir
->ent
.d_name
[1]='\0';
94 dir
->ent
.d_reclen
= 1;
97 if (PosixCBase
->doupath
&& dir
->pos
== 1)
99 dir
->ent
.d_type
= DT_DIR
;
100 dir
->ent
.d_name
[0]='.';
101 dir
->ent
.d_name
[1]='.';
102 dir
->ent
.d_name
[2]='\0';
103 dir
->ent
.d_reclen
= 2;
107 struct FileInfoBlock
*fib
= (struct FileInfoBlock
*)dir
->priv
;
109 if (!ExNext(desc
->fcb
->handle
, fib
))
112 if (IoErr() != ERROR_NO_MORE_ENTRIES
)
114 errno
= __stdc_ioerr2errno(IoErr());
115 D(bug(") errno=%d\n", (int)errno
));
118 bug("NO_MORE_ENTRIES)\n"));
122 CONST_STRPTR name
= fib
->fib_FileName
;
126 if (PosixCBase
->doupath
&& name
[0] == '.')
138 strncpy(dir
->ent
.d_name
, name
, max
);
139 dir
->ent
.d_reclen
= strlen(name
);
141 switch (fib
->fib_DirEntryType
)
144 dir
->ent
.d_type
= DT_REG
;
148 dir
->ent
.d_type
= DT_DIR
;
153 dir
->ent
.d_type
= DT_LNK
;
156 dir
->ent
.d_type
= DT_FIFO
;
159 dir
->ent
.d_type
= DT_UNKNOWN
;
167 D(bug("%s) d_type=%d\n", dir
->ent
.d_name
, (int)dir
->ent
.d_type
));