aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/path.h2
-rw-r--r--lib/path.c21
2 files changed, 23 insertions, 0 deletions
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.