From 726e1e756d4e11a0064bca4117d31d9fe287453f Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sat, 28 Jun 2025 16:04:13 +0000 Subject: [PATCH] [nifm, bsd] add airplane mode functionality to a new nifm call and fix local files (#225) There is a cmd `IsAnyInternetRequestAccepted` which is called by games like DOOM to check if internet access is available. Adds the newly added airplane mode there. Also, moved down the airplane mode check on bsd to also check if it's a local file request, if it is, let it connect. (SMO guide web applet for example) + adds a check in IRequest if airplane mode is active, which then results in an not succeeding requests. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/225 Co-authored-by: Maufeat Co-committed-by: Maufeat --- src/core/hle/service/nifm/nifm.cpp | 7 ++++--- src/core/hle/service/sockets/bsd.cpp | 10 +++++----- src/core/internal_network/wifi_scanner.cpp | 20 +++++++++++--------- src/core/internal_network/wifi_scanner.h | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index d04e2a2954..e18afdb88b 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -428,7 +428,8 @@ private: LOG_WARNING(Service_NIFM, "(STUBBED) called"); const auto result = [this] { - const auto has_connection = Network::GetHostIPv4Address().has_value(); + const auto has_connection = Network::GetHostIPv4Address().has_value() && + !Settings::values.airplane_mode.GetValue(); switch (state) { case RequestState::NotSubmitted: return has_connection ? ResultSuccess : ResultNetworkCommunicationDisabled; @@ -947,7 +948,7 @@ void IGeneralService::IsEthernetCommunicationEnabled(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - if (Network::GetHostIPv4Address().has_value()) { + if (Network::GetHostIPv4Address().has_value() && !Settings::values.airplane_mode.GetValue()) { rb.Push(1); } else { rb.Push(0); @@ -959,7 +960,7 @@ void IGeneralService::IsAnyInternetRequestAccepted(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - if (Network::GetHostIPv4Address().has_value()) { + if (Network::GetHostIPv4Address().has_value() && !Settings::values.airplane_mode.GetValue()) { rb.Push(1); } else { rb.Push(0); diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 07df83caad..a5e1378197 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -491,11 +491,6 @@ void BSD::ExecuteWork(HLERequestContext& ctx, Work work) { std::pair BSD::SocketImpl(Domain domain, Type type, Protocol protocol) { - if (Settings::values.airplane_mode.GetValue()) { - LOG_ERROR(Service, "Airplane mode is enabled, cannot create socket"); - return {-1, Errno::NOTCONN}; - } - if (type == Type::SEQPACKET) { UNIMPLEMENTED_MSG("SOCK_SEQPACKET errno management"); } else if (type == Type::RAW && (domain != Domain::INET || protocol != Protocol::ICMP)) { @@ -528,6 +523,11 @@ std::pair BSD::SocketImpl(Domain domain, Type type, Protocol protoco descriptor.socket->Initialize(Translate(domain), Translate(type), Translate(protocol)); descriptor.is_connection_based = IsConnectionBased(type); + if (Settings::values.airplane_mode.GetValue() && descriptor.is_connection_based) { + LOG_ERROR(Service, "Airplane mode is enabled, cannot create socket"); + return {-1, Errno::NOTCONN}; + } + return {fd, Errno::SUCCESS}; } diff --git a/src/core/internal_network/wifi_scanner.cpp b/src/core/internal_network/wifi_scanner.cpp index bab644d161..df9bc92910 100644 --- a/src/core/internal_network/wifi_scanner.cpp +++ b/src/core/internal_network/wifi_scanner.cpp @@ -11,20 +11,22 @@ using namespace std::chrono_literals; -namespace Network { - #ifdef _WIN32 #define NOMINMAX #include #include #pragma comment(lib, "wlanapi.lib") +#endif +namespace Network { + +#ifdef _WIN32 static u8 QualityToPercent(DWORD q) { return static_cast(q); } -static std::vector ScanWifiWin(std::chrono::milliseconds deadline) { - std::vector out; +static std::vector ScanWifiWin(std::chrono::milliseconds deadline) { + std::vector out; HANDLE hClient{}; DWORD ver{}; @@ -57,7 +59,7 @@ static std::vector ScanWifiWin(std::chrono::milliseconds deadline) { for (DWORD n = 0; n < list->dwNumberOfItems; ++n) { const auto& nw = list->Network[n]; - ScanData sd{}; + Network::ScanData sd{}; sd.ssid_len = static_cast(nw.dot11Ssid.uSSIDLength); std::memcpy(sd.ssid, nw.dot11Ssid.ucSSID, sd.ssid_len); sd.quality = QualityToPercent(nw.wlanSignalQuality); @@ -112,8 +114,8 @@ static int wifi_callback(int skfd, char* ifname, char* args[], int count) } // TODO(crueter, Maufeat): Check if driver supports wireless extensions, fallback to nl80211 if not -static std::vector ScanWifiLinux(std::chrono::milliseconds deadline) { - std::vector out; +static std::vector ScanWifiLinux(std::chrono::milliseconds deadline) { + std::vector out; int sock = iw_sockets_open(); if (sock < 0) { LOG_ERROR(Network, "iw_sockets_open() failed"); @@ -152,7 +154,7 @@ static std::vector ScanWifiLinux(std::chrono::milliseconds deadline) { if (!ws->b.has_essid) continue; - ScanData sd{}; + Network::ScanData sd{}; sd.ssid_len = static_cast(std::min(ws->b.essid_len, 0x20)); std::memcpy(sd.ssid, ws->b.essid, sd.ssid_len); sd.quality = QualityToPercent(range, ws); @@ -172,7 +174,7 @@ static std::vector ScanWifiLinux(std::chrono::milliseconds deadline) { } #endif /* linux */ -std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline) { #ifdef _WIN32 return ScanWifiWin(deadline); #elif defined(__linux__) && !defined(ANDROID) diff --git a/src/core/internal_network/wifi_scanner.h b/src/core/internal_network/wifi_scanner.h index a57edc303b..adf2fe2de3 100644 --- a/src/core/internal_network/wifi_scanner.h +++ b/src/core/internal_network/wifi_scanner.h @@ -18,5 +18,5 @@ struct ScanData { }; static_assert(sizeof(ScanData) <= 0x2C, "ScanData layout changed – update conversions!"); -std::vector ScanWifiNetworks(std::chrono::milliseconds deadline); +std::vector ScanWifiNetworks(std::chrono::milliseconds deadline); }