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
41extern "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
53typedef 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
63typedef 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
100extern DIR		*opendir(const char *);
101#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
102	defined(_ATFILE_SOURCE)
103extern DIR		*fdopendir(int);
104extern int		dirfd(DIR *);
105#endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) ... */
106#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
107extern int		scandir(const char *, struct dirent *(*[]),
108				int (*)(const struct dirent *),
109				int (*)(const struct dirent **,
110					const struct dirent **));
111extern int		alphasort(const struct dirent **,
112					const struct dirent **);
113#endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
114extern struct dirent	*readdir(DIR *);
115#if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
116	defined(_XOPEN_SOURCE)
117extern long		telldir(DIR *);
118extern void		seekdir(DIR *, long);
119#endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) ... */
120extern void		rewinddir(DIR *);
121extern int		closedir(DIR *);
122
123/* transitional large file interface */
124#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
125	    !defined(__PRAGMA_REDEFINE_EXTNAME))
126extern struct dirent64	*readdir64(DIR *);
127#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX)
128extern int	scandir64(const char *, struct dirent64 *(*[]),
129			int (*)(const struct dirent64 *),
130			int (*)(const struct dirent64 **,
131				const struct dirent64 **));
132extern int	alphasort64(const struct dirent64 **, const struct dirent64 **);
133#endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) */
134#endif
135
136#else
137
138extern DIR		*opendir();
139#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
140	defined(_ATFILE_SOURCE)
141extern DIR		*fdopendir();
142extern int		dirfd();
143#endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) ... */
144extern struct dirent	*readdir();
145#if defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) || \
146	defined(_XOPEN_SOURCE)
147extern long		telldir();
148extern void		seekdir();
149#endif /* defined(__EXTENSIONS__) || !defined(_POSIX_C_SOURCE) ... */
150extern void		rewinddir();
151extern int		closedir();
152
153/* transitional large file interface */
154#if	defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
155	    !defined(__PRAGMA_REDEFINE_EXTNAME))
156extern 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
193extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
194		struct dirent **_RESTRICT_KYWD);
195#else	/* __PRAGMA_REDEFINE_EXTNAME */
196
197extern 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
204static int
205readdir_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
215extern 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 */
234extern 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 */
242extern 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
254extern int readdir_r();
255#else  /* __PRAGMA_REDEFINE_EXTNAME */
256
257extern int __posix_readdir_r();
258
259#ifdef	__lint
260#define	readdir_r __posix_readdir_r
261#else	/* !__lint */
262
263static int
264readdir_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
275extern 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 */
294extern 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 */
301extern 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