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