File: /usr/include/dirent.h

1     /* Copyright (C) 1991-1999, 2000 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 Library General Public License as
6        published by the Free Software Foundation; either version 2 of the
7        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        Library General Public License for more details.
13     
14        You should have received a copy of the GNU Library General Public
15        License along with the GNU C Library; see the file COPYING.LIB.  If not,
16        write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17        Boston, MA 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
35     typedef __ino_t ino_t;
36     #  else
37     typedef __ino64_t ino_t;
38     #  endif
39     #  define __ino_t_defined
40     # endif
41     # if defined __USE_LARGEFILE64 && !defined __ino64_t_defined
42     typedef __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'.  */
98     enum
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.  */
128     typedef 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     extern DIR *opendir (__const char *__name) __THROW;
133     
134     /* Close the directory stream DIRP.
135        Return 0 if successful, -1 if not.  */
136     extern int closedir (DIR *__dirp) __THROW;
137     
138     /* Read a directory entry from DIRP.  Return a pointer to a `struct
139        dirent' describing the entry, or NULL for EOF or error.  The
140        storage returned may be overwritten by a later readdir call on the
141        same DIR stream.
142     
143        If the Large File Support API is selected we have to use the
144        appropriate interface.  */
145     #ifndef __USE_FILE_OFFSET64
146     extern struct dirent *readdir (DIR *__dirp) __THROW;
147     #else
148     # ifdef __REDIRECT
149     extern struct dirent *__REDIRECT (readdir, (DIR *__dirp) __THROW, readdir64);
150     # else
151     #  define readdir readdir64
152     # endif
153     #endif
154     
155     #ifdef __USE_LARGEFILE64
156     extern struct dirent64 *readdir64 (DIR *__dirp) __THROW;
157     #endif
158     
159     #if defined __USE_POSIX || defined __USE_MISC
160     /* Reentrant version of `readdir'.  Return in RESULT a pointer to the
161        next entry.  */
162     # ifndef __USE_FILE_OFFSET64
163     extern int readdir_r (DIR *__restrict __dirp,
164     		      struct dirent *__restrict __entry,
165     		      struct dirent **__restrict __result) __THROW;
166     # else
167     #  ifdef __REDIRECT
168     extern int __REDIRECT (readdir_r,
169     		       (DIR *__restrict __dirp,
170     			struct dirent *__restrict __entry,
171     			struct dirent **__restrict __result) __THROW,
172     		       readdir64_r);
173     #  else
174     #   define readdir_r readdir64_r
175     #  endif
176     # endif
177     
178     # ifdef __USE_LARGEFILE64
179     extern int readdir64_r (DIR *__restrict __dirp,
180     			struct dirent64 *__restrict __entry,
181     			struct dirent64 **__restrict __result) __THROW;
182     # endif
183     #endif	/* POSIX or misc */
184     
185     /* Rewind DIRP to the beginning of the directory.  */
186     extern void rewinddir (DIR *__dirp) __THROW;
187     
188     #if defined __USE_BSD || defined __USE_MISC || defined __USE_XOPEN
189     # include <bits/types.h>
190     
191     /* Seek to position POS on DIRP.  */
192     extern void seekdir (DIR *__dirp, long int __pos) __THROW;
193     
194     /* Return the current position of DIRP.  */
195     extern long int telldir (DIR *__dirp) __THROW;
196     #endif
197     
198     #if defined __USE_BSD || defined __USE_MISC
199     
200     /* Return the file descriptor used by DIRP.  */
201     extern int dirfd (DIR *__dirp) __THROW;
202     
203     # if defined __OPTIMIZE__ && defined _DIR_dirfd
204     #  define dirfd(dirp)	_DIR_dirfd (dirp)
205     # endif
206     
207     # ifndef MAXNAMLEN
208     /* Get the definitions of the POSIX.1 limits.  */
209     #  include <bits/posix1_lim.h>
210     
211     /* `MAXNAMLEN' is the BSD name for what POSIX calls `NAME_MAX'.  */
212     #  ifdef NAME_MAX
213     #   define MAXNAMLEN	NAME_MAX
214     #  else
215     #   define MAXNAMLEN	255
216     #  endif
217     # endif
218     
219     # define __need_size_t
220     # include <stddef.h>
221     
222     /* Scan the directory DIR, calling SELECTOR on each directory entry.
223        Entries for which SELECT returns nonzero are individually malloc'd,
224        sorted using qsort with CMP, and collected in a malloc'd array in
225        *NAMELIST.  Returns the number of entries selected, or -1 on error.  */
226     # ifndef __USE_FILE_OFFSET64
227     extern int scandir (__const char *__restrict __dir,
228     		    struct dirent ***__restrict __namelist,
229     		    int (*__selector) (__const struct dirent *),
230     		    int (*__cmp) (__const void *, __const void *)) __THROW;
231     # else
232     #  ifdef __REDIRECT
233     extern int __REDIRECT (scandir,
234     		       (__const char *__restrict __dir,
235     			struct dirent ***__restrict __namelist,
236     			int (*__selector) (__const struct dirent *),
237     			int (*__cmp) (__const void *, __const void *)) __THROW,
238     		       scandir64);
239     #  else
240     #   define scandir scandir64
241     #  endif
242     # endif
243     
244     # if defined __USE_GNU && defined __USE_LARGEFILE64
245     /* This function is like `scandir' but it uses the 64bit dirent structure.
246        Please note that the CMP function must now work with struct dirent64 **.  */
247     extern int scandir64 (__const char *__restrict __dir,
248     		      struct dirent64 ***__restrict __namelist,
249     		      int (*__selector) (__const struct dirent64 *),
250     		      int (*__cmp) (__const void *, __const void *)) __THROW;
251     # endif
252     
253     /* Function to compare two `struct dirent's alphabetically.  */
254     # ifndef __USE_FILE_OFFSET64
255     extern int alphasort (__const void *__e1, __const void *__e2)
256          __THROW __attribute_pure__;
257     # else
258     #  ifdef __REDIRECT
259     extern int __REDIRECT (alphasort,
260     		       (__const void *__e1, __const void *__e2)
261     		       __THROW,
262     		       alphasort64) __attribute_pure__;
263     #  else
264     #   define alphasort alphasort64
265     #  endif
266     # endif
267     
268     # if defined __USE_GNU && defined __USE_LARGEFILE64
269     extern int alphasort64 (__const void *__e1, __const void *__e2)
270          __THROW __attribute_pure__;
271     # endif
272     
273     # ifdef __USE_GNU
274     /* Function to compare two `struct dirent's by name & version.  */
275     #  ifndef __USE_FILE_OFFSET64
276     extern int versionsort (__const void *__e1, __const void *__e2)
277          __THROW __attribute_pure__;
278     #  else
279     #   ifdef __REDIRECT
280     extern int __REDIRECT (versionsort,
281     		       (__const void *__e1, __const void *__e2)
282     		       __THROW,
283     		       versionsort64) __attribute_pure__;
284     #   else
285     #    define versionsort versionsort64
286     #   endif
287     #  endif
288     
289     #  ifdef __USE_LARGEFILE64
290     extern int versionsort64 (__const void *__e1, __const void *__e2)
291          __THROW __attribute_pure__;
292     #  endif
293     # endif
294     
295     /* Read directory entries from FD into BUF, reading at most NBYTES.
296        Reading starts at offset *BASEP, and *BASEP is updated with the new
297        position after reading.  Returns the number of bytes read; zero when at
298        end of directory; or -1 for errors.  */
299     # ifndef __USE_FILE_OFFSET64
300     extern __ssize_t getdirentries (int __fd, char *__restrict __buf,
301     				size_t __nbytes,
302     				__off_t *__restrict __basep) __THROW;
303     # else
304     #  ifdef __REDIRECT
305     extern __ssize_t __REDIRECT (getdirentries,
306     			     (int __fd, char *__restrict __buf,
307     			      size_t __nbytes,
308     			      __off64_t *__restrict __basep) __THROW,
309     			     getdirentries64);
310     #  else
311     #   define getdirentries getdirentries64
312     #  endif
313     # endif
314     
315     # ifdef __USE_LARGEFILE64
316     extern __ssize_t getdirentries64 (int __fd, char *__restrict __buf,
317     				  size_t __nbytes,
318     				  __off64_t *__restrict __basep) __THROW;
319     # endif
320     
321     #endif /* Use BSD or misc.  */
322     
323     __END_DECLS
324     
325     #endif /* dirent.h  */
326