Home | History | Annotate | Download | only in head
      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