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