commit 4bdc7f18c524353b3216e8a0ce91663e3a68eb38 Author: Érico Nogueira Date: Mon May 17 23:19:26 2021 -0300 Initial commit. Can delete a sequence of files of directories in the command line, no recursion yet. Assumes remove(3) is fast and reasonable: unlink(); if (errno==EISDIR) rmdir(); diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ce8b0d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +erm diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..99b9393 --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +.PHONY: all + +all: erm diff --git a/erm.c b/erm.c new file mode 100644 index 0000000..5f3b283 --- /dev/null +++ b/erm.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include + +noreturn void usage(int s) +{ + puts("erm [-reh] [files]"); + exit(s); +} + +int main(int argc, char **argv) +{ + bool recursive = false; + bool stop_at_error = true; + + int opt; + while ((opt = getopt(argc, argv, "reh")) != -1) { + switch (opt) { + case 'r': + recursive = true; + break; + case 'e': + stop_at_error = false; + break; + case 'h': + usage(0); + default: + usage(1); + } + } + argc -= optind; + argv += optind; + + int rv = 0; + if (recursive) { + /* TODO: descend */ + } else { + for (int i = 0; i < argc; i++) { + char *path = argv[i]; + if (remove(path)) { + fprintf(stderr, "failed to remove '%s': %s\n", path, strerror(errno)); + if (stop_at_error) { + return 1; + } else { + rv = 1; + } + } + } + } + + return rv; +}