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); }