commit 4d71e9c860b1a03ccad3c4dff59b9816a116c354
parent 8bfb2debce084249194437fd0c92e5be69111b73
Author: evenfri <evenfri256@gmail.com>
Date: Tue, 11 Aug 2026 03:04:21 +0800
add rm (without rmdir)
Diffstat:
| M | mkdir.c | | | 4 | ++-- |
| M | mkfile | | | 1 | + |
| A | rm.c | | | 67 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 70 insertions(+), 2 deletions(-)
diff --git a/mkdir.c b/mkdir.c
@@ -34,7 +34,7 @@ size_t strcspn(const char *s1, const char *s2) {
int main(int argc, char *argv[]) {
if (argc < 2) {
- write(stdout, "using: mkdir [options] <path>\n", 30);
+ write(stderr, "using: mkdir [options] <path>\n", 30);
return 1;
}
@@ -73,7 +73,7 @@ int main(int argc, char *argv[]) {
}
} else {
int r = mkdir(path, 0777);
- if (r < 0 && errno != eexist)
+ if (r < 0)
return errno;
}
}
diff --git a/mkfile b/mkfile
@@ -15,6 +15,7 @@ targ = init \
sh \
touch \
mkdir \
+ rm \
<$PLAN9/src/mkmany
diff --git a/rm.c b/rm.c
@@ -0,0 +1,67 @@
+#include <libc.h>
+
+#define enoent 2
+#define enotdir 20
+#define eisdir 21
+
+#define dt_unknown 0
+#define dt_reg 8
+#define dt_dir 4
+
+int has_r;
+int has_f;
+
+int first;
+
+
+void rm_tree(char **argv) {
+ (void)argv;
+}
+
+void rm_file(char **argv) {
+ char *f;
+ int r;
+
+ while ((f = *argv++) != NULL) {
+ r = unlink(f);
+
+ if (r < 0) {
+ if (has_f && errno == enoent)
+ continue;
+ return;
+ }
+ }
+}
+
+int main(int argc, char *argv[]) {
+ if (argc < 2) {
+ write(stderr, "using: rm [options] <path>\n", 27);
+ return 1;
+ }
+
+ for (int i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-r") == 0) {
+ has_r = 1;
+ continue;
+ }
+ if (strcmp(argv[i], "-f") == 0) {
+ has_f = 1;
+ continue;
+ }
+ if (strcmp(argv[i], "-rf") == 0) {
+ has_r = 1;
+ has_f = 1;
+ continue;
+ }
+
+ first = i;
+ break;
+ }
+
+ if (has_r)
+ rm_tree(&argv[first]);
+ else
+ rm_file(&argv[first]);
+
+ return 0;
+}