diff options
author | dzwdz | 2022-08-28 12:33:36 +0200 |
---|---|---|
committer | dzwdz | 2022-08-28 12:33:36 +0200 |
commit | c43b0ac7672b0d8fce8b1ea0a0dbe4383d60485e (patch) | |
tree | 6f25808cf0b30141349b55ccbbcb521669d53852 /src/user/lib | |
parent | 99e59fccdd98c22e91c0050e0c4e7c5742bdb341 (diff) |
user/libc: unlink()
Diffstat (limited to 'src/user/lib')
-rw-r--r-- | src/user/lib/unistd.c | 19 |
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; } |