summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibCore/System.cpp18
-rw-r--r--Userland/Libraries/LibCore/System.h1
2 files changed, 19 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp
index a08d1bcff2..c22ec3de4d 100644
--- a/Userland/Libraries/LibCore/System.cpp
+++ b/Userland/Libraries/LibCore/System.cpp
@@ -175,6 +175,24 @@ ErrorOr<struct stat> stat(StringView path)
#endif
}
+ErrorOr<struct stat> lstat(StringView path)
+{
+ if (!path.characters_without_null_termination())
+ return Error::from_syscall("lstat"sv, -EFAULT);
+
+ struct stat st = {};
+#ifdef __serenity__
+ Syscall::SC_stat_params params { { path.characters_without_null_termination(), path.length() }, &st, AT_FDCWD, false };
+ int rc = syscall(SC_stat, &params);
+ HANDLE_SYSCALL_RETURN_VALUE("lstat"sv, rc, st);
+#else
+ String path_string = path;
+ if (::stat(path_string.characters(), &st) < 0)
+ return Error::from_syscall("lstat"sv, -errno);
+ return st;
+#endif
+}
+
ErrorOr<ssize_t> read(int fd, Bytes buffer)
{
ssize_t rc = ::read(fd, buffer.data(), buffer.size());
diff --git a/Userland/Libraries/LibCore/System.h b/Userland/Libraries/LibCore/System.h
index 6f4fa49f7c..8bda871631 100644
--- a/Userland/Libraries/LibCore/System.h
+++ b/Userland/Libraries/LibCore/System.h
@@ -30,6 +30,7 @@ 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);
+ErrorOr<struct stat> lstat(StringView path);
ErrorOr<ssize_t> read(int fd, Bytes buffer);
ErrorOr<ssize_t> write(int fd, ReadonlyBytes buffer);
ErrorOr<void> kill(pid_t, int signal);