From 59eb2d5de4e6bb0ee037a438dc86a150afcb2300 Mon Sep 17 00:00:00 2001 From: sin-ack Date: Fri, 10 Sep 2021 22:45:28 +0000 Subject: [PATCH] LibC: Implement serenity_open This syscall is very much similar to open(2), with the difference of accepting a string and a length, instead of requiring a null-terminated string. This way, if the string passed is not null-terminated, we can still perform the syscall. --- Userland/Libraries/LibC/serenity.cpp | 25 +++++++++++++++++++++++++ Userland/Libraries/LibC/serenity.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/Userland/Libraries/LibC/serenity.cpp b/Userland/Libraries/LibC/serenity.cpp index f1e16b9698..739c8fc8fd 100644 --- a/Userland/Libraries/LibC/serenity.cpp +++ b/Userland/Libraries/LibC/serenity.cpp @@ -4,6 +4,8 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include +#include #include #include #include @@ -148,4 +150,27 @@ int emuctl(uintptr_t command, uintptr_t arg0, uintptr_t arg1) { return syscall(SC_emuctl, command, arg0, arg1); } + +int serenity_open(char const* path, size_t path_length, int options, ...) +{ + if (!path) { + errno = EFAULT; + return -1; + } + + if (path_length > INT32_MAX) { + errno = EINVAL; + return -1; + } + + va_list ap; + va_start(ap, options); + auto mode = (mode_t)va_arg(ap, unsigned); + va_end(ap); + + Syscall::SC_open_params params { AT_FDCWD, { path, path_length }, options, mode }; + int rc = syscall(SC_open, ¶ms); + + __RETURN_WITH_ERRNO(rc, rc, -1); +} } diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h index b144746d4e..d411a80161 100644 --- a/Userland/Libraries/LibC/serenity.h +++ b/Userland/Libraries/LibC/serenity.h @@ -60,4 +60,6 @@ uint16_t internet_checksum(const void* ptr, size_t count); int emuctl(uintptr_t command, uintptr_t arg0, uintptr_t arg1); +int serenity_open(char const* path, size_t path_length, int options, ...); + __END_DECLS