diff options
author | dzwdz | 2023-08-14 18:51:07 +0200 |
---|---|---|
committer | dzwdz | 2023-08-14 18:51:07 +0200 |
commit | 642b5fb0007b64c77d186fcb018d571152ee1d47 (patch) | |
tree | 1c466461f3602d306be309a053edae558ef2568e /src/cmd/find/find.c | |
parent | 8050069c57b729c18c19b1a03ab6e4bf63b4735e (diff) |
reorganization: first steps
Diffstat (limited to 'src/cmd/find/find.c')
-rw-r--r-- | src/cmd/find/find.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/cmd/find/find.c b/src/cmd/find/find.c new file mode 100644 index 0000000..d473b82 --- /dev/null +++ b/src/cmd/find/find.c @@ -0,0 +1,55 @@ +#include <camellia/path.h> +#include <dirent.h> +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +void recurse(char *path) { + DIR *d = opendir(path); + if (!d) { + warn("couldn't open %s", path); + return; + } + for (;;) { + struct dirent *dent; + errno = 0; + dent = readdir(d); + if (!dent) { + if (errno) { + warn("when reading %s", path); + } + break; + } + 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'; + } + } + 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("/"); + } else { + for (int i = 1; i < argc; i++) + find(argv[i]); + } + return 0; +} |