Преглед изворни кода

LibCore: Add syscall wrapper for stat()

Andreas Kling пре 3 година
родитељ
комит
3db9979e40
2 измењених фајлова са 19 додато и 0 уклоњено
  1. 18 0
      Userland/Libraries/LibCore/System.cpp
  2. 1 0
      Userland/Libraries/LibCore/System.h

+ 18 - 0
Userland/Libraries/LibCore/System.cpp

@@ -130,4 +130,22 @@ ErrorOr<void> ftruncate(int fd, off_t length)
     return {};
 }
 
+ErrorOr<struct stat> stat(StringView path)
+{
+    if (!path.characters_without_null_termination())
+        return Error::from_syscall("stat"sv, -EFAULT);
+
+    struct stat st = {};
+#ifdef __serenity__
+    Syscall::SC_stat_params params { { path.characters_without_null_termination(), path.length() }, &st, AT_FDCWD, true };
+    int rc = syscall(SC_stat, &params);
+    HANDLE_SYSCALL_RETURN_VALUE("stat"sv, rc, st);
+#else
+    String path_string = path;
+    if (::stat(path_string.characters(), &st) < 0)
+        return Error::from_syscall("stat"sv, -errno);
+    return st;
+#endif
+}
+
 }

+ 1 - 0
Userland/Libraries/LibCore/System.h

@@ -25,5 +25,6 @@ ErrorOr<void> munmap(void* address, size_t);
 ErrorOr<int> open(StringView path, int options, ...);
 ErrorOr<void> close(int fd);
 ErrorOr<void> ftruncate(int fd, off_t length);
+ErrorOr<struct stat> stat(StringView path);
 
 }