diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2024-03-06 17:38:50 -0500 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2024-03-06 17:38:50 -0500 |
| commit | 4a76a5825c04e9872bddfc23e3e8ade2fa6c0160 (patch) | |
| tree | a4cc52398ca6f03e0d71ececbc8ac7502389cb81 /src/cmd/rm/rm.c | |
| parent | db994e0cd9d0ecaf6cf30d88683a072005226563 (diff) | |
Basic implementation of rm
Diffstat (limited to 'src/cmd/rm/rm.c')
| -rwxr-xr-x | src/cmd/rm/rm.c | 69 |
1 files changed, 69 insertions, 0 deletions
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 <unistd.h> +#include <stdio.h> +#include <stdbool.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <errno.h> + +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; +} |
