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