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 /*
  28  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
  29  */
  30 
  31 /*      Copyright (c) 1988 AT&T     */
  32 /*        All Rights Reserved   */
  33 
  34 #ifndef _DIRENT_H
  35 #define _DIRENT_H
  36 
  37 #include <sys/feature_tests.h>
  38 
  39 #include <sys/types.h>
  40 #include <sys/dirent.h>
  41 
  42 #ifdef  __cplusplus
  43 extern "C" {
  44 #endif
  45 
  46 #if !defined(_STRICT_SYMBOLS)
  47 #define MAXNAMLEN       512             /* maximum filename length */
  48 #define DIRBUF          8192            /* buffer size for fs-indep. dirs */
  49 #endif
  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 /* large file compilation environment setup */
  73 #if !defined(_LP64) && _FILE_OFFSET_BITS == 64
  74 #ifdef __PRAGMA_REDEFINE_EXTNAME
  75 #pragma redefine_extname        readdir readdir64
  76 #pragma redefine_extname        scandir scandir64
  77 #pragma redefine_extname        alphasort alphasort64
  78 #else
  79 #define readdir                 readdir64
  80 #define scandir                 scandir64
  81 #define alphasort               alphasort64
  82 #endif
  83 #endif  /* _FILE_OFFSET_BITS == 64 */
  84 
  85 /* In the LP64 compilation environment, all APIs are already large file */
  86 #if defined(_LP64) && defined(_LARGEFILE64_SOURCE)
  87 #ifdef __PRAGMA_REDEFINE_EXTNAME
  88 #pragma redefine_extname        readdir64       readdir
  89 #pragma redefine_extname        scandir64       scandir
  90 #pragma redefine_extname        alphasort64     alphasort
  91 #else
  92 #define readdir64               readdir
  93 #define scandir64               scandir
  94 #define alphsort64              alphasort
  95 #endif
  96 #endif  /* _LP64 && _LARGEFILE64_SOURCE */
  97 
  98 extern DIR              *opendir(const char *);
  99 #if defined(_XPG7) || defined(_ATFILE_SOURCE) || !defined(_STRICT_SYMBOLS)
 100 extern DIR              *fdopendir(int);
 101 extern int              dirfd(DIR *);
 102 #endif
 103 
 104 #if defined(_XPG7) || !defined(_STRICT_SYMBOLS)
 105 extern int              scandir(const char *, struct dirent ***,
 106                                 int (*)(const struct dirent *),
 107                                 int (*)(const struct dirent **,
 108                                         const struct dirent **));
 109 extern int              alphasort(const struct dirent **,
 110                                         const struct dirent **);
 111 #endif
 112 
 113 extern struct dirent    *readdir(DIR *);
 114 extern void             rewinddir(DIR *);
 115 extern int              closedir(DIR *);
 116 
 117 #if defined(_XOPEN_SOURCE) || !defined(_STRICT_SYMBOLS)
 118 extern long             telldir(DIR *);
 119 extern void             seekdir(DIR *, long);
 120 #define rewinddir(dirp) seekdir(dirp, 0L)
 121 #endif
 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(_STRICT_SYMBOLS)
 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 /* !_STRICT_SYMBOLS */
 134 #endif
 135 
 136 /*
 137  * readdir_r() prototype is defined here.
 138  *
 139  * There are several variations, depending on whether compatibility with old
 140  * POSIX draft specifications or the final specification is desired and on
 141  * whether the large file compilation environment is active.  To combat a
 142  * combinatorial explosion, enabling large files implies using the final
 143  * specification (since the definition of the large file environment
 144  * considerably postdates that of the final readdir_r specification).
 145  *
 146  * In the LP64 compilation environment, all APIs are already large file,
 147  * and since there are no 64-bit applications that can have seen the
 148  * draft implementation, again, we use the final POSIX specification.
 149  */
 150 
 151 #if     defined(__EXTENSIONS__) || defined(_REENTRANT) || \
 152         !defined(__XOPEN_OR_POSIX) || (_POSIX_C_SOURCE - 0 >= 199506L) || \
 153         defined(_POSIX_PTHREAD_SEMANTICS)
 154 
 155 #if     !defined(_LP64) && _FILE_OFFSET_BITS == 32
 156 
 157 #if     (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS)
 158 
 159 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 160 #pragma redefine_extname readdir_r      __posix_readdir_r
 161 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
 162                 struct dirent **_RESTRICT_KYWD);
 163 #else   /* __PRAGMA_REDEFINE_EXTNAME */
 164 
 165 extern int __posix_readdir_r(DIR *_RESTRICT_KYWD,
 166     struct dirent *_RESTRICT_KYWD, struct dirent **_RESTRICT_KYWD);
 167 
 168 #ifdef  __lint
 169 #define readdir_r       __posix_readdir_r
 170 #else   /* !__lint */
 171 
 172 static int
 173 readdir_r(DIR *_RESTRICT_KYWD __dp, struct dirent *_RESTRICT_KYWD __ent,
 174                 struct dirent **_RESTRICT_KYWD __res) {
 175         return (__posix_readdir_r(__dp, __ent, __res));
 176 }
 177 
 178 #endif /* !__lint */
 179 #endif /* __PRAGMA_REDEFINE_EXTNAME */
 180 
 181 #else  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 182 
 183 extern struct dirent *readdir_r(DIR *__dp, struct dirent *__ent);
 184 
 185 #endif  /* (_POSIX_C_SOURCE - 0 >= 199506L) || ... */
 186 
 187 #else   /* !_LP64 && _FILE_OFFSET_BITS == 32 */
 188 
 189 #if defined(_LP64)
 190 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 191 #pragma redefine_extname readdir64_r    readdir_r
 192 #else
 193 #define readdir64_r             readdir_r
 194 #endif
 195 #else   /* _LP64 */
 196 #ifdef  __PRAGMA_REDEFINE_EXTNAME
 197 #pragma redefine_extname readdir_r      readdir64_r
 198 #else
 199 #define readdir_r               readdir64_r
 200 #endif
 201 #endif  /* _LP64 */
 202 extern int readdir_r(DIR *_RESTRICT_KYWD, struct dirent *_RESTRICT_KYWD,
 203         struct dirent **_RESTRICT_KYWD);
 204 
 205 #endif  /* !_LP64 && _FILE_OFFSET_BITS == 32 */
 206 
 207 #if     defined(_LARGEFILE64_SOURCE) && !((_FILE_OFFSET_BITS == 64) && \
 208             !defined(__PRAGMA_REDEFINE_EXTNAME))
 209 /* transitional large file interface */
 210 extern int readdir64_r(DIR *_RESTRICT_KYWD, struct dirent64 *_RESTRICT_KYWD,
 211         struct dirent64 **_RESTRICT_KYWD);
 212 #endif
 213 
 214 #endif /* defined(__EXTENSIONS__) || defined(_REENTRANT)... */
 215 
 216 #ifdef  __cplusplus
 217 }
 218 #endif
 219 
 220 #endif  /* _DIRENT_H */