aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/gen/scandir.c
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2022-08-23 03:30:06 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2022-08-24 19:26:00 +0000
commit9fb8e8eede5b48eda7dc39f61d815595c14e5752 (patch)
tree3c187b06f88c87dbed37b52d1dad10a699edcd9f /lib/libc/gen/scandir.c
parentcb6e97f4dae6d0b631b65f23baf2d4c67120f672 (diff)
downloadsrc-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.c21
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().