diff --git a/Userland/Libraries/LibCore/Stream.cpp b/Userland/Libraries/LibCore/Stream.cpp index c740f4ac0f..679be3bd45 100644 --- a/Userland/Libraries/LibCore/Stream.cpp +++ b/Userland/Libraries/LibCore/Stream.cpp @@ -273,7 +273,7 @@ ErrorOr Socket::create_fd(SocketDomain domain, SocketType type) return rc; } -Result Socket::resolve_host(String const& host, SocketType type) +ErrorOr Socket::resolve_host(String const& host, SocketType type) { int socket_type; switch (type) { @@ -297,13 +297,13 @@ Result Socket::resolve_host(String const& host, Socket int rc = getaddrinfo(host.characters(), nullptr, &hints, &results); if (rc != 0) { if (rc == EAI_SYSTEM) { - return SocketError { Error::from_errno(errno) }; - } else { - return SocketError { static_cast(rc) }; + return Error::from_errno(errno); } + + return Error::from_string_literal(gai_strerror(rc)); } - auto socket_address = bit_cast(results->ai_addr); + auto* socket_address = bit_cast(results->ai_addr); NetworkOrdered network_ordered_address { socket_address->sin_addr.s_addr }; freeaddrinfo(results); @@ -445,15 +445,10 @@ void PosixSocketHelper::setup_notifier() m_notifier = Core::Notifier::construct(m_fd, Core::Notifier::Read); } -Result TCPSocket::connect(String const& host, u16 port) +ErrorOr TCPSocket::connect(String const& host, u16 port) { auto ip_address = TRY(resolve_host(host, SocketType::Stream)); - - auto maybe_socket = connect(SocketAddress { ip_address, port }); - if (maybe_socket.is_error()) { - return SocketError { maybe_socket.release_error() }; - } - return maybe_socket.release_value(); + return connect(SocketAddress { ip_address, port }); } ErrorOr TCPSocket::connect(SocketAddress const& address) @@ -500,14 +495,10 @@ ErrorOr PosixSocketHelper::pending_bytes() const return static_cast(value); } -Result UDPSocket::connect(String const& host, u16 port) +ErrorOr UDPSocket::connect(String const& host, u16 port) { auto ip_address = TRY(resolve_host(host, SocketType::Datagram)); - auto maybe_socket = connect(SocketAddress { ip_address, port }); - if (maybe_socket.is_error()) { - return SocketError { maybe_socket.release_error() }; - } - return maybe_socket.release_value(); + return connect(SocketAddress { ip_address, port }); } ErrorOr UDPSocket::connect(SocketAddress const& address) diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index af688570f6..98c650c2d4 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -81,60 +81,6 @@ public: virtual ErrorOr size(); }; -enum class GetAddrInfoError { - NoAddressInFamily = EAI_ADDRFAMILY, - TemporaryFailure = EAI_AGAIN, - PermanentFailure = EAI_FAIL, - BadFlags = EAI_BADFLAGS, - UnsupportedFamily = EAI_FAMILY, - OutOfMemory = EAI_MEMORY, - NoNetworkAddressesForHost = EAI_NODATA, - UnknownService = EAI_NONAME, - ServiceNotAvailable = EAI_SERVICE, - UnsupportedSocketType = EAI_SOCKTYPE, - System = EAI_SYSTEM, -}; - -class SocketError { -public: - SocketError(GetAddrInfoError error) - : m_value(error) - { - } - SocketError(ErrorOr const& error) - : m_value(error) - { - } - - // TRY() compatibility - SocketError release_error() { return *this; } - void release_value() { } - - bool is_error() const - { - return m_value.has() || m_value.get>().is_error(); - } - bool is_success() const { return !is_error(); } - - bool is_kresult() { return m_value.has>(); } - bool is_getaddrinfo_error() { return m_value.has(); } - - ErrorOr as_kresult() { return m_value.get>(); } - GetAddrInfoError as_getaddrinfo_error() - { - return m_value.get(); - } - - StringView getaddrinfo_error_string() - { - VERIFY(is_getaddrinfo_error()); - return { gai_strerror(static_cast(as_getaddrinfo_error())) }; - } - -private: - Variant, GetAddrInfoError> m_value; -}; - /// The Socket class is the base class for all concrete BSD-style socket /// classes. Sockets are non-seekable streams which can be read byte-wise. class Socket : public Stream { @@ -180,7 +126,7 @@ protected: static ErrorOr create_fd(SocketDomain, SocketType); // FIXME: This will need to be updated when IPv6 socket arrives. Perhaps a // base class for all address types is appropriate. - static Result resolve_host(String const&, SocketType); + static ErrorOr resolve_host(String const&, SocketType); static ErrorOr connect_local(int fd, String const& path); static ErrorOr connect_inet(int fd, SocketAddress const&); @@ -194,7 +140,7 @@ public: virtual bool is_connected() = 0; /// Reconnects the socket to the given host and port. Returns EALREADY if /// is_connected() is true. - virtual SocketError reconnect(String const& host, u16 port) = 0; + virtual ErrorOr reconnect(String const& host, u16 port) = 0; /// Connects the socket to the given socket address (IP address + port). /// Returns EALREADY is_connected() is true. virtual ErrorOr reconnect(SocketAddress const&) = 0; @@ -307,7 +253,7 @@ private: class TCPSocket final : public Socket { public: - static Result connect(String const& host, u16 port); + static ErrorOr connect(String const& host, u16 port); static ErrorOr connect(SocketAddress const& address); static ErrorOr adopt_fd(int fd); @@ -364,7 +310,7 @@ private: class UDPSocket final : public Socket { public: - static Result connect(String const& host, u16 port); + static ErrorOr connect(String const& host, u16 port); static ErrorOr connect(SocketAddress const& address); UDPSocket(UDPSocket&& other) @@ -858,7 +804,7 @@ using BufferedLocalSocket = BufferedSocket; template class BasicReusableSocket final : public ReusableSocket { public: - static Result, SocketError> connect(String const& host, u16 port) + static ErrorOr> connect(String const& host, u16 port) { return BasicReusableSocket { TRY(T::connect(host, port)) }; } @@ -873,13 +819,13 @@ public: return m_socket.is_open(); } - virtual SocketError reconnect(String const& host, u16 port) override + virtual ErrorOr reconnect(String const& host, u16 port) override { if (is_connected()) - return SocketError { Error::from_errno(EALREADY) }; + return Error::from_errno(EALREADY); m_socket = TRY(T::connect(host, port)); - return SocketError { {} }; + return {}; } virtual ErrorOr reconnect(SocketAddress const& address) override