diff options
Diffstat (limited to 'src/cmd/find.c')
-rw-r--r-- | src/cmd/find.c | 26 |
1 files changed, 8 insertions, 18 deletions
diff --git a/src/cmd/find.c b/src/cmd/find.c index d473b82..8f0352c 100644 --- a/src/cmd/find.c +++ b/src/cmd/find.c @@ -1,4 +1,3 @@ -#include <camellia/path.h> #include <dirent.h> #include <err.h> #include <errno.h> @@ -6,7 +5,7 @@ #include <stdlib.h> #include <string.h> -void recurse(char *path) { +void recurse(const char *path) { DIR *d = opendir(path); if (!d) { warn("couldn't open %s", path); @@ -25,31 +24,22 @@ void recurse(char *path) { printf("%s%s\n", path, dent->d_name); /* if the string ends with '/' */ if (strchr(dent->d_name, '\0')[-1] == '/') { - // TODO no overflow check - char *pend = strchr(path, '\0'); - strcpy(pend, dent->d_name); - recurse(path); - *pend = '\0'; + char *next; + if (asprintf(&next, "%s%s", path, dent->d_name) >= 0) { + recurse(next); + free(next); + } } } closedir(d); } -void find(const char *path) { - // TODO bound checking - // TODO or just implement asprintf() - char *buf = malloc(PATH_MAX); - memcpy(buf, path, strlen(path)+1); - recurse(buf); - free(buf); -} - int main(int argc, char **argv) { if (argc < 2) { - find("/"); + recurse("/"); } else { for (int i = 1; i < argc; i++) - find(argv[i]); + recurse(argv[i]); } return 0; } |