1 | /* Copyright (C) 1991-2024 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 | <https://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 | /* Close the directory stream DIRP. |
130 | Return 0 if successful, -1 if not. |
131 | |
132 | This function is a possible cancellation point and therefore not |
133 | marked with __THROW. */ |
134 | extern int closedir (DIR *__dirp) __nonnull ((1)); |
135 | |
136 | /* Open a directory stream on NAME. |
137 | Return a DIR stream on the directory, or NULL if it could not be opened. |
138 | |
139 | This function is a possible cancellation point and therefore not |
140 | marked with __THROW. */ |
141 | extern DIR *opendir (const char *__name) __nonnull ((1)) |
142 | __attribute_malloc__ __attr_dealloc (closedir, 1); |
143 | |
144 | #ifdef __USE_XOPEN2K8 |
145 | /* Same as opendir, but open the stream on the file descriptor FD. |
146 | |
147 | This function is a possible cancellation point and therefore not |
148 | marked with __THROW. */ |
149 | extern DIR *fdopendir (int __fd) |
150 | __attribute_malloc__ __attr_dealloc (closedir, 1); |
151 | #endif |
152 | |
153 | /* Read a directory entry from DIRP. Return a pointer to a `struct |
154 | dirent' describing the entry, or NULL for EOF or error. The |
155 | storage returned may be overwritten by a later readdir call on the |
156 | same DIR stream. |
157 | |
158 | If the Large File Support API is selected we have to use the |
159 | appropriate interface. |
160 | |
161 | This function is a possible cancellation point and therefore not |
162 | marked with __THROW. */ |
163 | #ifndef __USE_FILE_OFFSET64 |
164 | extern struct dirent *readdir (DIR *__dirp) __nonnull ((1)); |
165 | #else |
166 | # ifdef __REDIRECT |
167 | extern struct dirent *__REDIRECT (readdir, (DIR *__dirp), readdir64) |
168 | __nonnull ((1)); |
169 | # else |
170 | # define readdir readdir64 |
171 | # endif |
172 | #endif |
173 | |
174 | #ifdef __USE_LARGEFILE64 |
175 | extern struct dirent64 *readdir64 (DIR *__dirp) __nonnull ((1)); |
176 | #endif |
177 | |
178 | #ifdef __USE_POSIX |
179 | /* Reentrant version of `readdir'. Return in RESULT a pointer to the |
180 | next entry. |
181 | |
182 | This function is a possible cancellation point and therefore not |
183 | marked with __THROW. */ |
184 | # ifndef __USE_FILE_OFFSET64 |
185 | extern int readdir_r (DIR *__restrict __dirp, |
186 | struct dirent *__restrict __entry, |
187 | struct dirent **__restrict __result) |
188 | __nonnull ((1, 2, 3)) __attribute_deprecated__; |
189 | # else |
190 | # ifdef __REDIRECT |
191 | extern int __REDIRECT (readdir_r, |
192 | (DIR *__restrict __dirp, |
193 | struct dirent *__restrict __entry, |
194 | struct dirent **__restrict __result), |
195 | readdir64_r) |
196 | __nonnull ((1, 2, 3)) __attribute_deprecated__; |
197 | # else |
198 | # define readdir_r readdir64_r |
199 | # endif |
200 | # endif |
201 | |
202 | # ifdef __USE_LARGEFILE64 |
203 | extern int readdir64_r (DIR *__restrict __dirp, |
204 | struct dirent64 *__restrict __entry, |
205 | struct dirent64 **__restrict __result) |
206 | __nonnull ((1, 2, 3)) __attribute_deprecated__; |
207 | # endif |
208 | #endif /* POSIX or misc */ |
209 | |
210 | /* Rewind DIRP to the beginning of the directory. */ |
211 | extern void rewinddir (DIR *__dirp) __THROW __nonnull ((1)); |
212 | |
213 | #if defined __USE_MISC || defined __USE_XOPEN |
214 | # include <bits/types.h> |
215 | |
216 | /* Seek to position POS on DIRP. */ |
217 | extern void seekdir (DIR *__dirp, long int __pos) __THROW __nonnull ((1)); |
218 | |
219 | /* Return the current position of DIRP. */ |
220 | extern long int telldir (DIR *__dirp) __THROW __nonnull ((1)); |
221 | #endif |
222 | |
223 | #ifdef __USE_XOPEN2K8 |
224 | |
225 | /* Return the file descriptor used by DIRP. */ |
226 | extern int dirfd (DIR *__dirp) __THROW __nonnull ((1)); |
227 | |
228 | # if defined __OPTIMIZE__ && defined _DIR_dirfd |
229 | # define dirfd(dirp) _DIR_dirfd (dirp) |
230 | # endif |
231 | |
232 | # ifdef __USE_MISC |
233 | # ifndef MAXNAMLEN |
234 | /* Get the definitions of the POSIX.1 limits. */ |
235 | # include <bits/posix1_lim.h> |
236 | |
237 | /* `MAXNAMLEN' is the BSD name for what POSIX calls `NAME_MAX'. */ |
238 | # ifdef NAME_MAX |
239 | # define MAXNAMLEN NAME_MAX |
240 | # else |
241 | # define MAXNAMLEN 255 |
242 | # endif |
243 | # endif |
244 | # endif |
245 | |
246 | # define __need_size_t |
247 | # include <stddef.h> |
248 | |
249 | /* Scan the directory DIR, calling SELECTOR on each directory entry. |
250 | Entries for which SELECT returns nonzero are individually malloc'd, |
251 | sorted using qsort with CMP, and collected in a malloc'd array in |
252 | *NAMELIST. Returns the number of entries selected, or -1 on error. |
253 | |
254 | This function is a cancellation point and therefore not marked with |
255 | __THROW. */ |
256 | # ifndef __USE_FILE_OFFSET64 |
257 | extern int scandir (const char *__restrict __dir, |
258 | struct dirent ***__restrict __namelist, |
259 | int (*__selector) (const struct dirent *), |
260 | int (*__cmp) (const struct dirent **, |
261 | const struct dirent **)) |
262 | __nonnull ((1, 2)); |
263 | # else |
264 | # ifdef __REDIRECT |
265 | extern int __REDIRECT (scandir, |
266 | (const char *__restrict __dir, |
267 | struct dirent ***__restrict __namelist, |
268 | int (*__selector) (const struct dirent *), |
269 | int (*__cmp) (const struct dirent **, |
270 | const struct dirent **)), |
271 | scandir64) __nonnull ((1, 2)); |
272 | # else |
273 | # define scandir scandir64 |
274 | # endif |
275 | # endif |
276 | |
277 | # if defined __USE_GNU && defined __USE_LARGEFILE64 |
278 | /* This function is like `scandir' but it uses the 64bit dirent structure. |
279 | Please note that the CMP function must now work with struct dirent64 **. */ |
280 | extern int scandir64 (const char *__restrict __dir, |
281 | struct dirent64 ***__restrict __namelist, |
282 | int (*__selector) (const struct dirent64 *), |
283 | int (*__cmp) (const struct dirent64 **, |
284 | const struct dirent64 **)) |
285 | __nonnull ((1, 2)); |
286 | # endif |
287 | |
288 | # ifdef __USE_GNU |
289 | /* Similar to `scandir' but a relative DIR name is interpreted relative |
290 | to the directory for which DFD is a descriptor. |
291 | |
292 | This function is a cancellation point and therefore not marked with |
293 | __THROW. */ |
294 | # ifndef __USE_FILE_OFFSET64 |
295 | extern int scandirat (int __dfd, const char *__restrict __dir, |
296 | struct dirent ***__restrict __namelist, |
297 | int (*__selector) (const struct dirent *), |
298 | int (*__cmp) (const struct dirent **, |
299 | const struct dirent **)) |
300 | __nonnull ((2, 3)); |
301 | # else |
302 | # ifdef __REDIRECT |
303 | extern int __REDIRECT (scandirat, |
304 | (int __dfd, const char *__restrict __dir, |
305 | struct dirent ***__restrict __namelist, |
306 | int (*__selector) (const struct dirent *), |
307 | int (*__cmp) (const struct dirent **, |
308 | const struct dirent **)), |
309 | scandirat64) __nonnull ((2, 3)); |
310 | # else |
311 | # define scandirat scandirat64 |
312 | # endif |
313 | # endif |
314 | |
315 | /* This function is like `scandir' but it uses the 64bit dirent structure. |
316 | Please note that the CMP function must now work with struct dirent64 **. */ |
317 | extern int scandirat64 (int __dfd, const char *__restrict __dir, |
318 | struct dirent64 ***__restrict __namelist, |
319 | int (*__selector) (const struct dirent64 *), |
320 | int (*__cmp) (const struct dirent64 **, |
321 | const struct dirent64 **)) |
322 | __nonnull ((2, 3)); |
323 | # endif |
324 | |
325 | /* Function to compare two `struct dirent's alphabetically. */ |
326 | # ifndef __USE_FILE_OFFSET64 |
327 | extern int alphasort (const struct dirent **__e1, |
328 | const struct dirent **__e2) |
329 | __THROW __attribute_pure__ __nonnull ((1, 2)); |
330 | # else |
331 | # ifdef __REDIRECT |
332 | extern int __REDIRECT_NTH (alphasort, |
333 | (const struct dirent **__e1, |
334 | const struct dirent **__e2), |
335 | alphasort64) __attribute_pure__ __nonnull ((1, 2)); |
336 | # else |
337 | # define alphasort alphasort64 |
338 | # endif |
339 | # endif |
340 | |
341 | # if defined __USE_GNU && defined __USE_LARGEFILE64 |
342 | extern int alphasort64 (const struct dirent64 **__e1, |
343 | const struct dirent64 **__e2) |
344 | __THROW __attribute_pure__ __nonnull ((1, 2)); |
345 | # endif |
346 | #endif /* Use XPG7. */ |
347 | |
348 | |
349 | #ifdef __USE_MISC |
350 | /* Read directory entries from FD into BUF, reading at most NBYTES. |
351 | Reading starts at offset *BASEP, and *BASEP is updated with the new |
352 | position after reading. Returns the number of bytes read; zero when at |
353 | end of directory; or -1 for errors. */ |
354 | # ifndef __USE_FILE_OFFSET64 |
355 | extern __ssize_t getdirentries (int __fd, char *__restrict __buf, |
356 | size_t __nbytes, |
357 | __off_t *__restrict __basep) |
358 | __THROW __nonnull ((2, 4)); |
359 | # else |
360 | # ifdef __REDIRECT |
361 | extern __ssize_t __REDIRECT_NTH (getdirentries, |
362 | (int __fd, char *__restrict __buf, |
363 | size_t __nbytes, |
364 | __off64_t *__restrict __basep), |
365 | getdirentries64) __nonnull ((2, 4)); |
366 | # else |
367 | # define getdirentries getdirentries64 |
368 | # endif |
369 | # endif |
370 | |
371 | # ifdef __USE_LARGEFILE64 |
372 | extern __ssize_t getdirentries64 (int __fd, char *__restrict __buf, |
373 | size_t __nbytes, |
374 | __off64_t *__restrict __basep) |
375 | __THROW __nonnull ((2, 4)); |
376 | # endif |
377 | #endif /* Use misc. */ |
378 | |
379 | #ifdef __USE_GNU |
380 | /* Function to compare two `struct dirent's by name & version. */ |
381 | # ifndef __USE_FILE_OFFSET64 |
382 | extern int versionsort (const struct dirent **__e1, |
383 | const struct dirent **__e2) |
384 | __THROW __attribute_pure__ __nonnull ((1, 2)); |
385 | # else |
386 | # ifdef __REDIRECT |
387 | extern int __REDIRECT_NTH (versionsort, |
388 | (const struct dirent **__e1, |
389 | const struct dirent **__e2), |
390 | versionsort64) |
391 | __attribute_pure__ __nonnull ((1, 2)); |
392 | # else |
393 | # define versionsort versionsort64 |
394 | # endif |
395 | # endif |
396 | |
397 | # ifdef __USE_LARGEFILE64 |
398 | extern int versionsort64 (const struct dirent64 **__e1, |
399 | const struct dirent64 **__e2) |
400 | __THROW __attribute_pure__ __nonnull ((1, 2)); |
401 | # endif |
402 | #endif /* Use GNU. */ |
403 | |
404 | __END_DECLS |
405 | |
406 | #include <bits/dirent_ext.h> |
407 | |
408 | #endif /* dirent.h */ |
409 | |