From ae838009d24b411203ee5e43c0a81d658dda2722 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 8 Sep 2021 13:44:20 +0200 Subject: [PATCH] lib/path: add ul_path_next_dirent() Signed-off-by: Karel Zak --- include/path.h | 2 ++ lib/path.c | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/path.h b/include/path.h index 3ce70c40b2..22cd544815 100644 --- a/include/path.h +++ b/include/path.h @@ -128,6 +128,8 @@ int ul_path_count_dirents(struct path_cxt *pc, const char *path); int ul_path_countf_dirents(struct path_cxt *pc, const char *path, ...) __attribute__ ((__format__ (__printf__, 2, 3))); +int ul_path_next_dirent(struct path_cxt *pc, DIR **sub, const char *dirname, struct dirent **d); + FILE *ul_prefix_fopen(const char *prefix, const char *path, const char *mode); diff --git a/lib/path.c b/lib/path.c index cf3a33e046..0d357966f3 100644 --- a/lib/path.c +++ b/lib/path.c @@ -968,6 +968,27 @@ int ul_path_countf_dirents(struct path_cxt *pc, const char *path, ...) return !p ? -errno : ul_path_count_dirents(pc, p); } +/* first call (when @sub is NULL) opens the directory, last call closes the diretory */ +int ul_path_next_dirent(struct path_cxt *pc, DIR **sub, const char *dirname, struct dirent **d) +{ + if (!pc || !sub || !d) + return -EINVAL; + + if (!*sub) { + *sub = ul_path_opendir(pc, dirname); + if (!*sub) + return -errno; + } + + *d = xreaddir(*sub); + if (*d) + return 0; + + closedir(*sub); + *sub = NULL; + return 1; +} + /* * Like fopen() but, @path is always prefixed by @prefix. This function is * useful in case when ul_path_* API is overkill. -- 2.47.2