LibC/Kernel: Implement access
This commit is contained in:
parent
e5bb843059
commit
f0be4f86a6
|
@ -106,6 +106,7 @@ namespace Kernel
|
||||||
BAN::ErrorOr<long> sys_close(int fd);
|
BAN::ErrorOr<long> sys_close(int fd);
|
||||||
BAN::ErrorOr<long> sys_read(int fd, void* buffer, size_t count);
|
BAN::ErrorOr<long> sys_read(int fd, void* buffer, size_t count);
|
||||||
BAN::ErrorOr<long> sys_write(int fd, const void* buffer, size_t count);
|
BAN::ErrorOr<long> sys_write(int fd, const void* buffer, size_t count);
|
||||||
|
BAN::ErrorOr<long> sys_access(const char* path, int amode);
|
||||||
BAN::ErrorOr<long> sys_create(const char*, mode_t);
|
BAN::ErrorOr<long> sys_create(const char*, mode_t);
|
||||||
BAN::ErrorOr<long> sys_create_dir(const char*, mode_t);
|
BAN::ErrorOr<long> sys_create_dir(const char*, mode_t);
|
||||||
BAN::ErrorOr<long> sys_unlink(const char*);
|
BAN::ErrorOr<long> sys_unlink(const char*);
|
||||||
|
|
|
@ -784,6 +784,32 @@ namespace Kernel
|
||||||
return TRY(m_open_file_descriptors.write(fd, BAN::ByteSpan((uint8_t*)buffer, count)));
|
return TRY(m_open_file_descriptors.write(fd, BAN::ByteSpan((uint8_t*)buffer, count)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> Process::sys_access(const char* path, int amode)
|
||||||
|
{
|
||||||
|
int flags = 0;
|
||||||
|
if (amode & F_OK)
|
||||||
|
flags |= O_SEARCH;
|
||||||
|
if (amode & R_OK)
|
||||||
|
flags |= O_RDONLY;
|
||||||
|
if (amode & W_OK)
|
||||||
|
flags |= O_WRONLY;
|
||||||
|
if (amode & X_OK)
|
||||||
|
flags |= O_EXEC;
|
||||||
|
static_assert((O_RDONLY | O_WRONLY) == O_RDWR);
|
||||||
|
|
||||||
|
LockGuard _(m_process_lock);
|
||||||
|
TRY(validate_string_access(path));
|
||||||
|
|
||||||
|
auto credentials = m_credentials;
|
||||||
|
credentials.set_euid(credentials.ruid());
|
||||||
|
credentials.set_egid(credentials.rgid());
|
||||||
|
|
||||||
|
auto absolute_path = TRY(absolute_path_of(path));
|
||||||
|
|
||||||
|
TRY(VirtualFileSystem::get().file_from_absolute_path(credentials, absolute_path, flags));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_create(const char* path, mode_t mode)
|
BAN::ErrorOr<long> Process::sys_create(const char* path, mode_t mode)
|
||||||
{
|
{
|
||||||
LockGuard _(m_process_lock);
|
LockGuard _(m_process_lock);
|
||||||
|
|
|
@ -83,6 +83,7 @@ __BEGIN_DECLS
|
||||||
O(SYS_SETSOCKOPT, setsockopt) \
|
O(SYS_SETSOCKOPT, setsockopt) \
|
||||||
O(SYS_REALPATH, realpath) \
|
O(SYS_REALPATH, realpath) \
|
||||||
O(SYS_TTYNAME, ttyname) \
|
O(SYS_TTYNAME, ttyname) \
|
||||||
|
O(SYS_ACCESS, access) \
|
||||||
|
|
||||||
enum Syscall
|
enum Syscall
|
||||||
{
|
{
|
||||||
|
|
|
@ -496,3 +496,8 @@ char* ttyname(int fildes)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return storage;
|
return storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int access(const char* path, int amode)
|
||||||
|
{
|
||||||
|
return syscall(SYS_ACCESS, path, amode);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue