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