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/jsh/builtin.c | 0 src/cmd/jsh/builtin.h | 0 src/cmd/ls/ls | Bin 0 -> 33920 bytes src/cmd/ls/ls.c | 6 ----- src/cmd/rm/makefile | 12 +++++++++ src/cmd/rm/rm | Bin 0 -> 34016 bytes src/cmd/rm/rm.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 81 insertions(+), 6 deletions(-) mode change 100644 => 100755 src/cmd/jsh/builtin.c mode change 100644 => 100755 src/cmd/jsh/builtin.h create mode 100755 src/cmd/ls/ls create mode 100755 src/cmd/rm/makefile create mode 100755 src/cmd/rm/rm create mode 100755 src/cmd/rm/rm.c diff --git a/src/cmd/jsh/builtin.c b/src/cmd/jsh/builtin.c old mode 100644 new mode 100755 diff --git a/src/cmd/jsh/builtin.h b/src/cmd/jsh/builtin.h old mode 100644 new mode 100755 diff --git a/src/cmd/ls/ls b/src/cmd/ls/ls new file mode 100755 index 0000000..836d3d8 Binary files /dev/null and b/src/cmd/ls/ls differ diff --git a/src/cmd/ls/ls.c b/src/cmd/ls/ls.c index a937457..d253772 100755 --- a/src/cmd/ls/ls.c +++ b/src/cmd/ls/ls.c @@ -25,12 +25,6 @@ int main(int argc, char **argv) return -1; } dirwalk(dp); - } else if (argc == 2) { - if ((dp = opendir(argv[1])) == NULL) { - perror("ls"); - return -1; - } - dirwalk(dp); } else { while (--argc > 0 && !ferror(stdout)) { errno = 0; diff --git a/src/cmd/rm/makefile b/src/cmd/rm/makefile new file mode 100755 index 0000000..8b9afda --- /dev/null +++ b/src/cmd/rm/makefile @@ -0,0 +1,12 @@ +CFLAGS=-Wall -Werror + +build: rm + @cp rm $(PROROOT)/build/bin/rm + +rm: rm.c + $(CC) $(CFLAGS) -o rm rm.c + +clean: + @rm -r rm + +.PHONY: build clean diff --git a/src/cmd/rm/rm b/src/cmd/rm/rm new file mode 100755 index 0000000..886e88d Binary files /dev/null and b/src/cmd/rm/rm differ 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