cpp-d1064d
[cross.git] / i686-linux-gnu-4.7 / usr / include / dirent.h
1 /* Copyright (C) 1991-2018 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17
18 /*
19  *      POSIX Standard: 5.1.2 Directory Operations      <dirent.h>
20  */
21
22 #ifndef _DIRENT_H
23 #define _DIRENT_H       1
24
25 #include <features.h>
26
27 __BEGIN_DECLS
28
29 #include <bits/types.h>
30
31 #ifdef __USE_XOPEN
32 # ifndef __ino_t_defined
33 #  ifndef __USE_FILE_OFFSET64
34 typedef __ino_t ino_t;
35 #  else
36 typedef __ino64_t ino_t;
37 #  endif
38 #  define __ino_t_defined
39 # endif
40 # if defined __USE_LARGEFILE64 && !defined __ino64_t_defined
41 typedef __ino64_t ino64_t;
42 #  define __ino64_t_defined
43 # endif
44 #endif
45
46 /* This file defines `struct dirent'.
47
48    It defines the macro `_DIRENT_HAVE_D_NAMLEN' iff there is a `d_namlen'
49    member that gives the length of `d_name'.
50
51    It defines the macro `_DIRENT_HAVE_D_RECLEN' iff there is a `d_reclen'
52    member that gives the size of the entire directory entry.
53
54    It defines the macro `_DIRENT_HAVE_D_OFF' iff there is a `d_off'
55    member that gives the file offset of the next directory entry.
56
57    It defines the macro `_DIRENT_HAVE_D_TYPE' iff there is a `d_type'
58    member that gives the type of the file.
59  */
60
61 #include <bits/dirent.h>
62
63 #if defined __USE_MISC && !defined d_fileno
64 # define d_ino  d_fileno                 /* Backward compatibility.  */
65 #endif
66
67 /* These macros extract size information from a `struct dirent *'.
68    They may evaluate their argument multiple times, so it must not
69    have side effects.  Each of these may involve a relatively costly
70    call to `strlen' on some systems, so these values should be cached.
71
72    _D_EXACT_NAMLEN (DP) returns the length of DP->d_name, not including
73    its terminating null character.
74
75    _D_ALLOC_NAMLEN (DP) returns a size at least (_D_EXACT_NAMLEN (DP) + 1);
76    that is, the allocation size needed to hold the DP->d_name string.
77    Use this macro when you don't need the exact length, just an upper bound.
78    This macro is less likely to require calling `strlen' than _D_EXACT_NAMLEN.
79    */
80
81 #ifdef _DIRENT_HAVE_D_NAMLEN
82 # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
83 # define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
84 #else
85 # define _D_EXACT_NAMLEN(d) (strlen ((d)->d_name))
86 # ifdef _DIRENT_HAVE_D_RECLEN
87 #  define _D_ALLOC_NAMLEN(d) (((char *) (d) + (d)->d_reclen) - &(d)->d_name[0])
88 # else
89 #  define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name : \
90                               _D_EXACT_NAMLEN (d) + 1)
91 # endif
92 #endif
93
94
95 #ifdef __USE_MISC
96 /* File types for `d_type'.  */
97 enum
98   {
99     DT_UNKNOWN = 0,
100 # define DT_UNKNOWN     DT_UNKNOWN
101     DT_FIFO = 1,
102 # define DT_FIFO        DT_FIFO
103     DT_CHR = 2,
104 # define DT_CHR         DT_CHR
105     DT_DIR = 4,
106 # define DT_DIR         DT_DIR
107     DT_BLK = 6,
108 # define DT_BLK         DT_BLK
109     DT_REG = 8,
110 # define DT_REG         DT_REG
111     DT_LNK = 10,
112 # define DT_LNK         DT_LNK
113     DT_SOCK = 12,
114 # define DT_SOCK        DT_SOCK
115     DT_WHT = 14
116 # define DT_WHT         DT_WHT
117   };
118
119 /* Convert between stat structure types and directory types.  */
120 # define IFTODT(mode)   (((mode) & 0170000) >> 12)
121 # define DTTOIF(dirtype)        ((dirtype) << 12)
122 #endif
123
124
125 /* This is the data type of directory stream objects.
126    The actual structure is opaque to users.  */
127 typedef struct __dirstream DIR;
128
129 /* Open a directory stream on NAME.
130    Return a DIR stream on the directory, or NULL if it could not be opened.
131
132    This function is a possible cancellation point and therefore not
133    marked with __THROW.  */
134 extern DIR *opendir (const char *__name) __nonnull ((1));
135
136 #ifdef __USE_XOPEN2K8
137 /* Same as opendir, but open the stream on the file descriptor FD.
138
139    This function is a possible cancellation point and therefore not
140    marked with __THROW.  */
141 extern DIR *fdopendir (int __fd);
142 #endif
143
144 /* Close the directory stream DIRP.
145    Return 0 if successful, -1 if not.
146
147    This function is a possible cancellation point and therefore not
148    marked with __THROW.  */
149 extern int closedir (DIR *__dirp) __nonnull ((1));
150
151 /* Read a directory entry from DIRP.  Return a pointer to a `struct
152    dirent' describing the entry, or NULL for EOF or error.  The
153    storage returned may be overwritten by a later readdir call on the
154    same DIR stream.
155
156    If the Large File Support API is selected we have to use the
157    appropriate interface.
158
159    This function is a possible cancellation point and therefore not
160    marked with __THROW.  */
161 #ifndef __USE_FILE_OFFSET64
162 extern struct dirent *readdir (DIR *__dirp) __nonnull ((1));
163 #else
164 # ifdef __REDIRECT
165 extern struct dirent *__REDIRECT (readdir, (DIR *__dirp), readdir64)
166      __nonnull ((1));
167 # else
168 #  define readdir readdir64
169 # endif
170 #endif
171
172 #ifdef __USE_LARGEFILE64
173 extern struct dirent64 *readdir64 (DIR *__dirp) __nonnull ((1));
174 #endif
175
176 #ifdef __USE_POSIX
177 /* Reentrant version of `readdir'.  Return in RESULT a pointer to the
178    next entry.
179
180    This function is a possible cancellation point and therefore not
181    marked with __THROW.  */
182 # ifndef __USE_FILE_OFFSET64
183 extern int readdir_r (DIR *__restrict __dirp,
184                       struct dirent *__restrict __entry,
185                       struct dirent **__restrict __result)
186      __nonnull ((1, 2, 3)) __attribute_deprecated__;
187 # else
188 #  ifdef __REDIRECT
189 extern int __REDIRECT (readdir_r,
190                        (DIR *__restrict __dirp,
191                         struct dirent *__restrict __entry,
192                         struct dirent **__restrict __result),
193                        readdir64_r)
194   __nonnull ((1, 2, 3)) __attribute_deprecated__;
195 #  else
196 #   define readdir_r readdir64_r
197 #  endif
198 # endif
199
200 # ifdef __USE_LARGEFILE64
201 extern int readdir64_r (DIR *__restrict __dirp,
202                         struct dirent64 *__restrict __entry,
203                         struct dirent64 **__restrict __result)
204   __nonnull ((1, 2, 3)) __attribute_deprecated__;
205 # endif
206 #endif  /* POSIX or misc */
207
208 /* Rewind DIRP to the beginning of the directory.  */
209 extern void rewinddir (DIR *__dirp) __THROW __nonnull ((1));
210
211 #if defined __USE_MISC || defined __USE_XOPEN
212 # include <bits/types.h>
213
214 /* Seek to position POS on DIRP.  */
215 extern void seekdir (DIR *__dirp, long int __pos) __THROW __nonnull ((1));
216
217 /* Return the current position of DIRP.  */
218 extern long int telldir (DIR *__dirp) __THROW __nonnull ((1));
219 #endif
220
221 #ifdef __USE_XOPEN2K8
222
223 /* Return the file descriptor used by DIRP.  */
224 extern int dirfd (DIR *__dirp) __THROW __nonnull ((1));
225
226 # if defined __OPTIMIZE__ && defined _DIR_dirfd
227 #  define dirfd(dirp)   _DIR_dirfd (dirp)
228 # endif
229
230 # ifdef __USE_MISC
231 #  ifndef MAXNAMLEN
232 /* Get the definitions of the POSIX.1 limits.  */
233 #  include <bits/posix1_lim.h>
234
235 /* `MAXNAMLEN' is the BSD name for what POSIX calls `NAME_MAX'.  */
236 #   ifdef NAME_MAX
237 #    define MAXNAMLEN   NAME_MAX
238 #   else
239 #    define MAXNAMLEN   255
240 #   endif
241 #  endif
242 # endif
243
244 # define __need_size_t
245 # include <stddef.h>
246
247 /* Scan the directory DIR, calling SELECTOR on each directory entry.
248    Entries for which SELECT returns nonzero are individually malloc'd,
249    sorted using qsort with CMP, and collected in a malloc'd array in
250    *NAMELIST.  Returns the number of entries selected, or -1 on error.
251
252    This function is a cancellation point and therefore not marked with
253    __THROW.  */
254 # ifndef __USE_FILE_OFFSET64
255 extern int scandir (const char *__restrict __dir,
256                     struct dirent ***__restrict __namelist,
257                     int (*__selector) (const struct dirent *),
258                     int (*__cmp) (const struct dirent **,
259                                   const struct dirent **))
260      __nonnull ((1, 2));
261 # else
262 #  ifdef __REDIRECT
263 extern int __REDIRECT (scandir,
264                        (const char *__restrict __dir,
265                         struct dirent ***__restrict __namelist,
266                         int (*__selector) (const struct dirent *),
267                         int (*__cmp) (const struct dirent **,
268                                       const struct dirent **)),
269                        scandir64) __nonnull ((1, 2));
270 #  else
271 #   define scandir scandir64
272 #  endif
273 # endif
274
275 # if defined __USE_GNU && defined __USE_LARGEFILE64
276 /* This function is like `scandir' but it uses the 64bit dirent structure.
277    Please note that the CMP function must now work with struct dirent64 **.  */
278 extern int scandir64 (const char *__restrict __dir,
279                       struct dirent64 ***__restrict __namelist,
280                       int (*__selector) (const struct dirent64 *),
281                       int (*__cmp) (const struct dirent64 **,
282                                     const struct dirent64 **))
283      __nonnull ((1, 2));
284 # endif
285
286 # ifdef __USE_GNU
287 /* Similar to `scandir' but a relative DIR name is interpreted relative
288    to the directory for which DFD is a descriptor.
289
290    This function is a cancellation point and therefore not marked with
291    __THROW.  */
292 #  ifndef __USE_FILE_OFFSET64
293 extern int scandirat (int __dfd, const char *__restrict __dir,
294                       struct dirent ***__restrict __namelist,
295                       int (*__selector) (const struct dirent *),
296                       int (*__cmp) (const struct dirent **,
297                                     const struct dirent **))
298      __nonnull ((2, 3));
299 #  else
300 #   ifdef __REDIRECT
301 extern int __REDIRECT (scandirat,
302                        (int __dfd, const char *__restrict __dir,
303                         struct dirent ***__restrict __namelist,
304                         int (*__selector) (const struct dirent *),
305                         int (*__cmp) (const struct dirent **,
306                                       const struct dirent **)),
307                        scandirat64) __nonnull ((2, 3));
308 #   else
309 #    define scandirat scandirat64
310 #   endif
311 #  endif
312
313 /* This function is like `scandir' but it uses the 64bit dirent structure.
314    Please note that the CMP function must now work with struct dirent64 **.  */
315 extern int scandirat64 (int __dfd, const char *__restrict __dir,
316                         struct dirent64 ***__restrict __namelist,
317                         int (*__selector) (const struct dirent64 *),
318                         int (*__cmp) (const struct dirent64 **,
319                                       const struct dirent64 **))
320      __nonnull ((2, 3));
321 # endif
322
323 /* Function to compare two `struct dirent's alphabetically.  */
324 # ifndef __USE_FILE_OFFSET64
325 extern int alphasort (const struct dirent **__e1,
326                       const struct dirent **__e2)
327      __THROW __attribute_pure__ __nonnull ((1, 2));
328 # else
329 #  ifdef __REDIRECT
330 extern int __REDIRECT_NTH (alphasort,
331                            (const struct dirent **__e1,
332                             const struct dirent **__e2),
333                            alphasort64) __attribute_pure__ __nonnull ((1, 2));
334 #  else
335 #   define alphasort alphasort64
336 #  endif
337 # endif
338
339 # if defined __USE_GNU && defined __USE_LARGEFILE64
340 extern int alphasort64 (const struct dirent64 **__e1,
341                         const struct dirent64 **__e2)
342      __THROW __attribute_pure__ __nonnull ((1, 2));
343 # endif
344 #endif /* Use XPG7.  */
345
346
347 #ifdef __USE_MISC
348 /* Read directory entries from FD into BUF, reading at most NBYTES.
349    Reading starts at offset *BASEP, and *BASEP is updated with the new
350    position after reading.  Returns the number of bytes read; zero when at
351    end of directory; or -1 for errors.  */
352 # ifndef __USE_FILE_OFFSET64
353 extern __ssize_t getdirentries (int __fd, char *__restrict __buf,
354                                 size_t __nbytes,
355                                 __off_t *__restrict __basep)
356      __THROW __nonnull ((2, 4));
357 # else
358 #  ifdef __REDIRECT
359 extern __ssize_t __REDIRECT_NTH (getdirentries,
360                                  (int __fd, char *__restrict __buf,
361                                   size_t __nbytes,
362                                   __off64_t *__restrict __basep),
363                                  getdirentries64) __nonnull ((2, 4));
364 #  else
365 #   define getdirentries getdirentries64
366 #  endif
367 # endif
368
369 # ifdef __USE_LARGEFILE64
370 extern __ssize_t getdirentries64 (int __fd, char *__restrict __buf,
371                                   size_t __nbytes,
372                                   __off64_t *__restrict __basep)
373      __THROW __nonnull ((2, 4));
374 # endif
375 #endif /* Use misc.  */
376
377 #ifdef __USE_GNU
378 /* Function to compare two `struct dirent's by name & version.  */
379 # ifndef __USE_FILE_OFFSET64
380 extern int versionsort (const struct dirent **__e1,
381                         const struct dirent **__e2)
382      __THROW __attribute_pure__ __nonnull ((1, 2));
383 # else
384 #  ifdef __REDIRECT
385 extern int __REDIRECT_NTH (versionsort,
386                            (const struct dirent **__e1,
387                             const struct dirent **__e2),
388                            versionsort64)
389      __attribute_pure__ __nonnull ((1, 2));
390 #  else
391 #   define versionsort versionsort64
392 #  endif
393 # endif
394
395 # ifdef __USE_LARGEFILE64
396 extern int versionsort64 (const struct dirent64 **__e1,
397                           const struct dirent64 **__e2)
398      __THROW __attribute_pure__ __nonnull ((1, 2));
399 # endif
400 #endif /* Use GNU.  */
401
402 __END_DECLS
403
404 #endif /* dirent.h  */