xref: /illumos-gate/usr/src/head/dirent.h (revision 289b68b2)
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 /*	Copyright (c) 1988 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 #ifndef _DIRENT_H
31 #define	_DIRENT_H
32 
33 #pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.6.1.5   */
34 
35 #include <sys/feature_tests.h>
36 
37 #include <sys/types.h>
38 #include <sys/dirent.h>
39 
40 #ifdef	__cplusplus
41 extern "C" {
42 #endif
43 
44 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
45 
46 #define	MAXNAMLEN	512		/* maximum filename length */
47 #define	DIRBUF		8192		/* buffer size for fs-indep. dirs */
48 
49 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
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 #if defined(__STDC__)
73 
74 /* large file compilation environment setup */
75 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
76 #ifdef __PRAGMA_REDEFINE_EXTNAME
77 #pragma redefine_extname	readdir	readdir64
78 #pragma	redefine_extname	scandir	scandir64
79 #pragma	redefine_extname	alphasort alphasort64
80 #else
81 #define	readdir			readdir64
82 #define	scandir			scandir64
83 #define	alphasort		alphasort64
84 #endif
85 #endif	/* _FILE_OFFSET_BITS == 64 */
86 
87 /* In the LP64 compilation environment, all APIs are already large file */
88 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
89 #ifdef __PRAGMA_REDEFINE_EXTNAME
90 #pragma redefine_extname	readdir64	readdir
91 #pragma	redefine_extname	scandir64	scandir
92 #pragma	redefine_extname	alphasort64	alphasort
93 #else
94 #define	readdir64		readdir
95 #define	scandir64		scandir
96 #define	alphsort64		alphasort
97 #endif
98 #endif	/* _LP64 && _LARGEFILE64_SOURCE */
99 
100 extern DIR		*opendir(const char *);
101 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
102 	defined(_ATFILE_SOURCE)
103 extern DIR		*fdopendir(int);
104 extern int		dirfd(DIR *);
105 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) ... */
106 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
107 extern int		scandir(const char *, struct dirent *(*[]),
108 				int (*)(const struct dirent *),
109 				int (*)(const struct dirent **,
110 					const struct dirent **));
111 extern int		alphasort(const struct dirent **,
112 					const struct dirent **);
113 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
114 extern struct dirent	*readdir(DIR *);
115 #if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
116 	defined(_XOPEN_SOURCE)
117 extern long		telldir(DIR *);
118 extern void		seekdir(DIR *, long);
119 #endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) ... */
120 extern void		rewinddir(DIR *);
121 extern int		closedir(DIR *);
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(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
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 /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
134 #endif
135 
136 #else
137 
138 extern DIR		*opendir();
139 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
140 	defined(_ATFILE_SOURCE)
141 extern DIR		*fdopendir();
142 extern int		dirfd();
143 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) ... */
144 extern struct dirent	*readdir();
145 #if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
146 	defined(_XOPEN_SOURCE)
147 extern long		telldir();
148 extern void		seekdir();
149 #endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) ... */
150 extern void		rewinddir();
151 extern int		closedir();
152 
153 /* transitional large file interface */
154 #if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
155 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
156 extern struct dirent64	*readdir64();
157 #endif
158 
159 #endif
160 
161 #if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
162 	defined(_XOPEN_SOURCE)
163 #define	rewinddir(dirp)	seekdir(dirp, 0L)
164 #endif
165 
166 /*
167  * readdir_r() prototype is defined here.
168  *
169  * There are several variations, depending on whether compatibility with old
170  * POSIX draft specifications or the final specification is desired and on
171  * whether the large file compilation environment is active.  To combat a
172  * combinatorial explosion, enabling large files implies using the final
173  * specification (since the definition of the large file environment
174  * considerably postdates that of the final readdir_r specification).
175  *
176  * In the LP64 compilation environment, all APIs are already large file,
177  * and since there are no 64-bit applications that can have seen the
178  * draft implementation, again, we use the final POSIX specification.
179  */
180 
181 #if	defined(__EXTENSIONS__) || defined(_REENTRANT) || \
182 	!defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE - 0 >= 199506L) || \
183 	defined(_POSIX_PTHREAD_SEMANTICS)
184 
185 #if	defined(__STDC__)
186 
187 #if	!defined(_LP64) && _FILE_OFFSET_BITS == 32
188 
189 #if	(_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
190 
191 #ifdef	__PRAGMA_REDEFINE_EXTNAME
192 #pragma	redefine_extname readdir_r	__posix_readdir_r
193 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
194 		struct dirent **_RESTRICT_KYWD);
195 #else	/* __PRAGMA_REDEFINE_EXTNAME */
196 
197 extern int __posix_readdir_r(DIR *_RESTRICT_KYWD,
198     struct dirent *_RESTRICT_KYWD, struct dirent **_RESTRICT_KYWD);
199 
200 #ifdef	__lint
201 #define	readdir_r	__posix_readdir_r
202 #else	/* !__lint */
203 
204 static int
205 readdir_r(DIR *_RESTRICT_KYWD __dp, struct dirent *_RESTRICT_KYWD __ent,
206 		struct dirent **_RESTRICT_KYWD __res) {
207 	return (__posix_readdir_r(__dp, __ent, __res));
208 }
209 
210 #endif /* !__lint */
211 #endif /* __PRAGMA_REDEFINE_EXTNAME */
212 
213 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
214 
215 extern struct dirent *readdir_r(DIR *__dp, struct dirent *__ent);
216 
217 #endif  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
218 
219 #else	/* !_LP64 && _FILE_OFFSET_BITS == 32 */
220 
221 #if defined(_LP64)
222 #ifdef	__PRAGMA_REDEFINE_EXTNAME
223 #pragma	redefine_extname readdir64_r	readdir_r
224 #else
225 #define	readdir64_r		readdir_r
226 #endif
227 #else	/* _LP64 */
228 #ifdef	__PRAGMA_REDEFINE_EXTNAME
229 #pragma	redefine_extname readdir_r	readdir64_r
230 #else
231 #define	readdir_r		readdir64_r
232 #endif
233 #endif	/* _LP64 */
234 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
235 	struct dirent **_RESTRICT_KYWD);
236 
237 #endif	/* !_LP64 && _FILE_OFFSET_BITS == 32 */
238 
239 #if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
240 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
241 /* transitional large file interface */
242 extern int readdir64_r(DIR *_RESTRICT_KYWD, struct dirent64 *_RESTRICT_KYWD,
243 	struct dirent64 **_RESTRICT_KYWD);
244 #endif
245 
246 #else  /* __STDC__ */
247 
248 #if	!defined(_LP64) && _FILE_OFFSET_BITS == 32
249 
250 #if	(_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
251 
252 #ifdef __PRAGMA_REDEFINE_EXTNAME
253 #pragma redefine_extname readdir_r __posix_readdir_r
254 extern int readdir_r();
255 #else  /* __PRAGMA_REDEFINE_EXTNAME */
256 
257 extern int __posix_readdir_r();
258 
259 #ifdef	__lint
260 #define	readdir_r __posix_readdir_r
261 #else	/* !__lint */
262 
263 static int
264 readdir_r(DIR *_RESTRICT_KYWD __dp, struct dirent *_RESTRICT_KYWD __ent,
265 	struct dirent **_RESTRICT_KYWD __res)
266 {
267 	return (__posix_readdir_r(__dp, __ent, __res));
268 }
269 
270 #endif /* !__lint */
271 #endif /* __PRAGMA_REDEFINE_EXTNAME */
272 
273 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
274 
275 extern struct dirent *readdir_r();
276 
277 #endif /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
278 
279 #else	/* !_LP64 && _FILE_OFFSET_BITS == 32 */
280 
281 #if defined(_LP64)
282 #ifdef	__PRAGMA_REDEFINE_EXTNAME
283 #pragma	redefine_extname readdir64_r	readdir_r
284 #else
285 #define	readdir64_r	readdir
286 #endif
287 #else	/* _LP64 */
288 #ifdef	__PRAGMA_REDEFINE_EXTNAME
289 #pragma	redefine_extname readdir_r readdir64_r
290 #else
291 #define	readdir_r readdir64_r
292 #endif
293 #endif	/* _LP64 */
294 extern int	readdir_r();
295 
296 #endif	/* !_LP64 && _FILE_OFFSET_BITS == 32 */
297 
298 #if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
299 	    !defined(__PRAGMA_REDEFINE_EXTNAME))
300 /* transitional large file interface */
301 extern int 	readdir64_r();
302 #endif
303 
304 #endif /* __STDC__ */
305 
306 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT)... */
307 
308 #ifdef	__cplusplus
309 }
310 #endif
311 
312 #endif	/* _DIRENT_H */
313