diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2022-08-23 03:30:06 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2022-08-24 19:26:00 +0000 |
commit | 9fb8e8eede5b48eda7dc39f61d815595c14e5752 (patch) | |
tree | 3c187b06f88c87dbed37b52d1dad10a699edcd9f /lib/libc/gen/scandir.c | |
parent | cb6e97f4dae6d0b631b65f23baf2d4c67120f672 (diff) | |
download | src-9fb8e8eede5b48eda7dc39f61d815595c14e5752.tar.gz src-9fb8e8eede5b48eda7dc39f61d815595c14e5752.zip |
libc: add scandirat(3)
Reviewed by: emaste, imp, kevans, markj, Aymeric Wibo <obiwac@gmail.com>
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D36301
Diffstat (limited to 'lib/libc/gen/scandir.c')
-rw-r--r-- | lib/libc/gen/scandir.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/libc/gen/scandir.c b/lib/libc/gen/scandir.c index 4cfc823e4f94..3a891b0ad3f2 100644 --- a/lib/libc/gen/scandir.c +++ b/lib/libc/gen/scandir.c @@ -42,8 +42,10 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" #include <dirent.h> +#include <fcntl.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "un-namespace.h" #ifdef I_AM_SCANDIR_B @@ -159,6 +161,25 @@ scandir(const char *dirname, struct dirent ***namelist, } #ifndef I_AM_SCANDIR_B +int +scandirat(int dirfd, const char *dirname, struct dirent ***namelist, + int (*select)(const struct dirent *), int (*dcomp)(const struct dirent **, + const struct dirent **)) +{ + DIR *dirp; + int fd; + + fd = _openat(dirfd, dirname, O_RDONLY | O_DIRECTORY | O_CLOEXEC); + if (fd == -1) + return (-1); + dirp = fdopendir(fd); + if (dirp == NULL) { + _close(fd); + return (-1); + } + return (scandir_dirp(dirp, namelist, select, dcomp)); +} + /* * Alphabetic order comparison routine for those who want it. * POSIX 2008 requires that alphasort() uses strcoll(). |