glibc (2.38)

(root)/
include/
dirent.h
       1  /* Copyright (C) 1991-2023 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  */