diff options
author | Christian Neukirchen <chneukirchen@gmail.com> | 2016-07-20 19:25:00 +0200 |
---|---|---|
committer | Christian Neukirchen <chneukirchen@gmail.com> | 2016-07-20 19:25:00 +0200 |
commit | 31b4db3580bbc87f425e8024f9850a8b0c93c541 (patch) | |
tree | bc3ca1ebfb293d2eb64a064862bf272afdb4f9c1 | |
parent | 8672f495c3da5399dcceea3c83f4c9b8a105a199 (diff) | |
download | mblaze-31b4db3580bbc87f425e8024f9850a8b0c93c541.tar.gz mblaze-31b4db3580bbc87f425e8024f9850a8b0c93c541.tar.xz mblaze-31b4db3580bbc87f425e8024f9850a8b0c93c541.zip |
seq: iterate over dirs and cur/ of maildirs
-rw-r--r-- | seq.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/seq.c b/seq.c index 55dfd32..4c26f4d 100644 --- a/seq.c +++ b/seq.c @@ -2,6 +2,7 @@ #include <sys/stat.h> #include <sys/types.h> +#include <dirent.h> #include <errno.h> #include <fcntl.h> #include <limits.h> @@ -294,6 +295,40 @@ blaze822_seq_next(char *map, char *range, struct blaze822_seq_iter *iter) return r; } +static void +iterfile(char *dir, void (*cb)(char *)) +{ + DIR *fd, *fd2; + struct dirent *d; + + fd = opendir(dir); + if (!fd) { + if (errno == ENOTDIR) + cb(dir); + return; + } + + char sub[PATH_MAX]; + snprintf(sub, sizeof sub, "%s/cur", dir); + fd2 = opendir(sub); + if (fd2) { + closedir(fd); + fd = fd2; + } + + while ((d = readdir(fd))) { + if (d->d_type != DT_REG && d->d_type != DT_UNKNOWN) + continue; + if (d->d_name[0] == '.') + continue; + if (fd2) + snprintf(sub, sizeof sub, "%s/cur/%s", dir, d->d_name); + else + snprintf(sub, sizeof sub, "%s/%s", dir, d->d_name); + cb(sub); + } + closedir(fd); +} int blaze822_loop(int argc, char *argv[], void (*cb)(char *)) @@ -319,7 +354,7 @@ blaze822_loop(int argc, char *argv[], void (*cb)(char *)) int j = 0; for (i = 0; i < argc; i++) { if (strchr(argv[i], '/')) { // a file name - cb(argv[i]); + iterfile(argv[i], cb); j++; } else { while ((line = blaze822_seq_next(map, argv[i], &iter))) { |