diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/result.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/bsd.cpp | 28 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/bsd.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/sockets/sfdnsres.cpp | 34 | ||||
| -rw-r--r-- | src/core/hle/service/ssl/ssl.cpp | 41 | ||||
| -rw-r--r-- | src/core/internal_network/network.cpp | 8 | ||||
| -rw-r--r-- | src/core/internal_network/network.h | 4 |
7 files changed, 60 insertions, 62 deletions
diff --git a/src/core/hle/result.h b/src/core/hle/result.h index 06ebb22be3..cfad30b992 100644 --- a/src/core/hle/result.h +++ b/src/core/hle/result.h @@ -10,7 +10,6 @@ #include "common/bit_field.h" #include "common/common_funcs.h" #include "common/common_types.h" -#include "common/expected.h" // All the constants in this file come from <https://switchbrew.org/wiki/Error_codes> diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 6053cdd7f2..b8078bfd99 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -24,9 +24,6 @@ #include "network/network.h" #include <common/settings.h> -using Common::Expected; -using Common::Unexpected; - namespace Service::Sockets { namespace { @@ -464,13 +461,22 @@ void BSD::DuplicateSocket(HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; auto input = rp.PopRaw<InputParameters>(); - Expected<s32, Errno> res = DuplicateSocketImpl(input.fd); IPC::ResponseBuilder rb{ctx, 4}; rb.Push(ResultSuccess); - rb.PushRaw(OutputParameters{ - .ret = res.value_or(0), - .bsd_errno = res ? Errno::SUCCESS : res.error(), - }); + + auto const res_v = DuplicateSocketImpl(input.fd); + if (auto* res = std::get_if<s32>(&res_v)) { + rb.PushRaw(OutputParameters{ + .ret = *res, + .bsd_errno = Errno::SUCCESS, + }); + } else { + auto* err = std::get_if<Errno>(&res_v); + rb.PushRaw(OutputParameters{ + .ret = 0, + .bsd_errno = *err, + }); + } } void BSD::EventFd(HLERequestContext& ctx) { @@ -977,15 +983,15 @@ Errno BSD::CloseImpl(s32 fd) { return bsd_errno; } -Expected<s32, Errno> BSD::DuplicateSocketImpl(s32 fd) { +std::variant<s32, Errno> BSD::DuplicateSocketImpl(s32 fd) { if (!IsFileDescriptorValid(fd)) { - return Unexpected(Errno::BADF); + return Errno::BADF; } const s32 new_fd = FindFreeFileDescriptorHandle(); if (new_fd < 0) { LOG_ERROR(Service, "No more file descriptors available"); - return Unexpected(Errno::MFILE); + return Errno::MFILE; } file_descriptors[new_fd] = FileDescriptor{ diff --git a/src/core/hle/service/sockets/bsd.h b/src/core/hle/service/sockets/bsd.h index 32b5bdc3cf..15e4a33592 100644 --- a/src/core/hle/service/sockets/bsd.h +++ b/src/core/hle/service/sockets/bsd.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,9 +8,9 @@ #include <memory> #include <span> #include <vector> +#include <variant> #include "common/common_types.h" -#include "common/expected.h" #include "common/socket_types.h" #include "core/hle/service/service.h" #include "core/hle/service/sockets/sockets.h" @@ -35,7 +35,7 @@ public: // These methods are called from SSL; the first two are also called from // this class for the corresponding IPC methods. // On the real device, the SSL service makes IPC calls to this service. - Common::Expected<s32, Errno> DuplicateSocketImpl(s32 fd); + std::variant<s32, Errno> DuplicateSocketImpl(s32 fd); Errno CloseImpl(s32 fd); std::optional<std::shared_ptr<Network::SocketBase>> GetSocket(s32 fd); diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp index 13b3754c42..9e71be3547 100644 --- a/src/core/hle/service/sockets/sfdnsres.cpp +++ b/src/core/hle/service/sockets/sfdnsres.cpp @@ -208,16 +208,15 @@ static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestConte return {0, GetAddrInfoError::AGAIN}; } - auto res = Network::GetAddressInfo(host, /*service*/ std::nullopt); - if (!res.has_value()) { - return {0, Translate(res.error())}; + auto res_v = Network::GetAddressInfo(host, /*service*/ std::nullopt); + if (auto* res = std::get_if<std::vector<Network::AddrInfo>>(&res_v)) { + const std::vector<u8> data = SerializeAddrInfoAsHostEnt(*res, host); + const u32 data_size = u32(data.size()); + ctx.WriteBuffer(data, 0); + return {data_size, GetAddrInfoError::SUCCESS}; } - - const std::vector<u8> data = SerializeAddrInfoAsHostEnt(res.value(), host); - const u32 data_size = static_cast<u32>(data.size()); - ctx.WriteBuffer(data, 0); - - return {data_size, GetAddrInfoError::SUCCESS}; + auto* err = std::get_if<Network::GetAddrInfoError>(&res_v); + return {0, Translate(*err)}; } void SFDNSRES::GetHostByNameRequest(HLERequestContext& ctx) { @@ -333,16 +332,15 @@ static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext // Serialized hints are also passed in a buffer, but are ignored for now. - auto res = Network::GetAddressInfo(host, service); - if (!res.has_value()) { - return {0, Translate(res.error())}; + auto res_v = Network::GetAddressInfo(host, service); + if (auto* res = std::get_if<std::vector<Network::AddrInfo>>(&res_v)) { + const std::vector<u8> data = SerializeAddrInfo(*res, host); + const u32 data_size = u32(data.size()); + ctx.WriteBuffer(data, 0); + return {data_size, GetAddrInfoError::SUCCESS}; } - - const std::vector<u8> data = SerializeAddrInfo(res.value(), host); - const u32 data_size = static_cast<u32>(data.size()); - ctx.WriteBuffer(data, 0); - - return {data_size, GetAddrInfoError::SUCCESS}; + auto* err = std::get_if<Network::GetAddrInfoError>(&res_v); + return {0, Translate(*err)}; } void SFDNSRES::GetAddrInfoRequest(HLERequestContext& ctx) { diff --git a/src/core/hle/service/ssl/ssl.cpp b/src/core/hle/service/ssl/ssl.cpp index b66c686b2a..766673c653 100644 --- a/src/core/hle/service/ssl/ssl.cpp +++ b/src/core/hle/service/ssl/ssl.cpp @@ -160,29 +160,26 @@ private: auto bsd = system.ServiceManager().GetService<Service::Sockets::BSD>("bsd:u"); ASSERT_OR_EXECUTE(bsd, { return ResultInternalError; }); - auto res = bsd->DuplicateSocketImpl(fd); - if (!res.has_value()) { - LOG_ERROR(Service_SSL, "Failed to duplicate socket with fd {}", fd); - return ResultInvalidSocket; - } - - const s32 duplicated_fd = *res; - - if (do_not_close_socket) { - *out_fd = duplicated_fd; - } else { - *out_fd = -1; - fd_to_close = duplicated_fd; - } - - std::optional<std::shared_ptr<Network::SocketBase>> sock = bsd->GetSocket(duplicated_fd); - if (!sock.has_value()) { - LOG_ERROR(Service_SSL, "invalid socket fd {} after duplication", duplicated_fd); - return ResultInvalidSocket; + auto const res_v = bsd->DuplicateSocketImpl(fd); + if (auto *res = std::get_if<s32>(&res_v)) { + const s32 duplicated_fd = *res; + if (do_not_close_socket) { + *out_fd = duplicated_fd; + } else { + *out_fd = -1; + fd_to_close = duplicated_fd; + } + std::optional<std::shared_ptr<Network::SocketBase>> sock = bsd->GetSocket(duplicated_fd); + if (!sock.has_value()) { + LOG_ERROR(Service_SSL, "invalid socket fd {} after duplication", duplicated_fd); + return ResultInvalidSocket; + } + socket = std::move(*sock); + backend->SetSocket(socket); + return ResultSuccess; } - socket = std::move(*sock); - backend->SetSocket(socket); - return ResultSuccess; + LOG_ERROR(Service_SSL, "Failed to duplicate socket with fd {}", fd); + return ResultInvalidSocket; } Result SetHostNameImpl(const std::string& hostname) { diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index c95d7ca2da..077a2e042e 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -28,7 +28,6 @@ #include "common/assert.h" #include "common/common_types.h" -#include "common/expected.h" #include "common/logging.h" #include "common/settings.h" #include "core/internal_network/network.h" @@ -733,15 +732,14 @@ u32 IPv4AddressToInteger(IPv4Address ip_addr) { static_cast<u32>(ip_addr[2]) << 8 | static_cast<u32>(ip_addr[3]); } -Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo( +std::variant<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo( const std::string& host, const std::optional<std::string>& service) { addrinfo hints{}; hints.ai_family = AF_INET; // Switch only supports IPv4. addrinfo* addrinfo; - s32 gai_err = getaddrinfo(host.c_str(), service.has_value() ? service->c_str() : nullptr, - &hints, &addrinfo); + s32 gai_err = getaddrinfo(host.c_str(), service.has_value() ? service->c_str() : nullptr, &hints, &addrinfo); if (gai_err != 0) { - return Common::Unexpected(TranslateGetAddrInfoErrorFromNative(gai_err)); + return TranslateGetAddrInfoErrorFromNative(gai_err); } std::vector<AddrInfo> ret; for (auto* current = addrinfo; current; current = current->ai_next) { diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h index ce259c0e66..2c9ae523c5 100644 --- a/src/core/internal_network/network.h +++ b/src/core/internal_network/network.h @@ -9,6 +9,7 @@ #include <array> #include <optional> #include <vector> +#include <variant> #include "common/common_funcs.h" #include "common/common_types.h" @@ -124,7 +125,6 @@ std::string IPv4AddressToString(IPv4Address ip_addr); u32 IPv4AddressToInteger(IPv4Address ip_addr); // named to avoid name collision with Windows macro -Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo( - const std::string& host, const std::optional<std::string>& service); +std::variant<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo(const std::string& host, const std::optional<std::string>& service); } // namespace Network |
