From 3b1e063d30d915826949ce13e069761d7a32e8a5 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 15 Apr 2022 13:33:02 +0100 Subject: [PATCH] LibCore+Everywhere: Make Core::Stream::read() return Bytes A mistake I've repeatedly made is along these lines: ```c++ auto nread = TRY(source_file->read(buffer)); TRY(destination_file->write(buffer)); ``` It's a little clunky to have to create a Bytes or StringView from the buffer's data pointer and the nread, and easy to forget and just use the buffer. So, this patch changes the read() function to return a Bytes of the data that were just read. The other read_foo() methods will be modified in the same way in subsequent commits. Fixes #13687 --- .../CodeGenerators/LibUnicode/GeneratorUtil.h | 4 +- Tests/LibCore/TestLibCoreStream.cpp | 44 +++++++++---------- Tests/LibTLS/TestTLSHandshake.cpp | 4 +- Userland/Libraries/LibAudio/FlacLoader.cpp | 2 +- Userland/Libraries/LibCore/EventLoop.cpp | 20 ++++----- Userland/Libraries/LibCore/InputBitStream.h | 2 +- Userland/Libraries/LibCore/MemoryStream.h | 6 +-- .../Libraries/LibCore/SOCKSProxyClient.cpp | 16 +++---- Userland/Libraries/LibCore/SOCKSProxyClient.h | 2 +- Userland/Libraries/LibCore/Stream.cpp | 12 ++--- Userland/Libraries/LibCore/Stream.h | 26 +++++------ Userland/Libraries/LibGemini/Job.cpp | 2 +- Userland/Libraries/LibHTTP/Job.cpp | 2 +- Userland/Libraries/LibProtocol/Request.cpp | 6 +-- Userland/Libraries/LibTLS/Socket.cpp | 14 +++--- Userland/Libraries/LibTLS/TLSv12.h | 4 +- .../LibWebSocket/Impl/WebSocketImpl.cpp | 4 +- Userland/Services/EchoServer/Client.cpp | 6 +-- Userland/Services/FileOperation/main.cpp | 8 ++-- .../InspectorServer/InspectableProcess.cpp | 16 +++---- .../Services/LookupServer/LookupServer.cpp | 2 +- Userland/Services/TelnetServer/Client.cpp | 4 +- 22 files changed, 103 insertions(+), 103 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h index a3329f60e6b..c18d9807b62 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h @@ -259,8 +259,8 @@ inline ErrorOr read_json_file(StringView path) // FIXME: When Core::Stream supports reading an entire file, use that. while (TRY(file->can_read_line())) { - auto nread = TRY(file->read(buffer)); - TRY(builder.try_append(reinterpret_cast(buffer.data()), nread)); + auto bytes_read = TRY(file->read(buffer)); + TRY(builder.try_append(StringView { bytes_read })); } return JsonValue::from_string(builder.build()); diff --git a/Tests/LibCore/TestLibCoreStream.cpp b/Tests/LibCore/TestLibCoreStream.cpp index 37d559bcb07..b8a47283d04 100644 --- a/Tests/LibCore/TestLibCoreStream.cpp +++ b/Tests/LibCore/TestLibCoreStream.cpp @@ -63,7 +63,7 @@ TEST_CASE(file_read_bytes) auto result = file->read(buffer); EXPECT(!result.is_error()); - EXPECT_EQ(result.value(), 131ul); + EXPECT_EQ(result.value().size(), 131ul); StringView buffer_contents { buffer.bytes() }; EXPECT_EQ(buffer_contents, expected_buffer_contents); @@ -193,11 +193,11 @@ TEST_CASE(tcp_socket_read) auto maybe_receive_buffer = ByteBuffer::create_uninitialized(64); EXPECT(!maybe_receive_buffer.is_error()); auto receive_buffer = maybe_receive_buffer.release_value(); - auto maybe_nread = client_socket->read(receive_buffer); - EXPECT(!maybe_nread.is_error()); - auto nread = maybe_nread.release_value(); + auto maybe_read_bytes = client_socket->read(receive_buffer); + EXPECT(!maybe_read_bytes.is_error()); + auto read_bytes = maybe_read_bytes.release_value(); - StringView received_data { receive_buffer.data(), nread }; + StringView received_data { read_bytes }; EXPECT_EQ(sent_data, received_data); } @@ -226,11 +226,11 @@ TEST_CASE(tcp_socket_write) auto maybe_receive_buffer = ByteBuffer::create_uninitialized(64); EXPECT(!maybe_receive_buffer.is_error()); auto receive_buffer = maybe_receive_buffer.release_value(); - auto maybe_nread = server_socket->read(receive_buffer); - EXPECT(!maybe_nread.is_error()); - auto nread = maybe_nread.release_value(); + auto maybe_read_bytes = server_socket->read(receive_buffer); + EXPECT(!maybe_read_bytes.is_error()); + auto read_bytes = maybe_read_bytes.release_value(); - StringView received_data { receive_buffer.data(), nread }; + StringView received_data { read_bytes }; EXPECT_EQ(sent_data, received_data); } @@ -262,7 +262,7 @@ TEST_CASE(tcp_socket_eof) auto maybe_receive_buffer = ByteBuffer::create_uninitialized(1); EXPECT(!maybe_receive_buffer.is_error()); auto receive_buffer = maybe_receive_buffer.release_value(); - EXPECT_EQ(client_socket->read(receive_buffer).release_value(), 0ul); + EXPECT(client_socket->read(receive_buffer).release_value().is_empty()); EXPECT(client_socket->is_eof()); } @@ -309,11 +309,11 @@ TEST_CASE(udp_socket_read_write) auto maybe_client_receive_buffer = ByteBuffer::create_uninitialized(64); EXPECT(!maybe_client_receive_buffer.is_error()); auto client_receive_buffer = maybe_client_receive_buffer.release_value(); - auto maybe_nread = client_socket->read(client_receive_buffer); - EXPECT(!maybe_nread.is_error()); - auto nread = maybe_nread.release_value(); + auto maybe_read_bytes = client_socket->read(client_receive_buffer); + EXPECT(!maybe_read_bytes.is_error()); + auto read_bytes = maybe_read_bytes.release_value(); - StringView client_received_data { client_receive_buffer.data(), nread }; + StringView client_received_data { read_bytes }; EXPECT_EQ(udp_reply_data, client_received_data); } @@ -353,11 +353,11 @@ TEST_CASE(local_socket_read) auto maybe_receive_buffer = ByteBuffer::create_uninitialized(64); EXPECT(!maybe_receive_buffer.is_error()); auto receive_buffer = maybe_receive_buffer.release_value(); - auto maybe_nread = client_socket->read(receive_buffer); - EXPECT(!maybe_nread.is_error()); - auto nread = maybe_nread.release_value(); + auto maybe_read_bytes = client_socket->read(receive_buffer); + EXPECT(!maybe_read_bytes.is_error()); + auto read_bytes = maybe_read_bytes.release_value(); - StringView received_data { receive_buffer.data(), nread }; + StringView received_data { read_bytes }; EXPECT_EQ(sent_data, received_data); return 0; @@ -384,11 +384,11 @@ TEST_CASE(local_socket_write) auto maybe_receive_buffer = ByteBuffer::create_uninitialized(pending_bytes); EXPECT(!maybe_receive_buffer.is_error()); auto receive_buffer = maybe_receive_buffer.release_value(); - auto maybe_nread = server_socket->read(receive_buffer); - EXPECT(!maybe_nread.is_error()); - EXPECT_EQ(maybe_nread.value(), sent_data.length()); + auto maybe_read_bytes = server_socket->read(receive_buffer); + EXPECT(!maybe_read_bytes.is_error()); + EXPECT_EQ(maybe_read_bytes.value().size(), sent_data.length()); - StringView received_data { receive_buffer.data(), maybe_nread.value() }; + StringView received_data { maybe_read_bytes.value() }; EXPECT_EQ(sent_data, received_data); event_loop.quit(0); diff --git a/Tests/LibTLS/TestTLSHandshake.cpp b/Tests/LibTLS/TestTLSHandshake.cpp index a02a6688841..2bc5ee1988c 100644 --- a/Tests/LibTLS/TestTLSHandshake.cpp +++ b/Tests/LibTLS/TestTLSHandshake.cpp @@ -79,8 +79,8 @@ TEST_CASE(test_TLS_hello_handshake) auto tls = MUST(TLS::TLSv12::connect(DEFAULT_SERVER, port, move(options))); ByteBuffer contents; tls->on_ready_to_read = [&] { - auto nread = MUST(tls->read(contents.must_get_bytes_for_writing(4 * KiB))); - if (nread == 0) { + auto read_bytes = MUST(tls->read(contents.must_get_bytes_for_writing(4 * KiB))); + if (read_bytes.is_empty()) { FAIL("No data received"); loop.quit(1); } diff --git a/Userland/Libraries/LibAudio/FlacLoader.cpp b/Userland/Libraries/LibAudio/FlacLoader.cpp index 199ebbee076..cce821a5fb1 100644 --- a/Userland/Libraries/LibAudio/FlacLoader.cpp +++ b/Userland/Libraries/LibAudio/FlacLoader.cpp @@ -114,7 +114,7 @@ MaybeLoaderError FlacLoaderPlugin::parse_header() [[maybe_unused]] u128 md5_checksum; VERIFY(streaminfo_data->is_aligned_to_byte_boundary()); auto md5_bytes_read = LOADER_TRY(streaminfo_data->read(md5_checksum.bytes())); - FLAC_VERIFY(md5_bytes_read == md5_checksum.my_size(), LoaderError::Category::IO, "MD5 Checksum size"); + FLAC_VERIFY(md5_bytes_read.size() == md5_checksum.my_size(), LoaderError::Category::IO, "MD5 Checksum size"); md5_checksum.bytes().copy_to({ m_md5_checksum, sizeof(m_md5_checksum) }); // Parse other blocks diff --git a/Userland/Libraries/LibCore/EventLoop.cpp b/Userland/Libraries/LibCore/EventLoop.cpp index c72784da63a..0c79cce1d55 100644 --- a/Userland/Libraries/LibCore/EventLoop.cpp +++ b/Userland/Libraries/LibCore/EventLoop.cpp @@ -162,31 +162,31 @@ private: #ifdef __serenity__ m_socket->on_ready_to_read = [this] { u32 length; - auto maybe_nread = m_socket->read({ (u8*)&length, sizeof(length) }); - if (maybe_nread.is_error()) { - dbgln("InspectorServerConnection: Failed to read message length from inspector server connection: {}", maybe_nread.error()); + auto maybe_bytes_read = m_socket->read({ (u8*)&length, sizeof(length) }); + if (maybe_bytes_read.is_error()) { + dbgln("InspectorServerConnection: Failed to read message length from inspector server connection: {}", maybe_bytes_read.error()); shutdown(); return; } - auto nread = maybe_nread.release_value(); - if (nread == 0) { + auto bytes_read = maybe_bytes_read.release_value(); + if (bytes_read.is_empty()) { dbgln_if(EVENTLOOP_DEBUG, "RPC client disconnected"); shutdown(); return; } - VERIFY(nread == sizeof(length)); + VERIFY(bytes_read.size() == sizeof(length)); auto request_buffer = ByteBuffer::create_uninitialized(length).release_value(); - maybe_nread = m_socket->read(request_buffer.bytes()); - if (maybe_nread.is_error()) { - dbgln("InspectorServerConnection: Failed to read message content from inspector server connection: {}", maybe_nread.error()); + maybe_bytes_read = m_socket->read(request_buffer.bytes()); + if (maybe_bytes_read.is_error()) { + dbgln("InspectorServerConnection: Failed to read message content from inspector server connection: {}", maybe_bytes_read.error()); shutdown(); return; } - nread = maybe_nread.release_value(); + bytes_read = maybe_bytes_read.release_value(); auto request_json = JsonValue::from_string(request_buffer); if (request_json.is_error() || !request_json.value().is_object()) { diff --git a/Userland/Libraries/LibCore/InputBitStream.h b/Userland/Libraries/LibCore/InputBitStream.h index be0c8f9cc7f..ea2bb1c9ca7 100644 --- a/Userland/Libraries/LibCore/InputBitStream.h +++ b/Userland/Libraries/LibCore/InputBitStream.h @@ -31,7 +31,7 @@ public: // ^Stream virtual bool is_readable() const override { return m_stream.is_readable(); } - virtual ErrorOr read(Bytes bytes) override + virtual ErrorOr read(Bytes bytes) override { if (m_current_byte.has_value() && is_aligned_to_byte_boundary()) { bytes[0] = m_current_byte.release_value(); diff --git a/Userland/Libraries/LibCore/MemoryStream.h b/Userland/Libraries/LibCore/MemoryStream.h index 465da44f9fe..6ef811fa926 100644 --- a/Userland/Libraries/LibCore/MemoryStream.h +++ b/Userland/Libraries/LibCore/MemoryStream.h @@ -29,15 +29,15 @@ public: // FIXME: It doesn't make sense to truncate a memory stream. Therefore, we don't do anything here. Is that fine? virtual ErrorOr truncate(off_t) override { return Error::from_errno(ENOTSUP); } - virtual ErrorOr read(Bytes bytes) override + virtual ErrorOr read(Bytes bytes) override { auto to_read = min(remaining(), bytes.size()); if (to_read == 0) - return 0; + return Bytes {}; m_bytes.slice(m_offset, to_read).copy_to(bytes); m_offset += to_read; - return bytes.size(); + return bytes.trim(to_read); } virtual ErrorOr seek(i64 offset, SeekMode seek_mode = SeekMode::SetPosition) override diff --git a/Userland/Libraries/LibCore/SOCKSProxyClient.cpp b/Userland/Libraries/LibCore/SOCKSProxyClient.cpp index 6368a07f9dd..4bfb423f627 100644 --- a/Userland/Libraries/LibCore/SOCKSProxyClient.cpp +++ b/Userland/Libraries/LibCore/SOCKSProxyClient.cpp @@ -107,7 +107,7 @@ ErrorOr send_version_identifier_and_method_selection_message(Core::Stream: return Error::from_string_literal("SOCKS negotiation failed: Failed to send version identifier and method selection message"); Socks5InitialResponse response; - size = TRY(socket.read({ &response, sizeof(response) })); + size = TRY(socket.read({ &response, sizeof(response) })).size(); if (size != sizeof(response)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive initial response"); @@ -169,7 +169,7 @@ ErrorOr send_connect_request_message(Core::Stream::Socket& socket, Core:: return Error::from_string_literal("SOCKS negotiation failed: Failed to send connect request"); Socks5ConnectResponseHeader response_header; - size = TRY(socket.read({ &response_header, sizeof(response_header) })); + size = TRY(socket.read({ &response_header, sizeof(response_header) })).size(); if (size != sizeof(response_header)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response header"); @@ -177,26 +177,26 @@ ErrorOr send_connect_request_message(Core::Stream::Socket& socket, Core:: return Error::from_string_literal("SOCKS negotiation failed: Invalid version identifier"); u8 response_address_type; - size = TRY(socket.read({ &response_address_type, sizeof(response_address_type) })); + size = TRY(socket.read({ &response_address_type, sizeof(response_address_type) })).size(); if (size != sizeof(response_address_type)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response address type"); switch (AddressType(response_address_type)) { case AddressType::IPV4: { u8 response_address_data[4]; - size = TRY(socket.read({ response_address_data, sizeof(response_address_data) })); + size = TRY(socket.read({ response_address_data, sizeof(response_address_data) })).size(); if (size != sizeof(response_address_data)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response address data"); break; } case AddressType::DomainName: { u8 response_address_length; - size = TRY(socket.read({ &response_address_length, sizeof(response_address_length) })); + size = TRY(socket.read({ &response_address_length, sizeof(response_address_length) })).size(); if (size != sizeof(response_address_length)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response address length"); ByteBuffer buffer; buffer.resize(response_address_length); - size = TRY(socket.read(buffer)); + size = TRY(socket.read(buffer)).size(); if (size != response_address_length) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response address data"); break; @@ -207,7 +207,7 @@ ErrorOr send_connect_request_message(Core::Stream::Socket& socket, Core:: } u16 bound_port; - size = TRY(socket.read({ &bound_port, sizeof(bound_port) })); + size = TRY(socket.read({ &bound_port, sizeof(bound_port) })).size(); if (size != sizeof(bound_port)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive connect response bound port"); @@ -247,7 +247,7 @@ ErrorOr send_username_password_authentication_message(Core::Stream::Socket& return Error::from_string_literal("SOCKS negotiation failed: Failed to send username/password authentication message"); Socks5UsernamePasswordResponse response; - size = TRY(socket.read({ &response, sizeof(response) })); + size = TRY(socket.read({ &response, sizeof(response) })).size(); if (size != sizeof(response)) return Error::from_string_literal("SOCKS negotiation failed: Failed to receive username/password authentication response"); diff --git a/Userland/Libraries/LibCore/SOCKSProxyClient.h b/Userland/Libraries/LibCore/SOCKSProxyClient.h index 4b011be0a3e..f73488f230d 100644 --- a/Userland/Libraries/LibCore/SOCKSProxyClient.h +++ b/Userland/Libraries/LibCore/SOCKSProxyClient.h @@ -37,7 +37,7 @@ public: virtual ~SOCKSProxyClient() override; // ^Stream::Stream - virtual ErrorOr read(Bytes bytes) override { return m_socket.read(bytes); } + virtual ErrorOr read(Bytes bytes) override { return m_socket.read(bytes); } virtual ErrorOr write(ReadonlyBytes bytes) override { return m_socket.write(bytes); } virtual bool is_eof() const override { return m_socket.is_eof(); } virtual bool is_open() const override { return m_socket.is_open(); } diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp index 74fe90245f0..5edcf6884da 100644 --- a/Userland/Libraries/LibCore/Stream.cpp +++ b/Userland/Libraries/LibCore/Stream.cpp @@ -41,7 +41,7 @@ bool Stream::read_or_error(Bytes buffer) return false; } - nread += result.value(); + nread += result.value().size(); } while (nread < buffer.size()); return true; @@ -156,7 +156,7 @@ ErrorOr File::open_path(StringView filename, mode_t permissions) bool File::is_readable() const { return has_flag(m_mode, OpenMode::Read); } bool File::is_writable() const { return has_flag(m_mode, OpenMode::Write); } -ErrorOr File::read(Bytes buffer) +ErrorOr File::read(Bytes buffer) { if (!has_flag(m_mode, OpenMode::Read)) { // NOTE: POSIX says that if the fd is not open for reading, the call @@ -167,7 +167,7 @@ ErrorOr File::read(Bytes buffer) ssize_t nread = TRY(System::read(m_fd, buffer)); m_last_read_was_eof = nread == 0; - return nread; + return buffer.trim(nread); } ErrorOr File::write(ReadonlyBytes buffer) @@ -322,7 +322,7 @@ ErrorOr Socket::connect_inet(int fd, SocketAddress const& address) return System::connect(fd, bit_cast(&addr), sizeof(addr)); } -ErrorOr PosixSocketHelper::read(Bytes buffer, int flags) +ErrorOr PosixSocketHelper::read(Bytes buffer, int flags) { if (!is_open()) { return Error::from_errno(ENOTCONN); @@ -337,7 +337,7 @@ ErrorOr PosixSocketHelper::read(Bytes buffer, int flags) if (m_last_read_was_eof && m_notifier) m_notifier->set_enabled(false); - return nread; + return buffer.trim(nread); } ErrorOr PosixSocketHelper::write(ReadonlyBytes buffer) @@ -554,7 +554,7 @@ ErrorOr LocalSocket::peer_pid() const ErrorOr LocalSocket::read_without_waiting(Bytes buffer) { - return m_helper.read(buffer, MSG_DONTWAIT); + return TRY(m_helper.read(buffer, MSG_DONTWAIT)).size(); } ErrorOr LocalSocket::release_fd() diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index 8a6ad353699..2a16e052bc5 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -31,9 +31,9 @@ public: virtual bool is_readable() const { return false; } /// Reads into a buffer, with the maximum size being the size of the buffer. /// The amount of bytes read can be smaller than the size of the buffer. - /// Returns either the amount of bytes read, or an errno in the case of + /// Returns either the bytes that were read, or an errno in the case of /// failure. - virtual ErrorOr read(Bytes) = 0; + virtual ErrorOr read(Bytes) = 0; /// Tries to fill the entire buffer through reading. Returns whether the /// buffer was filled without an error. virtual bool read_or_error(Bytes); @@ -194,7 +194,7 @@ public: } virtual bool is_readable() const override; - virtual ErrorOr read(Bytes) override; + virtual ErrorOr read(Bytes) override; virtual bool is_writable() const override; virtual ErrorOr write(ReadonlyBytes) override; virtual bool is_eof() const override; @@ -243,7 +243,7 @@ public: int fd() const { return m_fd; } void set_fd(int fd) { m_fd = fd; } - ErrorOr read(Bytes, int flags = 0); + ErrorOr read(Bytes, int flags = 0); ErrorOr write(ReadonlyBytes); bool is_eof() const { return !is_open() || m_last_read_was_eof; } @@ -292,7 +292,7 @@ public: virtual bool is_readable() const override { return is_open(); } virtual bool is_writable() const override { return is_open(); } - virtual ErrorOr read(Bytes buffer) override { return m_helper.read(buffer); } + virtual ErrorOr read(Bytes buffer) override { return m_helper.read(buffer); } virtual ErrorOr write(ReadonlyBytes buffer) override { return m_helper.write(buffer); } virtual bool is_eof() const override { return m_helper.is_eof(); } virtual bool is_open() const override { return m_helper.is_open(); }; @@ -351,7 +351,7 @@ public: return *this; } - virtual ErrorOr read(Bytes buffer) override + virtual ErrorOr read(Bytes buffer) override { auto pending_bytes = TRY(this->pending_bytes()); if (pending_bytes > buffer.size()) { @@ -426,7 +426,7 @@ public: virtual bool is_readable() const override { return is_open(); } virtual bool is_writable() const override { return is_open(); } - virtual ErrorOr read(Bytes buffer) override { return m_helper.read(buffer); } + virtual ErrorOr read(Bytes buffer) override { return m_helper.read(buffer); } virtual ErrorOr write(ReadonlyBytes buffer) override { return m_helper.write(buffer); } virtual bool is_eof() const override { return m_helper.is_eof(); } virtual bool is_open() const override { return m_helper.is_open(); } @@ -523,7 +523,7 @@ public: T& stream() { return *m_stream; } T const& stream() const { return *m_stream; } - ErrorOr read(Bytes buffer) + ErrorOr read(Bytes buffer) { if (!stream().is_open()) return Error::from_errno(ENOTCONN); @@ -552,7 +552,7 @@ public: m_buffered_size -= amount_to_take; } - return buffer_nread; + return Bytes { buffer.data(), buffer_nread }; } // Reads into the buffer until \n is encountered. @@ -715,7 +715,7 @@ private: break; return result.error(); } - auto read_size = result.value(); + auto read_size = result.value().size(); m_buffered_size += read_size; nread += read_size; break; @@ -752,7 +752,7 @@ public: BufferedSeekable& operator=(BufferedSeekable&& other) = default; virtual bool is_readable() const override { return m_helper.stream().is_readable(); } - virtual ErrorOr read(Bytes buffer) override { return m_helper.read(move(buffer)); } + virtual ErrorOr read(Bytes buffer) override { return m_helper.read(move(buffer)); } virtual bool is_writable() const override { return m_helper.stream().is_writable(); } virtual ErrorOr write(ReadonlyBytes buffer) override { return m_helper.stream().write(buffer); } virtual bool is_eof() const override { return m_helper.is_eof(); } @@ -823,7 +823,7 @@ public: } virtual bool is_readable() const override { return m_helper.stream().is_readable(); } - virtual ErrorOr read(Bytes buffer) override { return m_helper.read(move(buffer)); } + virtual ErrorOr read(Bytes buffer) override { return m_helper.read(move(buffer)); } virtual bool is_writable() const override { return m_helper.stream().is_writable(); } virtual ErrorOr write(ReadonlyBytes buffer) override { return m_helper.stream().write(buffer); } virtual bool is_eof() const override { return m_helper.is_eof(); } @@ -911,7 +911,7 @@ public: } virtual bool is_readable() const override { return m_socket.is_readable(); } - virtual ErrorOr read(Bytes buffer) override { return m_socket.read(move(buffer)); } + virtual ErrorOr read(Bytes buffer) override { return m_socket.read(move(buffer)); } virtual bool is_writable() const override { return m_socket.is_writable(); } virtual ErrorOr write(ReadonlyBytes buffer) override { return m_socket.write(buffer); } virtual bool is_eof() const override { return m_socket.is_eof(); } diff --git a/Userland/Libraries/LibGemini/Job.cpp b/Userland/Libraries/LibGemini/Job.cpp index 5696a476328..171bfd71ba2 100644 --- a/Userland/Libraries/LibGemini/Job.cpp +++ b/Userland/Libraries/LibGemini/Job.cpp @@ -63,7 +63,7 @@ String Job::read_line(size_t size) ByteBuffer Job::receive(size_t size) { ByteBuffer buffer = ByteBuffer::create_uninitialized(size).release_value_but_fixme_should_propagate_errors(); - auto nread = MUST(m_socket->read(buffer)); + auto nread = MUST(m_socket->read(buffer)).size(); return buffer.slice(0, nread); } diff --git a/Userland/Libraries/LibHTTP/Job.cpp b/Userland/Libraries/LibHTTP/Job.cpp index 6ae5ecf2813..f39972b4eb5 100644 --- a/Userland/Libraries/LibHTTP/Job.cpp +++ b/Userland/Libraries/LibHTTP/Job.cpp @@ -172,7 +172,7 @@ ErrorOr Job::receive(size_t size) auto result = m_socket->read(buffer); if (result.is_error() && result.error().is_errno() && result.error().code() == EINTR) continue; - nread = TRY(result); + nread = TRY(result).size(); break; } while (true); return buffer.slice(0, nread); diff --git a/Userland/Libraries/LibProtocol/Request.cpp b/Userland/Libraries/LibProtocol/Request.cpp index 484b5a71426..2a61eaa34f0 100644 --- a/Userland/Libraries/LibProtocol/Request.cpp +++ b/Userland/Libraries/LibProtocol/Request.cpp @@ -51,10 +51,10 @@ void Request::stream_into_impl(T& stream) break; if (result.is_error()) continue; - auto nread = result.value(); - if (nread == 0) + auto read_bytes = result.release_value(); + if (read_bytes.is_empty()) break; - if (!stream.write_or_error({ buf, nread })) { + if (!stream.write_or_error(read_bytes)) { // FIXME: What do we do here? TODO(); } diff --git a/Userland/Libraries/LibTLS/Socket.cpp b/Userland/Libraries/LibTLS/Socket.cpp index 90f9dfb5b2b..a13e2a49999 100644 --- a/Userland/Libraries/LibTLS/Socket.cpp +++ b/Userland/Libraries/LibTLS/Socket.cpp @@ -18,18 +18,18 @@ constexpr static size_t MaximumApplicationDataChunkSize = 16 * KiB; namespace TLS { -ErrorOr TLSv12::read(Bytes bytes) +ErrorOr TLSv12::read(Bytes bytes) { m_eof = false; auto size_to_read = min(bytes.size(), m_context.application_buffer.size()); if (size_to_read == 0) { m_eof = true; - return 0; + return Bytes {}; } m_context.application_buffer.span().slice(0, size_to_read).copy_to(bytes); m_context.application_buffer = m_context.application_buffer.slice(size_to_read, m_context.application_buffer.size() - size_to_read); - return size_to_read; + return Bytes { bytes.data(), size_to_read }; } String TLSv12::read_line(size_t max_size) @@ -186,7 +186,7 @@ ErrorOr TLSv12::read_from_socket() u8 buffer[16 * KiB]; Bytes bytes { buffer, array_size(buffer) }; - size_t nread = 0; + Bytes read_bytes {}; auto& stream = underlying_stream(); do { auto result = stream.read(bytes); @@ -198,9 +198,9 @@ ErrorOr TLSv12::read_from_socket() } continue; } - nread = result.release_value(); - consume(bytes.slice(0, nread)); - } while (nread > 0 && !m_context.critical_error); + read_bytes = result.release_value(); + consume(read_bytes); + } while (!read_bytes.is_empty() && !m_context.critical_error); return {}; } diff --git a/Userland/Libraries/LibTLS/TLSv12.h b/Userland/Libraries/LibTLS/TLSv12.h index d04d4ec830f..4eda14d91b4 100644 --- a/Userland/Libraries/LibTLS/TLSv12.h +++ b/Userland/Libraries/LibTLS/TLSv12.h @@ -356,9 +356,9 @@ public: /// Reads into a buffer, with the maximum size being the size of the buffer. /// The amount of bytes read can be smaller than the size of the buffer. - /// Returns either the amount of bytes read, or an errno in the case of + /// Returns either the bytes that were read, or an errno in the case of /// failure. - virtual ErrorOr read(Bytes) override; + virtual ErrorOr read(Bytes) override; /// Tries to write the entire contents of the buffer. It is possible for /// less than the full buffer to be written. Returns either the amount of diff --git a/Userland/Libraries/LibWebSocket/Impl/WebSocketImpl.cpp b/Userland/Libraries/LibWebSocket/Impl/WebSocketImpl.cpp index 552e0d9dd0e..3486b56cb7d 100644 --- a/Userland/Libraries/LibWebSocket/Impl/WebSocketImpl.cpp +++ b/Userland/Libraries/LibWebSocket/Impl/WebSocketImpl.cpp @@ -56,8 +56,8 @@ void WebSocketImpl::connect(ConnectionInfo const& connection_info) ErrorOr WebSocketImpl::read(int max_size) { auto buffer = TRY(ByteBuffer::create_uninitialized(max_size)); - auto nread = TRY(m_socket->read(buffer)); - return buffer.slice(0, nread); + auto read_bytes = TRY(m_socket->read(buffer)); + return buffer.slice(0, read_bytes.size()); } ErrorOr WebSocketImpl::read_line(size_t size) diff --git a/Userland/Services/EchoServer/Client.cpp b/Userland/Services/EchoServer/Client.cpp index 0a3ae489ba1..2538ffa24f9 100644 --- a/Userland/Services/EchoServer/Client.cpp +++ b/Userland/Services/EchoServer/Client.cpp @@ -30,16 +30,16 @@ ErrorOr Client::drain_socket() auto buffer = TRY(ByteBuffer::create_uninitialized(1024)); while (TRY(m_socket->can_read_without_blocking())) { - auto nread = TRY(m_socket->read(buffer)); + auto bytes_read = TRY(m_socket->read(buffer)); - dbgln("Read {} bytes.", nread); + dbgln("Read {} bytes.", bytes_read.size()); if (m_socket->is_eof()) { Core::deferred_invoke([this, strong_this = NonnullRefPtr(*this)] { quit(); }); break; } - TRY(m_socket->write({ buffer.data(), nread })); + TRY(m_socket->write(bytes_read)); } return {}; diff --git a/Userland/Services/FileOperation/main.cpp b/Userland/Services/FileOperation/main.cpp index f27caa229d5..05f44322772 100644 --- a/Userland/Services/FileOperation/main.cpp +++ b/Userland/Services/FileOperation/main.cpp @@ -238,15 +238,15 @@ ErrorOr execute_work_items(Vector const& items) while (true) { print_progress(); auto bytes_read = TRY(source_file->read(buffer.bytes())); - if (bytes_read == 0) + if (bytes_read.is_empty()) break; - if (auto result = destination_file->write(buffer); result.is_error()) { + if (auto result = destination_file->write(bytes_read); result.is_error()) { // FIXME: Return the formatted string directly. There is no way to do this right now without the temporary going out of scope and being destroyed. report_warning(String::formatted("Failed to write to destination file: {}", result.error())); return result.error(); } - item_done += bytes_read; - executed_work_bytes += bytes_read; + item_done += bytes_read.size(); + executed_work_bytes += bytes_read.size(); print_progress(); // FIXME: Remove this once the kernel is smart enough to schedule other threads // while we're doing heavy I/O. Right now, copying a large file will totally diff --git a/Userland/Services/InspectorServer/InspectableProcess.cpp b/Userland/Services/InspectorServer/InspectableProcess.cpp index 1b085db255c..a709d180fe3 100644 --- a/Userland/Services/InspectorServer/InspectableProcess.cpp +++ b/Userland/Services/InspectorServer/InspectableProcess.cpp @@ -43,8 +43,8 @@ String InspectableProcess::wait_for_response() } u32 length {}; - auto nread = m_socket->read({ (u8*)&length, sizeof(length) }).release_value_but_fixme_should_propagate_errors(); - if (nread != sizeof(length)) { + auto length_bytes_read = m_socket->read({ (u8*)&length, sizeof(length) }).release_value_but_fixme_should_propagate_errors(); + if (length_bytes_read.size() != sizeof(length)) { dbgln("InspectableProcess got malformed data: PID {}", m_pid); m_socket->close(); return {}; @@ -54,17 +54,17 @@ String InspectableProcess::wait_for_response() auto remaining_data_buffer = data_buffer.bytes(); while (!remaining_data_buffer.is_empty()) { - auto maybe_nread = m_socket->read(remaining_data_buffer); - if (maybe_nread.is_error()) { - dbgln("InspectableProcess::wait_for_response: Failed to read data: {}", maybe_nread.error()); + auto maybe_bytes_read = m_socket->read(remaining_data_buffer); + if (maybe_bytes_read.is_error()) { + dbgln("InspectableProcess::wait_for_response: Failed to read data: {}", maybe_bytes_read.error()); break; } - auto nread = maybe_nread.release_value(); - if (nread == 0) + auto bytes_read = maybe_bytes_read.release_value(); + if (bytes_read.is_empty()) break; - remaining_data_buffer = remaining_data_buffer.slice(nread); + remaining_data_buffer = remaining_data_buffer.slice(bytes_read.size()); } VERIFY(data_buffer.size() == length); diff --git a/Userland/Services/LookupServer/LookupServer.cpp b/Userland/Services/LookupServer/LookupServer.cpp index c69749e401c..5cea3bf57b8 100644 --- a/Userland/Services/LookupServer/LookupServer.cpp +++ b/Userland/Services/LookupServer/LookupServer.cpp @@ -239,7 +239,7 @@ ErrorOr> LookupServer::lookup(Name const& name, String const& nam TRY(udp_socket->write(buffer)); u8 response_buffer[4096]; - int nrecv = TRY(udp_socket->read({ response_buffer, sizeof(response_buffer) })); + int nrecv = TRY(udp_socket->read({ response_buffer, sizeof(response_buffer) })).size(); if (udp_socket->is_eof()) return Vector {}; diff --git a/Userland/Services/TelnetServer/Client.cpp b/Userland/Services/TelnetServer/Client.cpp index d45800975cb..68dda4074d6 100644 --- a/Userland/Services/TelnetServer/Client.cpp +++ b/Userland/Services/TelnetServer/Client.cpp @@ -76,9 +76,9 @@ ErrorOr Client::drain_socket() auto buffer = TRY(ByteBuffer::create_uninitialized(1024)); while (TRY(m_socket->can_read_without_blocking())) { - auto nread = TRY(m_socket->read(buffer)); + auto read_bytes = TRY(m_socket->read(buffer)); - m_parser.write({ buffer.data(), nread }); + m_parser.write(StringView { read_bytes }); if (m_socket->is_eof()) { Core::deferred_invoke([this, strong_this = NonnullRefPtr(*this)] { quit(); });