From 4a76a5825c04e9872bddfc23e3e8ade2fa6c0160 Mon Sep 17 00:00:00 2001 From: Jacob McDonnell Date: Wed, 6 Mar 2024 17:38:50 -0500 Subject: Basic implementation of rm --- src/cmd/rm/rm.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 src/cmd/rm/rm.c (limited to 'src/cmd/rm/rm.c') diff --git a/src/cmd/rm/rm.c b/src/cmd/rm/rm.c new file mode 100755 index 0000000..b034b36 --- /dev/null +++ b/src/cmd/rm/rm.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include + +bool dflag = false, + iflag = false, + fflag = false; + +int main(int argc, char *argv[]) { + char arg = 0; + while ((arg = getopt(argc, argv, "dfi")) != -1) { + switch (arg) { + case 'd': + dflag = true; + break; + case 'f': + fflag = true; + iflag = false; + break; + case 'i': + iflag = true; + fflag = false; + break; + default: + printf("usage: rm [-f | -i] [-d] file ...\n"); + break; + } + } + while (--argc > 0) { + if ((*++argv)[0] == '-') { + continue; + } + if (iflag) { + printf("remove %s? [y/N] ", *argv); + char c = getchar(); + if (c != 'Y' && c != 'y') { + continue; + } + } + struct stat sbuf; + if (stat(*argv, &sbuf) != 0) { + perror("rm"); + continue; + } + if (S_ISDIR(sbuf.st_mode) && dflag) { + if (rmdir(*argv) != 0) { + perror("rm"); + } + } else if (S_ISDIR(sbuf.st_mode)) { + errno = EISDIR; + char s[] = "rm: "; + char *sp = (char *)malloc(sizeof(s) + sizeof(*argv) + 1); + strncat(sp, s, strlen(sp) - 1); + strncat(sp, *argv, strlen(sp)); + perror(sp); + free((void *)sp); + sp = NULL; + } else { + if (unlink(*argv) != 0) { + perror("rm"); + } + } + } + return 0; +} -- cgit v1.2.3