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