From 652e5e3df0afabffe1ff0d61f475d847a1d7f6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Fri, 6 Aug 2021 21:08:31 +0200 Subject: network: fix fcntl cmds F_SETFL/F_GETFL are the correct commands to set a socket to be non-blocking --- src/core/network/network.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 375bc79ec..5dc9cdc14 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -182,7 +182,7 @@ linger MakeLinger(bool enable, u32 linger_value) { } bool EnableNonBlock(int fd, bool enable) { - int flags = fcntl(fd, F_GETFD); + int flags = fcntl(fd, F_GETFL); if (flags == -1) { return false; } @@ -191,7 +191,7 @@ bool EnableNonBlock(int fd, bool enable) { } else { flags &= ~O_NONBLOCK; } - return fcntl(fd, F_SETFD, flags) == 0; + return fcntl(fd, F_SETFL, flags) == 0; } Errno TranslateNativeError(int e) { -- cgit v1.2.3 From ddeb8d854e6d2a5c0c82c21b8fbe46390b09098a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Sat, 7 Aug 2021 02:54:25 +0200 Subject: network: GetAndLogLastError: ignore Errno::AGAIN If non-blocking sockets are used, they generate a lot of Errno::AGAIN errors when they didn't receive any data. These errors shouldn't be logged. --- src/core/network/network.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 5dc9cdc14..7b038041e 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -227,8 +227,12 @@ Errno GetAndLogLastError() { #else int e = errno; #endif + const Errno err = TranslateNativeError(e); + if (err == Errno::AGAIN) { + return err; + } LOG_ERROR(Network, "Socket operation error: {}", NativeErrorToString(e)); - return TranslateNativeError(e); + return err; } int TranslateDomain(Domain domain) { -- cgit v1.2.3 From 1e98e738283ccb81303d29305188ac825ecfcba9 Mon Sep 17 00:00:00 2001 From: spholz <44805808+spholz@users.noreply.github.com> Date: Thu, 12 Aug 2021 21:32:53 +0200 Subject: configuration: add option to select network interface This commit renames the "Services" tab to "Network" and adds a combobox that allows the user to select the network interface that yuzu should use. This new setting is now used to get the local IP address in Network::GetHostIPv4Address. This prevents yuzu from selecting the wrong network interface and thus using the wrong IP address. The return type of Network::GetHostIPv4Adress has also been changed. --- src/core/network/network.cpp | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 7b038041e..67ecf57bd 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -10,8 +10,8 @@ #include "common/common_funcs.h" #ifdef _WIN32 -#define _WINSOCK_DEPRECATED_NO_WARNINGS // gethostname #include +#include #elif YUZU_UNIX #include #include @@ -19,6 +19,7 @@ #include #include #include +#include #include #else #error "Unimplemented platform" @@ -27,7 +28,9 @@ #include "common/assert.h" #include "common/common_types.h" #include "common/logging/log.h" +#include "common/settings.h" #include "core/network/network.h" +#include "core/network/network_interface.h" #include "core/network/sockets.h" namespace Network { @@ -357,27 +360,27 @@ NetworkInstance::~NetworkInstance() { Finalize(); } -std::pair GetHostIPv4Address() { - std::array name{}; - if (gethostname(name.data(), static_cast(name.size()) - 1) == SOCKET_ERROR) { - return {IPv4Address{}, GetAndLogLastError()}; - } +std::optional GetHostIPv4Address() { + const std::string& selected_network_interface = Settings::values.network_interface.GetValue(); + const auto network_interfaces = Network::GetAvailableNetworkInterfaces(); + ASSERT_MSG(network_interfaces.size() > 0, "GetAvailableNetworkInterfaces returned no interfaces"); - hostent* const ent = gethostbyname(name.data()); - if (!ent) { - return {IPv4Address{}, GetAndLogLastError()}; - } - if (ent->h_addr_list == nullptr) { - UNIMPLEMENTED_MSG("No addr provided in hostent->h_addr_list"); - return {IPv4Address{}, Errno::SUCCESS}; - } - if (ent->h_length != sizeof(in_addr)) { - UNIMPLEMENTED_MSG("Unexpected size={} in hostent->h_length", ent->h_length); - } - in_addr addr; - std::memcpy(&addr, ent->h_addr_list[0], sizeof(addr)); - return {TranslateIPv4(addr), Errno::SUCCESS}; + const auto res = std::ranges::find_if(network_interfaces, + [&selected_network_interface](const auto& interface) { + return interface.name == selected_network_interface; + }); + + if (res != network_interfaces.end()) { + char ip_addr[16]; + ASSERT(inet_ntop(AF_INET, &res->ip_address, ip_addr, sizeof(ip_addr)) != nullptr); + LOG_INFO(Network, "IP address: {}", ip_addr); + + return TranslateIPv4(res->ip_address); + } else { + LOG_ERROR(Network, "Couldn't find selected interface \"{}\"", selected_network_interface); + return {}; + } } std::pair Poll(std::vector& pollfds, s32 timeout) { -- cgit v1.2.3 From 21743daf38f19160baa2da0e939a4e945dd57228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Thu, 12 Aug 2021 22:15:48 +0200 Subject: network: correct formatting in network.cpp and network_interface.cpp --- src/core/network/network.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 67ecf57bd..9a4ac7e83 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -13,13 +13,13 @@ #include #include #elif YUZU_UNIX +#include #include #include #include #include #include #include -#include #include #else #error "Unimplemented platform" @@ -363,8 +363,8 @@ NetworkInstance::~NetworkInstance() { std::optional GetHostIPv4Address() { const std::string& selected_network_interface = Settings::values.network_interface.GetValue(); const auto network_interfaces = Network::GetAvailableNetworkInterfaces(); - ASSERT_MSG(network_interfaces.size() > 0, "GetAvailableNetworkInterfaces returned no interfaces"); - + ASSERT_MSG(network_interfaces.size() > 0, + "GetAvailableNetworkInterfaces returned no interfaces"); const auto res = std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& interface) { -- cgit v1.2.3 From 765e97c34765330e1f05ee1b5a9a58a43f9c8921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Fri, 13 Aug 2021 00:28:44 +0200 Subject: network: initialize ip_addr in GetHostIPv4Address() --- src/core/network/network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 9a4ac7e83..6571005d0 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -372,7 +372,7 @@ std::optional GetHostIPv4Address() { }); if (res != network_interfaces.end()) { - char ip_addr[16]; + char ip_addr[16] = {}; ASSERT(inet_ntop(AF_INET, &res->ip_address, ip_addr, sizeof(ip_addr)) != nullptr); LOG_INFO(Network, "IP address: {}", ip_addr); -- cgit v1.2.3 From b18e1d031f5c14a84b70f25ac97a01602ff1e063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Fri, 13 Aug 2021 11:21:34 +0200 Subject: network: don't use assert to check if no network interfaces are returned --- src/core/network/network.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 6571005d0..4669130ee 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -363,8 +363,10 @@ NetworkInstance::~NetworkInstance() { std::optional GetHostIPv4Address() { const std::string& selected_network_interface = Settings::values.network_interface.GetValue(); const auto network_interfaces = Network::GetAvailableNetworkInterfaces(); - ASSERT_MSG(network_interfaces.size() > 0, - "GetAvailableNetworkInterfaces returned no interfaces"); + if (network_interfaces.size() == 0) { + LOG_ERROR(Network, "GetAvailableNetworkInterfaces returned no interfaces"); + return {}; + } const auto res = std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& interface) { -- cgit v1.2.3 From e660334a21a697754f3a9859da5e32c327a7d3e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Fri, 13 Aug 2021 11:23:50 +0200 Subject: network: fix mingw-w64 build The header "combaseapi.h" of mingw-w64 defines "interface" as "struct". --- src/core/network/network.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 4669130ee..71583159a 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -368,10 +368,10 @@ std::optional GetHostIPv4Address() { return {}; } - const auto res = std::ranges::find_if(network_interfaces, - [&selected_network_interface](const auto& interface) { - return interface.name == selected_network_interface; - }); + const auto res = + std::ranges::find_if(network_interfaces, [&selected_network_interface](const auto& iface) { + return iface.name == selected_network_interface; + }); if (res != network_interfaces.end()) { char ip_addr[16] = {}; -- cgit v1.2.3 From 70419f7a17880fd1e7834e7fe6e1aad14b0565bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Holz?= Date: Mon, 16 Aug 2021 10:32:25 +0200 Subject: network: retrieve subnet mask and gateway info --- src/core/network/network.cpp | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'src/core/network/network.cpp') diff --git a/src/core/network/network.cpp b/src/core/network/network.cpp index 71583159a..4732d4485 100644 --- a/src/core/network/network.cpp +++ b/src/core/network/network.cpp @@ -50,11 +50,6 @@ void Finalize() { WSACleanup(); } -constexpr IPv4Address TranslateIPv4(in_addr addr) { - auto& bytes = addr.S_un.S_un_b; - return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4}; -} - sockaddr TranslateFromSockAddrIn(SockAddrIn input) { sockaddr_in result; @@ -141,12 +136,6 @@ void Initialize() {} void Finalize() {} -constexpr IPv4Address TranslateIPv4(in_addr addr) { - const u32 bytes = addr.s_addr; - return IPv4Address{static_cast(bytes), static_cast(bytes >> 8), - static_cast(bytes >> 16), static_cast(bytes >> 24)}; -} - sockaddr TranslateFromSockAddrIn(SockAddrIn input) { sockaddr_in result; -- cgit v1.2.3