From 4bdc7f18c524353b3216e8a0ce91663e3a68eb38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Nogueira?= Date: Mon, 17 May 2021 23:19:26 -0300 Subject: [PATCH] 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(); --- .gitignore | 1 + Makefile | 3 +++ erm.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 erm.c 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; +}