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