diff --git a/rpcs3/Emu/Cell/Modules/sceNp.cpp b/rpcs3/Emu/Cell/Modules/sceNp.cpp index 916aa44a40..ee365b54ae 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.cpp +++ b/rpcs3/Emu/Cell/Modules/sceNp.cpp @@ -6962,7 +6962,7 @@ error_code sceNpSignalingGetConnectionFromPeerAddress(u32 ctx_id, np_in_addr_t p return CELL_OK; } -error_code sceNpSignalingGetLocalNetInfo(u32 ctx_id, vm::ptr info) +error_code sceNpSignalingGetLocalNetInfo(u32 ctx_id, vm::ptr info) { sceNp.warning("sceNpSignalingGetLocalNetInfo(ctx_id=%d, info=*0x%x)", ctx_id, info); @@ -6973,7 +6973,8 @@ error_code sceNpSignalingGetLocalNetInfo(u32 ctx_id, vm::ptrsize != sizeof(SceNpSignalingNetInfo)) + // Library has backward support for a version of SceNpSignalingNetInfo without npport + if (!info || (info->size != sizeof(SceNpSignalingNetInfo) && info->size != sizeof(SceNpSignalingNetInfoDeprecated))) { return SCE_NP_SIGNALING_ERROR_INVALID_ARGUMENT; } @@ -6985,7 +6986,12 @@ error_code sceNpSignalingGetLocalNetInfo(u32 ctx_id, vm::ptrnat_status = SCE_NP_SIGNALING_NETINFO_NAT_STATUS_TYPE2; info->upnp_status = nph.get_upnp_status(); info->npport_status = SCE_NP_SIGNALING_NETINFO_NPPORT_STATUS_OPEN; - info->npport = SCE_NP_PORT; + + if (info->size == sizeof(SceNpSignalingNetInfo)) + { + auto new_info = vm::unsafe_ptr_cast(info); + new_info->npport = SCE_NP_PORT; + } return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/sceNp.h b/rpcs3/Emu/Cell/Modules/sceNp.h index bc2ab7c6e2..12ca388ba2 100644 --- a/rpcs3/Emu/Cell/Modules/sceNp.h +++ b/rpcs3/Emu/Cell/Modules/sceNp.h @@ -1584,6 +1584,16 @@ struct SceNpSignalingNetInfo be_t npport; }; +struct SceNpSignalingNetInfoDeprecated +{ + be_t size; + be_t local_addr; // in_addr + be_t mapped_addr; // in_addr + be_t nat_status; + be_t upnp_status; + be_t npport_status; +}; + struct SceNpCustomMenuAction { be_t options; diff --git a/rpcs3/Emu/NP/np_helpers.cpp b/rpcs3/Emu/NP/np_helpers.cpp index 8fb9025c23..5167a30fb5 100644 --- a/rpcs3/Emu/NP/np_helpers.cpp +++ b/rpcs3/Emu/NP/np_helpers.cpp @@ -24,7 +24,7 @@ namespace np std::string communication_id_to_string(const SceNpCommunicationId& communicationId) { - const std::string com_id_data(communicationId.data, communicationId.data + 9); + std::string_view com_id_data(communicationId.data, communicationId.data + 9); return fmt::format("%s_%02d", com_id_data, communicationId.num); }