瀏覽代碼

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.
sin-ack 3 年之前
父節點
當前提交
59eb2d5de4
共有 2 個文件被更改,包括 27 次插入0 次删除
  1. 25 0
      Userland/Libraries/LibC/serenity.cpp
  2. 2 0
      Userland/Libraries/LibC/serenity.h

+ 25 - 0
Userland/Libraries/LibC/serenity.cpp

@@ -4,6 +4,8 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <Kernel/API/POSIX/fcntl.h>
+#include <Kernel/API/Syscall.h>
 #include <arpa/inet.h>
 #include <errno.h>
 #include <serenity.h>
@@ -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, &params);
+
+    __RETURN_WITH_ERRNO(rc, rc, -1);
+}
 }

+ 2 - 0
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