diff options
-rw-r--r-- | Userland/Libraries/LibCore/System.cpp | 18 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/System.h | 2 |
2 files changed, 20 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp index bd6b00509a..500b39b39f 100644 --- a/Userland/Libraries/LibCore/System.cpp +++ b/Userland/Libraries/LibCore/System.cpp @@ -324,4 +324,22 @@ ErrorOr<void> chown(StringView pathname, uid_t uid, gid_t gid) #endif } +ErrorOr<struct passwd> getpwnam(StringView name) +{ + ::setpwent(); + if (errno) + return Error::from_syscall("getpwnam"sv, -errno); + + while (auto* pw = ::getpwent()) { + if (errno) + return Error::from_syscall("getpwnam"sv, -errno); + if (pw->pw_name == name) + return *pw; + } + if (errno) + return Error::from_syscall("getpwnam"sv, -errno); + else + return Error::from_string_literal("getpwnam: Unknown username"sv); +} + } diff --git a/Userland/Libraries/LibCore/System.h b/Userland/Libraries/LibCore/System.h index dbf9d27026..f6f5db9a0b 100644 --- a/Userland/Libraries/LibCore/System.h +++ b/Userland/Libraries/LibCore/System.h @@ -8,6 +8,7 @@ #pragma once #include <AK/Error.h> +#include <pwd.h> #include <signal.h> #include <sys/stat.h> #include <termios.h> @@ -45,5 +46,6 @@ ErrorOr<struct termios> tcgetattr(int fd); ErrorOr<void> tcsetattr(int fd, int optional_actions, struct termios const&); ErrorOr<void> chmod(StringView pathname, mode_t mode); ErrorOr<void> chown(StringView pathname, uid_t uid, gid_t gid); +ErrorOr<struct passwd> getpwnam(StringView name); } |