summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-01-01 18:26:17 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-02 18:08:02 +0100
commit431bd069f0cc66abec8b27b94289955310db8679 (patch)
tree13e3ba8066eff6e3f54046154039f9d67113e364
parent7008f74214aefc088eb15f0ff7656b31e70c0cbd (diff)
downloadserenity-431bd069f0cc66abec8b27b94289955310db8679.zip
LibCore: Add Core::System wrappers for getspent() and getspnam()
-rw-r--r--Userland/Libraries/LibCore/System.cpp25
-rw-r--r--Userland/Libraries/LibCore/System.h9
2 files changed, 34 insertions, 0 deletions
diff --git a/Userland/Libraries/LibCore/System.cpp b/Userland/Libraries/LibCore/System.cpp
index 17ff8023af..3cddacc95e 100644
--- a/Userland/Libraries/LibCore/System.cpp
+++ b/Userland/Libraries/LibCore/System.cpp
@@ -107,6 +107,31 @@ ErrorOr<long> ptrace(int request, pid_t tid, void* address, void* data)
}
#endif
+#ifndef AK_OS_BSD_GENERIC
+ErrorOr<Optional<struct spwd>> getspent()
+{
+ errno = 0;
+ if (auto* spwd = ::getspent())
+ return *spwd;
+ if (errno)
+ return Error::from_syscall("getspent"sv, -errno);
+ return Optional<struct spwd> {};
+}
+
+ErrorOr<Optional<struct spwd>> getspnam(StringView name)
+{
+ errno = 0;
+ ::setspent();
+ while (auto* spwd = ::getspent()) {
+ if (spwd->sp_namp == name)
+ return *spwd;
+ }
+ if (errno)
+ return Error::from_syscall("getspnam"sv, -errno);
+ return Optional<struct spwd> {};
+}
+#endif
+
#ifndef AK_OS_MACOS
ErrorOr<int> accept4(int sockfd, sockaddr* address, socklen_t* address_length, int flags)
{
diff --git a/Userland/Libraries/LibCore/System.h b/Userland/Libraries/LibCore/System.h
index 318cdde735..8630e58485 100644
--- a/Userland/Libraries/LibCore/System.h
+++ b/Userland/Libraries/LibCore/System.h
@@ -22,6 +22,10 @@
#include <time.h>
#include <utime.h>
+#ifndef AK_OS_BSD_GENERIC
+# include <shadow.h>
+#endif
+
namespace Core::System {
#ifdef __serenity__
@@ -35,6 +39,11 @@ ErrorOr<void> mount(int source_fd, StringView target, StringView fs_type, int fl
ErrorOr<long> ptrace(int request, pid_t tid, void* address, void* data);
#endif
+#ifndef AK_OS_BSD_GENERIC
+ErrorOr<Optional<struct spwd>> getspent();
+ErrorOr<Optional<struct spwd>> getspnam(StringView name);
+#endif
+
#ifndef AK_OS_MACOS
ErrorOr<int> accept4(int sockfd, struct sockaddr*, socklen_t*, int flags);
#endif