zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

blob 39457fdd (12616B) - Raw


      1 /* Copyright (C) 1991-2025 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  */