mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-14 01:04:38 +03:00
63760603f3
This modifies sys$chown to allow specifying whether or not to follow symlinks and in which directory. This was then used to implement lchown and fchownat in LibC and LibCore.
45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <AK/NonnullRefPtrVector.h>
|
|
#include <Kernel/FileSystem/Custody.h>
|
|
#include <Kernel/FileSystem/OpenFileDescription.h>
|
|
#include <Kernel/Process.h>
|
|
|
|
namespace Kernel {
|
|
|
|
ErrorOr<FlatPtr> Process::sys$fchown(int fd, UserID uid, GroupID gid)
|
|
{
|
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
|
|
TRY(require_promise(Pledge::chown));
|
|
auto description = TRY(fds().open_file_description(fd));
|
|
TRY(description->chown(uid, gid));
|
|
return 0;
|
|
}
|
|
|
|
ErrorOr<FlatPtr> Process::sys$chown(Userspace<const Syscall::SC_chown_params*> user_params)
|
|
{
|
|
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
|
|
TRY(require_promise(Pledge::chown));
|
|
auto params = TRY(copy_typed_from_user(user_params));
|
|
auto path = TRY(get_syscall_path_argument(params.path));
|
|
|
|
RefPtr<Custody> base;
|
|
if (params.dirfd == AT_FDCWD) {
|
|
base = current_directory();
|
|
} else {
|
|
auto base_description = TRY(fds().open_file_description(params.dirfd));
|
|
if (!base_description->custody())
|
|
return EINVAL;
|
|
base = base_description->custody();
|
|
}
|
|
|
|
TRY(VirtualFileSystem::the().chown(path->view(), params.uid, params.gid, *base, params.follow_symlinks ? 0 : O_NOFOLLOW_NOERROR));
|
|
return 0;
|
|
}
|
|
|
|
}
|