1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22 /*
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /*
28 * Copyright 2014 Garrett D'Amore <garrett@damore.org>
29 */
30
31 /* Copyright (c) 1988 AT&T */
32 /* All Rights Reserved */
33
34 #ifndef _DIRENT_H
35 #define _DIRENT_H
36
37 #include <sys/feature_tests.h>
38
39 #include <sys/types.h>
40 #include <sys/dirent.h>
41
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45
46 #if !defined(_STRICT_SYMBOLS)
47 #define MAXNAMLEN 512 /* maximum filename length */
48 #define DIRBUF 8192 /* buffer size for fs-indep. dirs */
49 #endif
50
51 #if !defined(__XOPEN_OR_POSIX)
52
53 typedef struct {
54 int dd_fd; /* file descriptor */
55 int dd_loc; /* offset in block */
56 int dd_size; /* amount of valid data */
57 char *dd_buf; /* directory block */
58 } DIR; /* stream data from opendir() */
59
60
61 #else
62
63 typedef struct {
64 int d_fd; /* file descriptor */
65 int d_loc; /* offset in block */
66 int d_size; /* amount of valid data */
67 char *d_buf; /* directory block */
68 } DIR; /* stream data from opendir() */
69
70 #endif /* !defined(__XOPEN_OR_POSIX) */
71
72 /* large file compilation environment setup */
73 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
74 #ifdef __PRAGMA_REDEFINE_EXTNAME
75 #pragma redefine_extname readdir readdir64
76 #pragma redefine_extname scandir scandir64
77 #pragma redefine_extname alphasort alphasort64
78 #else
79 #define readdir readdir64
80 #define scandir scandir64
81 #define alphasort alphasort64
82 #endif
83 #endif /* _FILE_OFFSET_BITS == 64 */
84
85 /* In the LP64 compilation environment, all APIs are already large file */
86 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
87 #ifdef __PRAGMA_REDEFINE_EXTNAME
88 #pragma redefine_extname readdir64 readdir
89 #pragma redefine_extname scandir64 scandir
90 #pragma redefine_extname alphasort64 alphasort
91 #else
92 #define readdir64 readdir
93 #define scandir64 scandir
94 #define alphsort64 alphasort
95 #endif
96 #endif /* _LP64 && _LARGEFILE64_SOURCE */
97
98 extern DIR *opendir(const char *);
99 #if defined(_XPG7) || defined(_ATFILE_SOURCE) || !defined(_STRICT_SYMBOLS)
100 extern DIR *fdopendir(int);
101 extern int dirfd(DIR *);
102 #endif
103
104 #if defined(_XPG7) || !defined(_STRICT_SYMBOLS)
105 extern int scandir(const char *, struct dirent ***,
106 int (*)(const struct dirent *),
107 int (*)(const struct dirent **,
108 const struct dirent **));
109 extern int alphasort(const struct dirent **,
110 const struct dirent **);
111 #endif
112
113 extern struct dirent *readdir(DIR *);
114 extern void rewinddir(DIR *);
115 extern int closedir(DIR *);
116
117 #if defined(_XOPEN_SOURCE) || !defined(_STRICT_SYMBOLS)
118 extern long telldir(DIR *);
119 extern void seekdir(DIR *, long);
120 #define rewinddir(dirp) seekdir(dirp, 0L)
121 #endif
122
123 /* transitional large file interface */
124 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
125 !defined(__PRAGMA_REDEFINE_EXTNAME))
126 extern struct dirent64 *readdir64(DIR *);
127 #if !defined(_STRICT_SYMBOLS)
128 extern int scandir64(const char *, struct dirent64 ***,
129 int (*)(const struct dirent64 *),
130 int (*)(const struct dirent64 **,
131 const struct dirent64 **));
132 extern int alphasort64(const struct dirent64 **, const struct dirent64 **);
133 #endif /* !_STRICT_SYMBOLS */
134 #endif
135
136 /*
137 * readdir_r() prototype is defined here.
138 *
139 * There are several variations, depending on whether compatibility with old
140 * POSIX draft specifications or the final specification is desired and on
141 * whether the large file compilation environment is active. To combat a
142 * combinatorial explosion, enabling large files implies using the final
143 * specification (since the definition of the large file environment
144 * considerably postdates that of the final readdir_r specification).
145 *
146 * In the LP64 compilation environment, all APIs are already large file,
147 * and since there are no 64-bit applications that can have seen the
148 * draft implementation, again, we use the final POSIX specification.
149 */
150
151 #if defined(__EXTENSIONS__) || defined(_REENTRANT) || \
152 !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE - 0 >= 199506L) || \
153 defined(_POSIX_PTHREAD_SEMANTICS)
154
155 #if !defined(_LP64) && _FILE_OFFSET_BITS == 32
156
157 #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
158
159 #ifdef __PRAGMA_REDEFINE_EXTNAME
160 #pragma redefine_extname readdir_r __posix_readdir_r
161 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
162 struct dirent **_RESTRICT_KYWD);
163 #else /* __PRAGMA_REDEFINE_EXTNAME */
164
165 extern int __posix_readdir_r(DIR *_RESTRICT_KYWD,
166 struct dirent *_RESTRICT_KYWD, struct dirent **_RESTRICT_KYWD);
167
168 #ifdef __lint
169 #define readdir_r __posix_readdir_r
170 #else /* !__lint */
171
172 static int
173 readdir_r(DIR *_RESTRICT_KYWD __dp, struct dirent *_RESTRICT_KYWD __ent,
174 struct dirent **_RESTRICT_KYWD __res) {
175 return (__posix_readdir_r(__dp, __ent, __res));
176 }
177
178 #endif /* !__lint */
179 #endif /* __PRAGMA_REDEFINE_EXTNAME */
180
181 #else /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
182
183 extern struct dirent *readdir_r(DIR *__dp, struct dirent *__ent);
184
185 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
186
187 #else /* !_LP64 && _FILE_OFFSET_BITS == 32 */
188
189 #if defined(_LP64)
190 #ifdef __PRAGMA_REDEFINE_EXTNAME
191 #pragma redefine_extname readdir64_r readdir_r
192 #else
193 #define readdir64_r readdir_r
194 #endif
195 #else /* _LP64 */
196 #ifdef __PRAGMA_REDEFINE_EXTNAME
197 #pragma redefine_extname readdir_r readdir64_r
198 #else
199 #define readdir_r readdir64_r
200 #endif
201 #endif /* _LP64 */
202 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
203 struct dirent **_RESTRICT_KYWD);
204
205 #endif /* !_LP64 && _FILE_OFFSET_BITS == 32 */
206
207 #if defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
208 !defined(__PRAGMA_REDEFINE_EXTNAME))
209 /* transitional large file interface */
210 extern int readdir64_r(DIR *_RESTRICT_KYWD, struct dirent64 *_RESTRICT_KYWD,
211 struct dirent64 **_RESTRICT_KYWD);
212 #endif
213
214 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT)... */
215
216 #ifdef __cplusplus
217 }
218 #endif
219
220 #endif /* _DIRENT_H */