1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 08:57:47 +00:00

Kernel+LibC+LibCore: Implement the unlinkat(2) syscall

This commit is contained in:
sin-ack 2022-02-10 11:30:33 +00:00 committed by Brian Gianforcaro
parent a5514fece9
commit bc7c8879c5
7 changed files with 31 additions and 6 deletions

View file

@ -46,6 +46,7 @@ extern "C" {
#define AT_FDCWD -100
#define AT_SYMLINK_NOFOLLOW 0x100
#define AT_REMOVEDIR 0x200
struct flock {
short l_type;

View file

@ -354,7 +354,7 @@ public:
ErrorOr<FlatPtr> sys$times(Userspace<tms*>);
ErrorOr<FlatPtr> sys$utime(Userspace<char const*> pathname, size_t path_length, Userspace<const struct utimbuf*>);
ErrorOr<FlatPtr> sys$link(Userspace<Syscall::SC_link_params const*>);
ErrorOr<FlatPtr> sys$unlink(Userspace<char const*> pathname, size_t path_length);
ErrorOr<FlatPtr> sys$unlink(int dirfd, Userspace<char const*> pathname, size_t path_length, int flags);
ErrorOr<FlatPtr> sys$symlink(Userspace<Syscall::SC_symlink_params const*>);
ErrorOr<FlatPtr> sys$rmdir(Userspace<char const*> pathname, size_t path_length);
ErrorOr<FlatPtr> sys$mount(Userspace<Syscall::SC_mount_params const*>);

View file

@ -10,12 +10,29 @@
namespace Kernel {
ErrorOr<FlatPtr> Process::sys$unlink(Userspace<char const*> user_path, size_t path_length)
ErrorOr<FlatPtr> Process::sys$unlink(int dirfd, Userspace<char const*> user_path, size_t path_length, int flags)
{
VERIFY_NO_PROCESS_BIG_LOCK(this)
TRY(require_promise(Pledge::cpath));
auto path = TRY(get_syscall_path_argument(user_path, path_length));
TRY(VirtualFileSystem::the().unlink(path->view(), current_directory()));
if (flags & ~AT_REMOVEDIR)
return Error::from_errno(EINVAL);
RefPtr<Custody> base;
if (dirfd == AT_FDCWD) {
base = current_directory();
} else {
auto base_description = TRY(open_file_description(dirfd));
if (!base_description->custody())
return Error::from_errno(EINVAL);
base = base_description->custody();
}
if (flags & AT_REMOVEDIR)
TRY(VirtualFileSystem::the().rmdir(path->view(), *base));
else
TRY(VirtualFileSystem::the().unlink(path->view(), *base));
return 0;
}