X-Git-Url: https://git.saurik.com/apple/libc.git/blobdiff_plain/9385eb3d10ebe5eb398c52040ec3dbfba9b0cdcf..28300737d9bfa684aac372729e0148b22c4ded2b:/include/dirent.h diff --git a/include/dirent.h b/include/dirent.h index ecdc13e..c8e0e0c 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -1,10 +1,8 @@ /* - * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000, 2002-2008 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * - * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved. - * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -61,71 +59,194 @@ #define _DIRENT_H_ /* - * The kernel defines the format of directory entries returned by - * the getdirentries(2) system call. + * The kernel defines the format of directory entries */ -#include +#include <_types.h> #include +#include +#include +#include /* __darwin_pthread_mutex_t */ -#ifdef _POSIX_SOURCE -typedef void * DIR; -#else - -#define d_ino d_fileno /* backward compatibility */ - -/* definitions for library routines operating on directories. */ -#define DIRBLKSIZ 1024 - -struct _telldir; /* see telldir.h */ +struct _telldir; /* forward reference */ /* structure describing an open directory. */ -typedef struct _dirdesc { - int dd_fd; /* file descriptor associated with directory */ - long dd_loc; /* offset in current buffer */ - long dd_size; /* amount of data returned by getdirentries */ - char *dd_buf; /* data buffer */ - int dd_len; /* size of data buffer */ - long dd_seek; /* magic cookie returned by getdirentries */ - long dd_rewind; /* magic cookie for rewinding */ - int dd_flags; /* flags for readdir */ - pthread_mutex_t dd_lock; /* for thread locking */ - struct _telldir *dd_td; /* telldir position recording */ +typedef struct { + int __dd_fd; /* file descriptor associated with directory */ + long __dd_loc; /* offset in current buffer */ + long __dd_size; /* amount of data returned */ + char *__dd_buf; /* data buffer */ + int __dd_len; /* size of data buffer */ + long __dd_seek; /* magic cookie returned */ + __unused long __padding; /* (__dd_rewind space left for bincompat) */ + int __dd_flags; /* flags for readdir */ + __darwin_pthread_mutex_t __dd_lock; /* for thread locking */ + struct _telldir *__dd_td; /* telldir position recording */ } DIR; -#define dirfd(dirp) ((dirp)->dd_fd) +#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL + +/* definitions for library routines operating on directories. */ +#define DIRBLKSIZ 1024 /* flags for opendir2 */ #define DTF_HIDEW 0x0001 /* hide whiteout entries */ #define DTF_NODUP 0x0002 /* don't return duplicate names */ #define DTF_REWIND 0x0004 /* rewind after reading union stack */ #define __DTF_READALL 0x0008 /* everything has been read */ +#define __DTF_SKIPREAD 0x0010 /* assume internal buffer is populated */ +#define __DTF_ATEND 0x0020 /* there's nothing more to read in the kernel */ -#ifndef NULL -#define NULL 0 -#endif - -#endif /* _POSIX_SOURCE */ +#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ #ifndef KERNEL -#include +__BEGIN_DECLS + +//Begin-Libc +#ifndef LIBC_ALIAS_CLOSEDIR +//End-Libc +int closedir(DIR *) __DARWIN_ALIAS(closedir); +//Begin-Libc +#else /* LIBC_ALIAS_CLOSEDIR */ +int closedir(DIR *) LIBC_ALIAS(closedir); +#endif /* !LIBC_ALIAS_CLOSEDIR */ +//End-Libc + +//Begin-Libc +#ifndef LIBC_ALIAS_OPENDIR +//End-Libc +DIR *opendir(const char *) __DARWIN_ALIAS_I(opendir); +//Begin-Libc +#else /* LIBC_ALIAS_OPENDIR */ +DIR *opendir(const char *) LIBC_ALIAS_I(opendir); +#endif /* !LIBC_ALIAS_OPENDIR */ +//End-Libc + +struct dirent *readdir(DIR *) __DARWIN_INODE64(readdir); +int readdir_r(DIR *, struct dirent *, struct dirent **) __DARWIN_INODE64(readdir_r); + +//Begin-Libc +#ifndef LIBC_ALIAS_REWINDDIR +//End-Libc +void rewinddir(DIR *) __DARWIN_ALIAS_I(rewinddir); +//Begin-Libc +#else /* LIBC_ALIAS_REWINDDIR */ +void rewinddir(DIR *) LIBC_ALIAS_I(rewinddir); +#endif /* !LIBC_ALIAS_REWINDDIR */ +//End-Libc + +//Begin-Libc +#ifndef LIBC_ALIAS_SEEKDIR +//End-Libc +void seekdir(DIR *, long) __DARWIN_ALIAS_I(seekdir); +//Begin-Libc +#else /* LIBC_ALIAS_SEEKDIR */ +void seekdir(DIR *, long) LIBC_ALIAS_I(seekdir); +#endif /* !LIBC_ALIAS_SEEKDIR */ +//End-Libc + +//Begin-Libc +#ifndef LIBC_ALIAS_TELLDIR +//End-Libc +long telldir(DIR *) __DARWIN_ALIAS_I(telldir); +//Begin-Libc +#else /* LIBC_ALIAS_TELLDIR */ +long telldir(DIR *) LIBC_ALIAS_I(telldir); +#endif /* !LIBC_ALIAS_TELLDIR */ +//End-Libc + +__END_DECLS + +/* Additional functionality provided by: + * POSIX.1-2008 + */ + +#if __DARWIN_C_LEVEL >= 200809L __BEGIN_DECLS -DIR *opendir(const char *); -struct dirent *readdir(DIR *); -void rewinddir(DIR *); -int closedir(DIR *); -#ifndef _POSIX_SOURCE -DIR *__opendir2(const char *, int); -long telldir(DIR *); -void seekdir(DIR *, long); + +//Begin-Libc +#ifndef LIBC_ALIAS_OPENDIR +//End-Libc +__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0) +DIR *fdopendir(int) __DARWIN_ALIAS_I(fdopendir); +//Begin-Libc +#else /* LIBC_ALIAS_OPENDIR */ +DIR *fdopendir(int) LIBC_ALIAS_I(fdopendir); +#endif /* !LIBC_ALIAS_OPENDIR */ +//End-Libc + +int alphasort(const struct dirent **, const struct dirent **) __DARWIN_INODE64(alphasort); + +#if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8) || (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0) +#include +#include +#define dirfd(dirp) ({ \ + DIR *_dirp = (dirp); \ + int ret = -1; \ + if (_dirp == NULL || _dirp->__dd_fd < 0) \ + errno = EINVAL; \ + else \ + ret = _dirp->__dd_fd; \ + ret; \ +}) +#else +int dirfd(DIR *dirp) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); +#endif + int scandir(const char *, struct dirent ***, - int (*)(struct dirent *), int (*)(const void *, const void *)); -int alphasort(const void *, const void *); -int getdirentries(int, char *, int, long *); -int readdir_r(DIR *, struct dirent *, struct dirent **); -#endif /* not POSIX */ + int (*)(const struct dirent *), int (*)(const struct dirent **, const struct dirent **)) __DARWIN_INODE64(scandir); +#ifdef __BLOCKS__ +#if __has_attribute(noescape) +#define __scandir_noescape __attribute__((__noescape__)) +#else +#define __scandir_noescape +#endif + +int scandir_b(const char *, struct dirent ***, + int (^)(const struct dirent *) __scandir_noescape, + int (^)(const struct dirent **, const struct dirent **) __scandir_noescape) + __DARWIN_INODE64(scandir_b) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2); +#endif /* __BLOCKS__ */ + +__END_DECLS +#endif /* __DARWIN_C_LEVEL >= 200809L */ + + +#if __DARWIN_C_LEVEL >= __DARWIN_C_FULL +__BEGIN_DECLS + +int getdirentries(int, char *, int, long *) + +//Begin-Libc +#ifndef __LIBC__ +//End-Libc +#if __DARWIN_64_BIT_INO_T +/* + * getdirentries() doesn't work when 64-bit inodes is in effect, so we + * generate a link error. + */ + __asm("_getdirentries_is_not_available_when_64_bit_inodes_are_in_effect") +#else /* !__DARWIN_64_BIT_INO_T */ + __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_6, __IPHONE_2_0,__IPHONE_2_0) +#endif /* __DARWIN_64_BIT_INO_T */ +//Begin-Libc +#endif /* !__LIBC__ */ +//End-Libc +; + +//Begin-Libc +#ifndef LIBC_ALIAS___OPENDIR2 +//End-Libc +DIR *__opendir2(const char *, int) __DARWIN_ALIAS_I(__opendir2); +//Begin-Libc +#else /* LIBC_ALIAS___OPENDIR2 */ +DIR *__opendir2(const char *, int) LIBC_ALIAS_I(__opendir2); +#endif /* !LIBC_ALIAS___OPENDIR2 */ +//End-Libc + __END_DECLS +#endif /* __DARWIN_C_LEVEL >= __DARWIN_C_FULL */ #endif /* !KERNEL */