summaryrefslogtreecommitdiff
path: root/src/user/lib/unistd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/lib/unistd.c')
-rw-r--r--src/user/lib/unistd.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/user/lib/unistd.c b/src/user/lib/unistd.c
index f40b876..1a50c3e 100644
--- a/src/user/lib/unistd.c
+++ b/src/user/lib/unistd.c
@@ -22,10 +22,23 @@ _Noreturn void exit(int c) {
}
_Noreturn void _exit(int c) { exit(c); };
-// TODO unlink
int unlink(const char *path) {
- (void)path;
- errno = ENOSYS;
+ size_t len = strlen(path) + 1;
+ char *abspath = malloc(len);
+ if (!abspath) return -1;
+
+ size_t abslen = absolutepath(abspath, path, len);
+ if (abslen == 0) { errno = EINVAL; goto err; }
+
+ handle_t h = _syscall_open(abspath, abslen - 1, 0);
+ if (h < 0) { errno = -h; goto err; }
+
+ long ret = _syscall_remove(h);
+ if (ret < 0) { errno = -ret; goto err; }
+
+ return 0;
+err:
+ free(abspath);
return -1;
}