]> git.ipfire.org Git - thirdparty/glibc.git/blame - dirent/dirent.h
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / dirent / dirent.h
CommitLineData
dff8da6b 1/* Copyright (C) 1991-2024 Free Software Foundation, Inc.
54d79e99 2 This file is part of the GNU C Library.
28f540f4 3
54d79e99 4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
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.
28f540f4 8
54d79e99
UD
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
41bdb6e2 12 Lesser General Public License for more details.
28f540f4 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>. */
28f540f4
RM
17
18/*
19 * POSIX Standard: 5.1.2 Directory Operations <dirent.h>
20 */
21
22#ifndef _DIRENT_H
28f540f4 23#define _DIRENT_H 1
5107cf1d 24
28f540f4
RM
25#include <features.h>
26
27__BEGIN_DECLS
28
5107cf1d 29#include <bits/types.h>
28f540f4 30
70b2845f
UD
31#ifdef __USE_XOPEN
32# ifndef __ino_t_defined
33# ifndef __USE_FILE_OFFSET64
34typedef __ino_t ino_t;
35# else
36typedef __ino64_t ino_t;
37# endif
38# define __ino_t_defined
39# endif
8353b5f6 40# if defined __USE_LARGEFILE64 && !defined __ino64_t_defined
70b2845f 41typedef __ino64_t ino64_t;
8353b5f6 42# define __ino64_t_defined
70b2845f
UD
43# endif
44#endif
45
92777700 46/* This file defines `struct dirent'.
bfc04a9f 47
92777700
RM
48 It defines the macro `_DIRENT_HAVE_D_NAMLEN' iff there is a `d_namlen'
49 member that gives the length of `d_name'.
bfc04a9f 50
92777700 51 It defines the macro `_DIRENT_HAVE_D_RECLEN' iff there is a `d_reclen'
a1470b6f
RM
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.
c0e45674
UD
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.
a1470b6f 59 */
bfc04a9f 60
5107cf1d 61#include <bits/dirent.h>
28f540f4 62
ed9a38e2 63#if defined __USE_MISC && !defined d_fileno
c0e45674 64# define d_ino d_fileno /* Backward compatibility. */
28f540f4
RM
65#endif
66
92777700
RM
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
c0e45674
UD
82# define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
83# define _D_ALLOC_NAMLEN(d) (_D_EXACT_NAMLEN (d) + 1)
92777700 84#else
c0e45674
UD
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
a04549c1
JM
89# define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name \
90 : _D_EXACT_NAMLEN (d) + 1)
c0e45674 91# endif
92777700
RM
92#endif
93
94
498afc54 95#ifdef __USE_MISC
28f540f4
RM
96/* File types for `d_type'. */
97enum
98 {
99 DT_UNKNOWN = 0,
74015205 100# define DT_UNKNOWN DT_UNKNOWN
28f540f4 101 DT_FIFO = 1,
74015205 102# define DT_FIFO DT_FIFO
28f540f4 103 DT_CHR = 2,
74015205 104# define DT_CHR DT_CHR
28f540f4 105 DT_DIR = 4,
74015205 106# define DT_DIR DT_DIR
28f540f4 107 DT_BLK = 6,
74015205 108# define DT_BLK DT_BLK
28f540f4 109 DT_REG = 8,
74015205 110# define DT_REG DT_REG
28f540f4 111 DT_LNK = 10,
74015205 112# define DT_LNK DT_LNK
21f6a100 113 DT_SOCK = 12,
74015205 114# define DT_SOCK DT_SOCK
21f6a100
UD
115 DT_WHT = 14
116# define DT_WHT DT_WHT
28f540f4
RM
117 };
118
119/* Convert between stat structure types and directory types. */
c0e45674
UD
120# define IFTODT(mode) (((mode) & 0170000) >> 12)
121# define DTTOIF(dirtype) ((dirtype) << 12)
28f540f4
RM
122#endif
123
124
18926cf4
RM
125/* This is the data type of directory stream objects.
126 The actual structure is opaque to users. */
127typedef struct __dirstream DIR;
28f540f4 128
0e12ca02
SG
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. */
134extern int closedir (DIR *__dirp) __nonnull ((1));
135
28f540f4 136/* Open a directory stream on NAME.
2c008571
UD
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. */
0e12ca02
SG
141extern DIR *opendir (const char *__name) __nonnull ((1))
142 __attribute_malloc__ __attr_dealloc (closedir, 1);
28f540f4 143
77db439e 144#ifdef __USE_XOPEN2K8
1812d50b
UD
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. */
0e12ca02
SG
149extern DIR *fdopendir (int __fd)
150 __attribute_malloc__ __attr_dealloc (closedir, 1);
1812d50b
UD
151#endif
152
dfd2257a
UD
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
2c008571
UD
159 appropriate interface.
160
161 This function is a possible cancellation point and therefore not
162 marked with __THROW. */
dfd2257a 163#ifndef __USE_FILE_OFFSET64
b45ff182 164extern struct dirent *readdir (DIR *__dirp) __nonnull ((1));
dfd2257a 165#else
01cad722 166# ifdef __REDIRECT
b45ff182
UD
167extern struct dirent *__REDIRECT (readdir, (DIR *__dirp), readdir64)
168 __nonnull ((1));
01cad722
UD
169# else
170# define readdir readdir64
171# endif
dfd2257a
UD
172#endif
173
174#ifdef __USE_LARGEFILE64
b45ff182 175extern struct dirent64 *readdir64 (DIR *__dirp) __nonnull ((1));
dfd2257a 176#endif
28f540f4 177
acd7f096 178#ifdef __USE_POSIX
6d52618b 179/* Reentrant version of `readdir'. Return in RESULT a pointer to the
2c008571
UD
180 next entry.
181
182 This function is a possible cancellation point and therefore not
183 marked with __THROW. */
dfd2257a 184# ifndef __USE_FILE_OFFSET64
c1422e5b
UD
185extern int readdir_r (DIR *__restrict __dirp,
186 struct dirent *__restrict __entry,
b45ff182 187 struct dirent **__restrict __result)
7584a3f9 188 __nonnull ((1, 2, 3)) __attribute_deprecated__;
dfd2257a 189# else
01cad722 190# ifdef __REDIRECT
c1422e5b
UD
191extern int __REDIRECT (readdir_r,
192 (DIR *__restrict __dirp,
193 struct dirent *__restrict __entry,
2c008571 194 struct dirent **__restrict __result),
7584a3f9
FW
195 readdir64_r)
196 __nonnull ((1, 2, 3)) __attribute_deprecated__;
01cad722
UD
197# else
198# define readdir_r readdir64_r
199# endif
dfd2257a
UD
200# endif
201
202# ifdef __USE_LARGEFILE64
c1422e5b
UD
203extern int readdir64_r (DIR *__restrict __dirp,
204 struct dirent64 *__restrict __entry,
b45ff182 205 struct dirent64 **__restrict __result)
7584a3f9 206 __nonnull ((1, 2, 3)) __attribute_deprecated__;
dfd2257a 207# endif
c0e45674 208#endif /* POSIX or misc */
d68171ed 209
28f540f4 210/* Rewind DIRP to the beginning of the directory. */
b45ff182 211extern void rewinddir (DIR *__dirp) __THROW __nonnull ((1));
28f540f4 212
ed9a38e2 213#if defined __USE_MISC || defined __USE_XOPEN
40a55d20
UD
214# include <bits/types.h>
215
216/* Seek to position POS on DIRP. */
b45ff182 217extern void seekdir (DIR *__dirp, long int __pos) __THROW __nonnull ((1));
40a55d20
UD
218
219/* Return the current position of DIRP. */
b45ff182 220extern long int telldir (DIR *__dirp) __THROW __nonnull ((1));
40a55d20
UD
221#endif
222
acd7f096 223#ifdef __USE_XOPEN2K8
28f540f4 224
22a1292a 225/* Return the file descriptor used by DIRP. */
b45ff182 226extern int dirfd (DIR *__dirp) __THROW __nonnull ((1));
22a1292a 227
c0e45674
UD
228# if defined __OPTIMIZE__ && defined _DIR_dirfd
229# define dirfd(dirp) _DIR_dirfd (dirp)
230# endif
22a1292a 231
ed9a38e2 232# ifdef __USE_MISC
77db439e 233# ifndef MAXNAMLEN
28f540f4 234/* Get the definitions of the POSIX.1 limits. */
5107cf1d 235# include <bits/posix1_lim.h>
28f540f4
RM
236
237/* `MAXNAMLEN' is the BSD name for what POSIX calls `NAME_MAX'. */
77db439e
UD
238# ifdef NAME_MAX
239# define MAXNAMLEN NAME_MAX
240# else
241# define MAXNAMLEN 255
242# endif
c0e45674
UD
243# endif
244# endif
245
c0e45674
UD
246# define __need_size_t
247# include <stddef.h>
28f540f4 248
afd4eb37 249/* Scan the directory DIR, calling SELECTOR on each directory entry.
28f540f4
RM
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
c55fbd1e
UD
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. */
89a9e37b 256# ifndef __USE_FILE_OFFSET64
a784e502 257extern int scandir (const char *__restrict __dir,
c1422e5b 258 struct dirent ***__restrict __namelist,
a784e502
UD
259 int (*__selector) (const struct dirent *),
260 int (*__cmp) (const struct dirent **,
261 const struct dirent **))
b45ff182 262 __nonnull ((1, 2));
89a9e37b 263# else
01cad722
UD
264# ifdef __REDIRECT
265extern int __REDIRECT (scandir,
a784e502 266 (const char *__restrict __dir,
c1422e5b 267 struct dirent ***__restrict __namelist,
a784e502
UD
268 int (*__selector) (const struct dirent *),
269 int (*__cmp) (const struct dirent **,
270 const struct dirent **)),
b45ff182 271 scandir64) __nonnull ((1, 2));
01cad722
UD
272# else
273# define scandir scandir64
274# endif
89a9e37b
UD
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 **. */
a784e502 280extern int scandir64 (const char *__restrict __dir,
c1422e5b 281 struct dirent64 ***__restrict __namelist,
a784e502
UD
282 int (*__selector) (const struct dirent64 *),
283 int (*__cmp) (const struct dirent64 **,
284 const struct dirent64 **))
b45ff182 285 __nonnull ((1, 2));
89a9e37b 286# endif
28f540f4 287
c55fbd1e
UD
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
a784e502 295extern int scandirat (int __dfd, const char *__restrict __dir,
c55fbd1e 296 struct dirent ***__restrict __namelist,
a784e502
UD
297 int (*__selector) (const struct dirent *),
298 int (*__cmp) (const struct dirent **,
299 const struct dirent **))
c55fbd1e
UD
300 __nonnull ((2, 3));
301# else
302# ifdef __REDIRECT
303extern int __REDIRECT (scandirat,
a784e502 304 (int __dfd, const char *__restrict __dir,
c55fbd1e 305 struct dirent ***__restrict __namelist,
a784e502
UD
306 int (*__selector) (const struct dirent *),
307 int (*__cmp) (const struct dirent **,
308 const struct dirent **)),
c55fbd1e
UD
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 **. */
a784e502 317extern int scandirat64 (int __dfd, const char *__restrict __dir,
c55fbd1e 318 struct dirent64 ***__restrict __namelist,
a784e502
UD
319 int (*__selector) (const struct dirent64 *),
320 int (*__cmp) (const struct dirent64 **,
321 const struct dirent64 **))
c55fbd1e
UD
322 __nonnull ((2, 3));
323# endif
324
28f540f4 325/* Function to compare two `struct dirent's alphabetically. */
89a9e37b 326# ifndef __USE_FILE_OFFSET64
a784e502
UD
327extern int alphasort (const struct dirent **__e1,
328 const struct dirent **__e2)
b45ff182 329 __THROW __attribute_pure__ __nonnull ((1, 2));
89a9e37b 330# else
01cad722 331# ifdef __REDIRECT
f377d022 332extern int __REDIRECT_NTH (alphasort,
a784e502
UD
333 (const struct dirent **__e1,
334 const struct dirent **__e2),
b45ff182 335 alphasort64) __attribute_pure__ __nonnull ((1, 2));
01cad722
UD
336# else
337# define alphasort alphasort64
338# endif
89a9e37b
UD
339# endif
340
341# if defined __USE_GNU && defined __USE_LARGEFILE64
a784e502
UD
342extern int alphasort64 (const struct dirent64 **__e1,
343 const struct dirent64 **__e2)
b45ff182 344 __THROW __attribute_pure__ __nonnull ((1, 2));
89a9e37b 345# endif
acd7f096 346#endif /* Use XPG7. */
28f540f4
RM
347
348
ed9a38e2 349#ifdef __USE_MISC
28f540f4
RM
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. */
eee6b143 354# ifndef __USE_FILE_OFFSET64
c1422e5b
UD
355extern __ssize_t getdirentries (int __fd, char *__restrict __buf,
356 size_t __nbytes,
b45ff182
UD
357 __off_t *__restrict __basep)
358 __THROW __nonnull ((2, 4));
eee6b143
UD
359# else
360# ifdef __REDIRECT
f377d022
UD
361extern __ssize_t __REDIRECT_NTH (getdirentries,
362 (int __fd, char *__restrict __buf,
363 size_t __nbytes,
364 __off64_t *__restrict __basep),
b45ff182 365 getdirentries64) __nonnull ((2, 4));
eee6b143
UD
366# else
367# define getdirentries getdirentries64
e5cd813b 368# endif
eee6b143 369# endif
28f540f4 370
eee6b143 371# ifdef __USE_LARGEFILE64
c1422e5b
UD
372extern __ssize_t getdirentries64 (int __fd, char *__restrict __buf,
373 size_t __nbytes,
b45ff182
UD
374 __off64_t *__restrict __basep)
375 __THROW __nonnull ((2, 4));
eee6b143 376# endif
acd7f096 377#endif /* Use misc. */
77db439e
UD
378
379#ifdef __USE_GNU
380/* Function to compare two `struct dirent's by name & version. */
381# ifndef __USE_FILE_OFFSET64
a784e502
UD
382extern int versionsort (const struct dirent **__e1,
383 const struct dirent **__e2)
77db439e
UD
384 __THROW __attribute_pure__ __nonnull ((1, 2));
385# else
386# ifdef __REDIRECT
387extern int __REDIRECT_NTH (versionsort,
a784e502
UD
388 (const struct dirent **__e1,
389 const struct dirent **__e2),
77db439e
UD
390 versionsort64)
391 __attribute_pure__ __nonnull ((1, 2));
392# else
393# define versionsort versionsort64
394# endif
e5cd813b 395# endif
28f540f4 396
77db439e 397# ifdef __USE_LARGEFILE64
a784e502
UD
398extern int versionsort64 (const struct dirent64 **__e1,
399 const struct dirent64 **__e2)
77db439e
UD
400 __THROW __attribute_pure__ __nonnull ((1, 2));
401# endif
402#endif /* Use GNU. */
28f540f4
RM
403
404__END_DECLS
405
b8b3d5a1
FW
406#include <bits/dirent_ext.h>
407
28f540f4 408#endif /* dirent.h */