recurse.c - ubase - suckless linux base utils | |
git clone git://git.suckless.org/ubase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
recurse.c (944B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <dirent.h> | |
3 #include <limits.h> | |
4 #include <stdio.h> | |
5 #include <stdlib.h> | |
6 #include <string.h> | |
7 #include <sys/stat.h> | |
8 #include <sys/types.h> | |
9 #include <unistd.h> | |
10 | |
11 #include "../util.h" | |
12 | |
13 void | |
14 recurse(const char *path, void (*fn)(const char *)) | |
15 { | |
16 char buf[PATH_MAX]; | |
17 struct dirent *d; | |
18 struct stat st; | |
19 DIR *dp; | |
20 | |
21 if (lstat(path, &st) == -1 || S_ISDIR(st.st_mode) == 0) | |
22 return; | |
23 | |
24 if (!(dp = opendir(path))) | |
25 eprintf("opendir %s:", path); | |
26 | |
27 while ((d = readdir(dp))) { | |
28 if (strcmp(d->d_name, ".") == 0 || | |
29 strcmp(d->d_name, "..") == 0) | |
30 continue; | |
31 if (strlcpy(buf, path, sizeof(buf)) >= sizeof(buf)) | |
32 eprintf("path too long\n"); | |
33 if (buf[strlen(buf) - 1] != '/') | |
34 if (strlcat(buf, "/", sizeof(buf)) >= sizeof(buf… | |
35 eprintf("path too long\n"); | |
36 if (strlcat(buf, d->d_name, sizeof(buf)) >= sizeof(buf)) | |
37 eprintf("path too long\n"); | |
38 fn(buf); | |
39 } | |
40 | |
41 closedir(dp); | |
42 } |