Kernel: Add SYS_OPENAT

This commit is contained in:
Bananymous 2023-06-11 03:27:56 +03:00
parent 91f812e17f
commit 5aed186827
5 changed files with 48 additions and 14 deletions

View File

@ -58,6 +58,7 @@ namespace Kernel
BAN::ErrorOr<void> setenvp(char** envp); BAN::ErrorOr<void> setenvp(char** envp);
BAN::ErrorOr<int> open(BAN::StringView, int); BAN::ErrorOr<int> open(BAN::StringView, int);
BAN::ErrorOr<int> openat(int, BAN::StringView, int);
BAN::ErrorOr<void> close(int fd); BAN::ErrorOr<void> close(int fd);
BAN::ErrorOr<size_t> read(int fd, void* buffer, size_t count); BAN::ErrorOr<size_t> read(int fd, void* buffer, size_t count);
BAN::ErrorOr<size_t> write(int fd, const void* buffer, size_t count); BAN::ErrorOr<size_t> write(int fd, const void* buffer, size_t count);

View File

@ -469,6 +469,22 @@ namespace Kernel
return fd; return fd;
} }
BAN::ErrorOr<int> Process::openat(int fd, BAN::StringView path, int flags)
{
BAN::String absolute_path;
{
LockGuard _(m_lock);
TRY(validate_fd(fd));
TRY(absolute_path.append(open_file_description(fd).path));
}
TRY(absolute_path.push_back('/'));
TRY(absolute_path.append(path));
return open(absolute_path, flags);
}
BAN::ErrorOr<void> Process::close(int fd) BAN::ErrorOr<void> Process::close(int fd)
{ {
LockGuard _(m_lock); LockGuard _(m_lock);

View File

@ -49,6 +49,14 @@ namespace Kernel
return res.value(); return res.value();
} }
int sys_openat(int fd, const char* path, int oflags)
{
auto res = Process::current().openat(fd, path, oflags);
if (res.is_error())
return -res.error().get_error_code();
return res.value();
}
long sys_alloc(size_t bytes) long sys_alloc(size_t bytes)
{ {
auto res = Process::current().allocate(bytes); auto res = Process::current().allocate(bytes);
@ -187,6 +195,9 @@ namespace Kernel
case SYS_OPEN: case SYS_OPEN:
ret = sys_open((const char*)arg1, (int)arg2); ret = sys_open((const char*)arg1, (int)arg2);
break; break;
case SYS_OPENAT:
ret = sys_openat((int)arg1, (const char*)arg2, (int)arg3);
break;
case SYS_ALLOC: case SYS_ALLOC:
ret = sys_alloc((size_t)arg1); ret = sys_alloc((size_t)arg1);
break; break;

View File

@ -7,3 +7,8 @@ int open(const char* path, int oflag, ...)
{ {
return syscall(SYS_OPEN, path, oflag); return syscall(SYS_OPEN, path, oflag);
} }
int openat(int fd, const char* path, int oflag, ...)
{
return syscall(SYS_OPENAT, fd, path, oflag);
}

View File

@ -11,20 +11,21 @@ __BEGIN_DECLS
#define SYS_TERMID 4 #define SYS_TERMID 4
#define SYS_CLOSE 5 #define SYS_CLOSE 5
#define SYS_OPEN 6 #define SYS_OPEN 6
#define SYS_ALLOC 7 #define SYS_OPENAT 7
#define SYS_FREE 8 #define SYS_ALLOC 8
#define SYS_SEEK 9 #define SYS_REALLOC 9
#define SYS_TELL 10 #define SYS_FREE 10
#define SYS_GET_TERMIOS 11 #define SYS_SEEK 11
#define SYS_SET_TERMIOS 12 #define SYS_TELL 12
#define SYS_FORK 13 #define SYS_GET_TERMIOS 13
#define SYS_SLEEP 14 #define SYS_SET_TERMIOS 14
#define SYS_EXEC 15 #define SYS_FORK 15
#define SYS_REALLOC 16 #define SYS_EXEC 16
#define SYS_WAIT 17 #define SYS_SLEEP 17
#define SYS_FSTAT 18 #define SYS_WAIT 18
#define SYS_SETENVP 19 #define SYS_FSTAT 19
#define SYS_READ_DIR_ENTRIES 20 #define SYS_SETENVP 20
#define SYS_READ_DIR_ENTRIES 21
__END_DECLS __END_DECLS