1 /*
2  * Copyright (c) 2000, 2002-2008 Apple Inc. All rights reserved.
3  *
4  * @APPLE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. Please obtain a copy of the License at
10  * http://www.opensource.apple.com/apsl/ and read it before using this
11  * file.
12  *
13  * The Original Code and all software distributed under the License are
14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18  * Please see the License for the specific language governing rights and
19  * limitations under the License.
20  *
21  * @APPLE_LICENSE_HEADER_END@
22  */
23 /*-
24  * Copyright (c) 1989, 1993
25  *	The Regents of the University of California.  All rights reserved.
26  *
27  * Redistribution and use in source and binary forms, with or without
28  * modification, are permitted provided that the following conditions
29  * are met:
30  * 1. Redistributions of source code must retain the above copyright
31  *    notice, this list of conditions and the following disclaimer.
32  * 2. Redistributions in binary form must reproduce the above copyright
33  *    notice, this list of conditions and the following disclaimer in the
34  *    documentation and/or other materials provided with the distribution.
35  * 3. All advertising materials mentioning features or use of this software
36  *    must display the following acknowledgement:
37  *	This product includes software developed by the University of
38  *	California, Berkeley and its contributors.
39  * 4. Neither the name of the University nor the names of its contributors
40  *    may be used to endorse or promote products derived from this software
41  *    without specific prior written permission.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
47  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53  * SUCH DAMAGE.
54  *
55  *	@(#)dirent.h	8.2 (Berkeley) 7/28/94
56  */
57 
58 #ifndef _DIRENT_H_
59 #define _DIRENT_H_
60 
61 /*
62  * The kernel defines the format of directory entries
63  */
64 #include <_types.h>
65 #include <sys/dirent.h>
66 #include <sys/cdefs.h>
67 #include <Availability.h>
68 #include <sys/_pthread/_pthread_types.h> /* __darwin_pthread_mutex_t */
69 
70 struct _telldir;		/* forward reference */
71 
72 /* structure describing an open directory. */
73 typedef struct {
74 	int	__dd_fd;	/* file descriptor associated with directory */
75 	long	__dd_loc;	/* offset in current buffer */
76 	long	__dd_size;	/* amount of data returned */
77 	char	*__dd_buf;	/* data buffer */
78 	int	__dd_len;	/* size of data buffer */
79 	long	__dd_seek;	/* magic cookie returned */
80 	__unused long	__padding; /* (__dd_rewind space left for bincompat) */
81 	int	__dd_flags;	/* flags for readdir */
82 	__darwin_pthread_mutex_t __dd_lock; /* for thread locking */
83 	struct _telldir *__dd_td; /* telldir position recording */
84 } DIR;
85 
86 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
87 
88 /* definitions for library routines operating on directories. */
89 #define	DIRBLKSIZ	1024
90 
91 /* flags for opendir2 */
92 #define DTF_HIDEW	0x0001	/* hide whiteout entries */
93 #define DTF_NODUP	0x0002	/* don't return duplicate names */
94 #define DTF_REWIND	0x0004	/* rewind after reading union stack */
95 #define __DTF_READALL	0x0008	/* everything has been read */
96 #define __DTF_SKIPREAD  0x0010  /* assume internal buffer is populated */
97 #define __DTF_ATEND     0x0020  /* there's nothing more to read in the kernel */
98 
99 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
100 
101 #ifndef KERNEL
102 
103 __BEGIN_DECLS
104 
105 int closedir(DIR *) __DARWIN_ALIAS(closedir);
106 
107 DIR *opendir(const char *) __DARWIN_ALIAS_I(opendir);
108 
109 struct dirent *readdir(DIR *) __DARWIN_INODE64(readdir);
110 int readdir_r(DIR *, struct dirent *, struct dirent **) __DARWIN_INODE64(readdir_r);
111 
112 void rewinddir(DIR *) __DARWIN_ALIAS_I(rewinddir);
113 
114 void seekdir(DIR *, long) __DARWIN_ALIAS_I(seekdir);
115 
116 long telldir(DIR *) __DARWIN_ALIAS_I(telldir);
117 
118 __END_DECLS
119 
120 
121 /* Additional functionality provided by:
122  * POSIX.1-2008
123  */
124 
125 #if __DARWIN_C_LEVEL >= 200809L
126 __BEGIN_DECLS
127 
128 __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0)
129 DIR *fdopendir(int) __DARWIN_ALIAS_I(fdopendir);
130 
131 int alphasort(const struct dirent **, const struct dirent **) __DARWIN_INODE64(alphasort);
132 
133 #if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8) || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)
134 #include <errno.h>
135 #include <stdlib.h>
136 #define dirfd(dirp) ({                         \
137     DIR *_dirp = (dirp);                       \
138     int ret = -1;                              \
139     if (_dirp == NULL || _dirp->__dd_fd < 0)   \
140         errno = EINVAL;                        \
141     else                                       \
142        ret = _dirp->__dd_fd;                   \
143     ret;                                       \
144 })
145 #else
146 int dirfd(DIR *dirp) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0);
147 #endif
148 
149 int scandir(const char *, struct dirent ***,
150     int (*)(const struct dirent *), int (*)(const struct dirent **, const struct dirent **)) __DARWIN_INODE64(scandir);
151 #ifdef __BLOCKS__
152 #if __has_attribute(noescape)
153 #define __scandir_noescape __attribute__((__noescape__))
154 #else
155 #define __scandir_noescape
156 #endif
157 
158 int scandir_b(const char *, struct dirent ***,
159     int (^)(const struct dirent *) __scandir_noescape,
160     int (^)(const struct dirent **, const struct dirent **) __scandir_noescape)
161     __DARWIN_INODE64(scandir_b) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
162 #endif /* __BLOCKS__ */
163 
164 __END_DECLS
165 #endif /* __DARWIN_C_LEVEL >= 200809L */
166 
167 
168 #if __DARWIN_C_LEVEL >= __DARWIN_C_FULL
169 __BEGIN_DECLS
170 
171 int getdirentries(int, char *, int, long *)
172 
173 #if __DARWIN_64_BIT_INO_T
174 /*
175  * getdirentries() doesn't work when 64-bit inodes is in effect, so we
176  * generate a link error.
177  */
178 						__asm("_getdirentries_is_not_available_when_64_bit_inodes_are_in_effect")
179 #else /* !__DARWIN_64_BIT_INO_T */
180 						__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_6, __IPHONE_2_0,__IPHONE_2_0)
181 #endif /* __DARWIN_64_BIT_INO_T */
182 ;
183 
184 DIR *__opendir2(const char *, int) __DARWIN_ALIAS_I(__opendir2);
185 
186 __END_DECLS
187 #endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */
188 
189 #endif /* !KERNEL */
190 
191 #endif /* !_DIRENT_H_ */