diff --git a/src/core/hle/service/nifm/nifm.cpp b/src/core/hle/service/nifm/nifm.cpp index efada9b807..ae09788dc0 100644 --- a/src/core/hle/service/nifm/nifm.cpp +++ b/src/core/hle/service/nifm/nifm.cpp @@ -430,8 +430,8 @@ private: LOG_DEBUG(Service_NIFM, "(STUBBED) called"); const auto result = [this] { - const auto has_connection = Network::GetHostIPv4Address().has_value() && - !Settings::values.airplane_mode.GetValue(); + const auto has_connection = Network::GetHostIPv4Address().has_value() + && (Network::IsConnectedToAnyRoom() || !Settings::values.airplane_mode.GetValue()); switch (state) { case RequestState::NotSubmitted: return has_connection ? ResultSuccess : ResultNetworkCommunicationDisabled; @@ -925,10 +925,10 @@ void IGeneralService::SetWirelessCommunicationEnabled(HLERequestContext& ctx) { } void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) { - const bool en = !Settings::values.airplane_mode.GetValue(); + bool const enabled = (!Settings::values.airplane_mode.GetValue() || Network::IsConnectedToAnyRoom()); IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - rb.Push(en); + rb.Push(enabled); } void IGeneralService::GetInternetConnectionStatus(HLERequestContext& ctx) { @@ -972,7 +972,7 @@ void IGeneralService::IsEthernetCommunicationEnabled(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - if (Network::GetHostIPv4Address().has_value() && !Settings::values.airplane_mode.GetValue()) { + if (Network::GetHostIPv4Address().has_value() && (!Settings::values.airplane_mode.GetValue() || Network::IsConnectedToAnyRoom())) { rb.Push(1); } else { rb.Push(0); @@ -984,7 +984,7 @@ void IGeneralService::IsAnyInternetRequestAccepted(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); - if (Network::GetHostIPv4Address().has_value() && !Settings::values.airplane_mode.GetValue()) { + if (Network::GetHostIPv4Address().has_value() && (!Settings::values.airplane_mode.GetValue() || Network::IsConnectedToAnyRoom())) { 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 0137a3be66..79e28b6e22 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -547,21 +547,19 @@ std::pair BSD_USA::SocketImpl(Domain domain, Type type, Protocol pro LOG_INFO(Service, "New socket fd={}", fd); - auto room_member = Network::GetRoomMember().lock(); - if (room_member && room_member->IsConnected()) { + if (Network::IsConnectedToAnyRoom()) { descriptor.socket = std::make_shared(); } else { descriptor.socket = std::make_shared(); + if (Settings::values.airplane_mode.GetValue() && descriptor.is_connection_based) { + LOG_ERROR(Service, "Airplane mode is enabled, cannot create socket"); + return {-1, Errno::NOTCONN}; + } } 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/emu_net_state.cpp b/src/core/internal_network/emu_net_state.cpp index bd92bf18f7..aa420b5a3e 100644 --- a/src/core/internal_network/emu_net_state.cpp +++ b/src/core/internal_network/emu_net_state.cpp @@ -53,7 +53,7 @@ void RefreshFromHost() { return; } - st.wifi_enabled = !Settings::values.airplane_mode.GetValue(); + st.wifi_enabled = (!Settings::values.airplane_mode.GetValue() || Network::IsConnectedToAnyRoom()); st.ethernet_enabled = sel->kind == HostAdapterKind::Ethernet; st.connected = true; diff --git a/src/network/network.cpp b/src/network/network.cpp index 4946fcf3dd..4a3b45e3f8 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -32,6 +32,11 @@ std::weak_ptr GetRoomMember() { return g_room_member; } +bool IsConnectedToAnyRoom() { + auto const room_member = GetRoomMember().lock(); + return room_member && room_member->IsConnected(); +} + void Shutdown() { if (g_room_member) { if (g_room_member->IsConnected()) diff --git a/src/network/network.h b/src/network/network.h index 84db8d6d17..6a8c814cc2 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -20,6 +20,8 @@ std::weak_ptr GetRoom(); /// Returns a pointer to the room member handle std::weak_ptr GetRoomMember(); +bool IsConnectedToAnyRoom(); + /// Unregisters the network device, the room, and the room member and shut them down. void Shutdown();