recurse.c - smdev - suckless mdev | |
git clone git://git.suckless.org/smdev | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
recurse.c (716B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <dirent.h> | |
3 #include <errno.h> | |
4 #include <stdlib.h> | |
5 #include <string.h> | |
6 #include <unistd.h> | |
7 #include <sys/stat.h> | |
8 | |
9 #include "../util.h" | |
10 | |
11 void | |
12 recurse(const char *path, void (*fn)(const char *)) | |
13 { | |
14 char *cwd; | |
15 struct dirent *d; | |
16 struct stat st; | |
17 DIR *dp; | |
18 | |
19 if(lstat(path, &st) == -1 || !S_ISDIR(st.st_mode)) { | |
20 return; | |
21 } else if(!(dp = opendir(path))) { | |
22 eprintf("opendir %s:", path); | |
23 } | |
24 | |
25 cwd = agetcwd(); | |
26 if(chdir(path) == -1) | |
27 eprintf("chdir %s:", path); | |
28 | |
29 while((d = readdir(dp))) { | |
30 if(strcmp(d->d_name, ".") && strcmp(d->d_name, "..")) | |
31 fn(d->d_name); | |
32 } | |
33 | |
34 closedir(dp); | |
35 if(chdir(cwd) == -1) | |
36 eprintf("chdir %s:", cwd); | |
37 | |
38 free(cwd); | |
39 } | |
40 |