f759719138b3fe22a8f2aff5d1e07039cdf966e9
[libjh.git] / fs.c
1 HEADER #include <stdio.h>
2 HEADER #include <sys/types.h>
3 HEADER #include <dirent.h>
4
5 #include <errno.h>
6
7 // nonzero iterator exit code means cancel
8 HEADER typedef int dir_iterator(struct dirent *dent, void *data);
9 PUBLIC_FN int fdir_foreach(DIR *d, dir_iterator *iter, void *data) {
10   struct dirent de;
11   struct dirent *res;
12   while (1) {
13     int rd_res = readdir_r(d, &de, &res);
14     if (rd_res) return rd_res;
15     if (res == NULL) return 0;
16     int iter_res = iter(&de, data);
17     if (iter_res) return iter_res;
18   }
19 }
20
21 PUBLIC_FN int dir_foreach(char *path, dir_iterator *iter, void *data) {
22   DIR *d = opendir(path);
23   if (d == NULL) return 1;
24   int feach_res = fdir_foreach(d, iter, data);
25   int errno_ = errno;
26   closedir(d);
27   errno = errno_;
28   return feach_res;
29 }