diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2024-05-17 17:58:27 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2024-05-17 18:00:09 -0400 |
commit | 8fbfb0b973b1ff8307f7c29e6e8facb7e0f72ea0 (patch) | |
tree | 316b3fb074a6d063e1868cfe98ca9b97af0e4262 /src | |
parent | cf9230659e8d64e95209a4d57cbda8a474049ddb (diff) | |
download | bfs-8fbfb0b973b1ff8307f7c29e6e8facb7e0f72ea0.tar.xz |
dir: Add support for posix_getdents()
This will be added to the next POSIX standard, and is already
implemented in musl.
Link: https://www.austingroupbugs.net/view.php?id=697
Link: https://git.musl-libc.org/cgit/musl/commit/?id=1b0d48517f816e98f19111df82f32bfc1608ecec
Diffstat (limited to 'src')
-rw-r--r-- | src/dir.c | 16 |
1 files changed, 12 insertions, 4 deletions
@@ -25,7 +25,13 @@ static ssize_t bfs_getdents(int fd, void *buf, size_t size) { sanitize_uninit(buf, size); -#if BFS_HAS_GETDENTS +#if BFS_HAS_POSIX_GETDENTS + int flags = 0; +# ifdef DT_FORCE_TYPE + flags |= DT_FORCE_TYPE; +# endif + ssize_t ret = posix_getdents(fd, buf, size, flags); +#elif BFS_HAS_GETDENTS ssize_t ret = getdents(fd, buf, size); #elif BFS_HAS_GETDENTS64 ssize_t ret = getdents64(fd, buf, size); @@ -44,11 +50,13 @@ static ssize_t bfs_getdents(int fd, void *buf, size_t size) { #endif // BFS_USE_GETDENTS -#if BFS_USE_GETDENTS && !BFS_HAS_GETDENTS /** Directory entry type for bfs_getdents() */ -typedef struct dirent64 sys_dirent; -#else +#if !BFS_USE_GETDENTS || BFS_HAS_GETDENTS typedef struct dirent sys_dirent; +#elif BFS_HAS_POSIX_GETDENTS +typedef struct posix_dent sys_dirent; +#else +typedef struct dirent64 sys_dirent; #endif enum bfs_type bfs_mode_to_type(mode_t mode) { |