summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorsin-ack <sin-ack@users.noreply.github.com>2022-01-14 13:22:54 +0000
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2022-01-15 13:29:48 +0330
commit27b49a60d0fdb3b37ae6380896488b7e5381c6b9 (patch)
tree64e72c0cef0c5425f6af5849da22f369355ef8e2 /Userland
parentf9847372f3c8509e9028fa99960c605a79d30d70 (diff)
downloadserenity-27b49a60d0fdb3b37ae6380896488b7e5381c6b9.zip
LibCore: Implement LocalSocket::read_without_waiting
This uses recv with MSG_DONTWAIT to disable blocking operation for a single call. LibIPC uses this to read in a non-blocking manner from an otherwise blocking socket.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibCore/Stream.cpp11
-rw-r--r--Userland/Libraries/LibCore/Stream.h3
2 files changed, 10 insertions, 4 deletions
diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp
index 58d99e6349..b24b56514f 100644
--- a/Userland/Libraries/LibCore/Stream.cpp
+++ b/Userland/Libraries/LibCore/Stream.cpp
@@ -341,15 +341,15 @@ ErrorOr<void> Socket::connect_inet(int fd, SocketAddress const& address)
return {};
}
-ErrorOr<size_t> PosixSocketHelper::read(Bytes buffer)
+ErrorOr<size_t> PosixSocketHelper::read(Bytes buffer, int flags)
{
if (!is_open()) {
return Error::from_errno(ENOTCONN);
}
- ssize_t rc = ::recv(m_fd, buffer.data(), buffer.size(), 0);
+ ssize_t rc = ::recv(m_fd, buffer.data(), buffer.size(), flags);
if (rc < 0) {
- return Error::from_errno(errno);
+ return Error::from_syscall("recv", -errno);
}
m_last_read_was_eof = rc == 0;
@@ -556,4 +556,9 @@ ErrorOr<void> LocalSocket::send_fd(int fd)
#endif
}
+ErrorOr<size_t> LocalSocket::read_without_waiting(Bytes buffer)
+{
+ return m_helper.read(buffer, MSG_DONTWAIT);
+}
+
}
diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h
index 7999eef53c..d3820ab379 100644
--- a/Userland/Libraries/LibCore/Stream.h
+++ b/Userland/Libraries/LibCore/Stream.h
@@ -229,7 +229,7 @@ public:
int fd() const { return m_fd; }
void set_fd(int fd) { m_fd = fd; }
- ErrorOr<size_t> read(Bytes);
+ ErrorOr<size_t> read(Bytes, int flags = 0);
ErrorOr<size_t> write(ReadonlyBytes);
bool is_eof() const { return !is_open() || m_last_read_was_eof; }
@@ -412,6 +412,7 @@ public:
ErrorOr<int> receive_fd(int flags);
ErrorOr<void> send_fd(int fd);
+ ErrorOr<size_t> read_without_waiting(Bytes buffer);
virtual ~LocalSocket() { close(); }