diff options
-rw-r--r-- | Userland/Libraries/LibCore/System.cpp | 18 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/System.h | 1 |
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, ¶ms); + 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); |