summaryrefslogtreecommitdiff
path: root/src/user/app/shell/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/app/shell/builtins.c')
-rw-r--r--src/user/app/shell/builtins.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/user/app/shell/builtins.c b/src/user/app/shell/builtins.c
index efc427d..6611002 100644
--- a/src/user/app/shell/builtins.c
+++ b/src/user/app/shell/builtins.c
@@ -1,5 +1,6 @@
#include "builtins.h"
#include "shell.h"
+#include <camellia/path.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -135,6 +136,40 @@ static void cmd_ls(int argc, char **argv) {
}
}
+static void cmd_rm(int argc, char **argv) {
+ if (argc < 2) {
+ eprintf("no arguments");
+ return;
+ }
+ const size_t buflen = PATH_MAX;
+ char *buf = malloc(buflen);
+ for (int i = 1; i < argc; i++) {
+ handle_t h;
+ long ret;
+ size_t abslen;
+ char *path = argv[i];
+ if (*path == '\0') {
+ eprintf("ignoring empty argument");
+ continue;
+ }
+ abslen = absolutepath(buf, path, buflen);
+ if (!abslen) {
+ eprintf("invalid path %s", path);
+ continue;
+ }
+ h = _syscall_open(buf, abslen - 1, 0);
+ if (h < 0) {
+ eprintf("couldn't open %s (err %u)", path, -h);
+ continue;
+ }
+ ret = _syscall_remove(h);
+ if (ret < 0) {
+ eprintf("couldn't remove %s (err %u)", path, -ret);
+ continue;
+ }
+ }
+}
+
static void cmd_sleep(int argc, char **argv) {
if (argc < 2) {
eprintf("no arguments");
@@ -177,6 +212,7 @@ struct builtin builtins[] = {
{"getsize", cmd_getsize},
{"hexdump", cmd_hexdump},
{"ls", cmd_ls},
+ {"rm", cmd_rm},
{"sleep", cmd_sleep},
{"touch", cmd_touch},
{"whitelist", cmd_whitelist},