1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:37:45 +00:00

LibCore: Remove the SocketError class

SocketError is a relic from the KResult days when we couldn't have a
string in the KResult type, only an errno. Now that we can use string
literals with Error, it's no longer necessary. gai_strerror is thread
safe, so we can use it here unlike strerror.
This commit is contained in:
sin-ack 2021-12-18 11:37:22 +00:00 committed by Ali Mohammad Pur
parent 28063de488
commit eb389db92c
2 changed files with 17 additions and 80 deletions

View file

@ -273,7 +273,7 @@ ErrorOr<int> Socket::create_fd(SocketDomain domain, SocketType type)
return rc; return rc;
} }
Result<IPv4Address, SocketError> Socket::resolve_host(String const& host, SocketType type) ErrorOr<IPv4Address> Socket::resolve_host(String const& host, SocketType type)
{ {
int socket_type; int socket_type;
switch (type) { switch (type) {
@ -297,13 +297,13 @@ Result<IPv4Address, SocketError> Socket::resolve_host(String const& host, Socket
int rc = getaddrinfo(host.characters(), nullptr, &hints, &results); int rc = getaddrinfo(host.characters(), nullptr, &hints, &results);
if (rc != 0) { if (rc != 0) {
if (rc == EAI_SYSTEM) { if (rc == EAI_SYSTEM) {
return SocketError { Error::from_errno(errno) }; return Error::from_errno(errno);
} else {
return SocketError { static_cast<GetAddrInfoError>(rc) };
} }
return Error::from_string_literal(gai_strerror(rc));
} }
auto socket_address = bit_cast<struct sockaddr_in*>(results->ai_addr); auto* socket_address = bit_cast<struct sockaddr_in*>(results->ai_addr);
NetworkOrdered<u32> network_ordered_address { socket_address->sin_addr.s_addr }; NetworkOrdered<u32> network_ordered_address { socket_address->sin_addr.s_addr };
freeaddrinfo(results); freeaddrinfo(results);
@ -445,15 +445,10 @@ void PosixSocketHelper::setup_notifier()
m_notifier = Core::Notifier::construct(m_fd, Core::Notifier::Read); m_notifier = Core::Notifier::construct(m_fd, Core::Notifier::Read);
} }
Result<TCPSocket, SocketError> TCPSocket::connect(String const& host, u16 port) ErrorOr<TCPSocket> TCPSocket::connect(String const& host, u16 port)
{ {
auto ip_address = TRY(resolve_host(host, SocketType::Stream)); auto ip_address = TRY(resolve_host(host, SocketType::Stream));
return connect(SocketAddress { ip_address, port });
auto maybe_socket = connect(SocketAddress { ip_address, port });
if (maybe_socket.is_error()) {
return SocketError { maybe_socket.release_error() };
}
return maybe_socket.release_value();
} }
ErrorOr<TCPSocket> TCPSocket::connect(SocketAddress const& address) ErrorOr<TCPSocket> TCPSocket::connect(SocketAddress const& address)
@ -500,14 +495,10 @@ ErrorOr<size_t> PosixSocketHelper::pending_bytes() const
return static_cast<size_t>(value); return static_cast<size_t>(value);
} }
Result<UDPSocket, SocketError> UDPSocket::connect(String const& host, u16 port) ErrorOr<UDPSocket> UDPSocket::connect(String const& host, u16 port)
{ {
auto ip_address = TRY(resolve_host(host, SocketType::Datagram)); auto ip_address = TRY(resolve_host(host, SocketType::Datagram));
auto maybe_socket = connect(SocketAddress { ip_address, port }); return connect(SocketAddress { ip_address, port });
if (maybe_socket.is_error()) {
return SocketError { maybe_socket.release_error() };
}
return maybe_socket.release_value();
} }
ErrorOr<UDPSocket> UDPSocket::connect(SocketAddress const& address) ErrorOr<UDPSocket> UDPSocket::connect(SocketAddress const& address)

View file

@ -81,60 +81,6 @@ public:
virtual ErrorOr<off_t> size(); virtual ErrorOr<off_t> 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<void> const& error)
: m_value(error)
{
}
// TRY() compatibility
SocketError release_error() { return *this; }
void release_value() { }
bool is_error() const
{
return m_value.has<GetAddrInfoError>() || m_value.get<ErrorOr<void>>().is_error();
}
bool is_success() const { return !is_error(); }
bool is_kresult() { return m_value.has<ErrorOr<void>>(); }
bool is_getaddrinfo_error() { return m_value.has<GetAddrInfoError>(); }
ErrorOr<void> as_kresult() { return m_value.get<ErrorOr<void>>(); }
GetAddrInfoError as_getaddrinfo_error()
{
return m_value.get<GetAddrInfoError>();
}
StringView getaddrinfo_error_string()
{
VERIFY(is_getaddrinfo_error());
return { gai_strerror(static_cast<int>(as_getaddrinfo_error())) };
}
private:
Variant<ErrorOr<void>, GetAddrInfoError> m_value;
};
/// The Socket class is the base class for all concrete BSD-style socket /// 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. /// classes. Sockets are non-seekable streams which can be read byte-wise.
class Socket : public Stream { class Socket : public Stream {
@ -180,7 +126,7 @@ protected:
static ErrorOr<int> create_fd(SocketDomain, SocketType); static ErrorOr<int> create_fd(SocketDomain, SocketType);
// FIXME: This will need to be updated when IPv6 socket arrives. Perhaps a // FIXME: This will need to be updated when IPv6 socket arrives. Perhaps a
// base class for all address types is appropriate. // base class for all address types is appropriate.
static Result<IPv4Address, SocketError> resolve_host(String const&, SocketType); static ErrorOr<IPv4Address> resolve_host(String const&, SocketType);
static ErrorOr<void> connect_local(int fd, String const& path); static ErrorOr<void> connect_local(int fd, String const& path);
static ErrorOr<void> connect_inet(int fd, SocketAddress const&); static ErrorOr<void> connect_inet(int fd, SocketAddress const&);
@ -194,7 +140,7 @@ public:
virtual bool is_connected() = 0; virtual bool is_connected() = 0;
/// Reconnects the socket to the given host and port. Returns EALREADY if /// Reconnects the socket to the given host and port. Returns EALREADY if
/// is_connected() is true. /// is_connected() is true.
virtual SocketError reconnect(String const& host, u16 port) = 0; virtual ErrorOr<void> reconnect(String const& host, u16 port) = 0;
/// Connects the socket to the given socket address (IP address + port). /// Connects the socket to the given socket address (IP address + port).
/// Returns EALREADY is_connected() is true. /// Returns EALREADY is_connected() is true.
virtual ErrorOr<void> reconnect(SocketAddress const&) = 0; virtual ErrorOr<void> reconnect(SocketAddress const&) = 0;
@ -307,7 +253,7 @@ private:
class TCPSocket final : public Socket { class TCPSocket final : public Socket {
public: public:
static Result<TCPSocket, SocketError> connect(String const& host, u16 port); static ErrorOr<TCPSocket> connect(String const& host, u16 port);
static ErrorOr<TCPSocket> connect(SocketAddress const& address); static ErrorOr<TCPSocket> connect(SocketAddress const& address);
static ErrorOr<TCPSocket> adopt_fd(int fd); static ErrorOr<TCPSocket> adopt_fd(int fd);
@ -364,7 +310,7 @@ private:
class UDPSocket final : public Socket { class UDPSocket final : public Socket {
public: public:
static Result<UDPSocket, SocketError> connect(String const& host, u16 port); static ErrorOr<UDPSocket> connect(String const& host, u16 port);
static ErrorOr<UDPSocket> connect(SocketAddress const& address); static ErrorOr<UDPSocket> connect(SocketAddress const& address);
UDPSocket(UDPSocket&& other) UDPSocket(UDPSocket&& other)
@ -858,7 +804,7 @@ using BufferedLocalSocket = BufferedSocket<LocalSocket>;
template<SocketLike T> template<SocketLike T>
class BasicReusableSocket final : public ReusableSocket { class BasicReusableSocket final : public ReusableSocket {
public: public:
static Result<BasicReusableSocket<T>, SocketError> connect(String const& host, u16 port) static ErrorOr<BasicReusableSocket<T>> connect(String const& host, u16 port)
{ {
return BasicReusableSocket { TRY(T::connect(host, port)) }; return BasicReusableSocket { TRY(T::connect(host, port)) };
} }
@ -873,13 +819,13 @@ public:
return m_socket.is_open(); return m_socket.is_open();
} }
virtual SocketError reconnect(String const& host, u16 port) override virtual ErrorOr<void> reconnect(String const& host, u16 port) override
{ {
if (is_connected()) if (is_connected())
return SocketError { Error::from_errno(EALREADY) }; return Error::from_errno(EALREADY);
m_socket = TRY(T::connect(host, port)); m_socket = TRY(T::connect(host, port));
return SocketError { {} }; return {};
} }
virtual ErrorOr<void> reconnect(SocketAddress const& address) override virtual ErrorOr<void> reconnect(SocketAddress const& address) override