mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 16:43:05 -05:00
Without network a signaling context is never prepared. Like ActivateSession, ActivateUser and GetConnectionInfo, sceNpSessionSignalingRequestPrepare returns 0x80552D06 (UNAVAILABLE) and writes no request id. sceNpSessionSignalingGetLocalNetInfo no longer throws: it returns 0x80552D06 and leaves the info unchanged, as libSceNetCtl reports neither an address nor NAT info offline. A null request id or info returns 0x80552D02, as a null context id does in CreateContext2. GetConnectionStatus still throws. The new guest_np_session_signaling test checks the error codes and that failed calls leave the request id and info unchanged; it is registered in a new libSceNpSessionSignaling CMakeLists.txt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
52 lines
2.1 KiB
C++
52 lines
2.1 KiB
C++
#include "prx/libc/include/general/VabiMacros.hpp"
|
|
#include <cstdint>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
|
|
extern "C" {
|
|
int APS5_VABI sceNpSessionSignalingInitialize(void* param);
|
|
int APS5_VABI sceNpSessionSignalingCreateContext2(const void* param, std::uint32_t* contextId);
|
|
std::int32_t APS5_VABI sceNpSessionSignalingGetLocalNetInfo(std::int32_t contextId, void* info);
|
|
int APS5_VABI sceNpSessionSignalingRequestPrepare(std::uint32_t contextId, std::uint32_t* requestId);
|
|
int APS5_VABI sceNpSessionSignalingTerminate(void);
|
|
}
|
|
|
|
namespace {
|
|
|
|
constexpr int InvalidArgument = static_cast<int>(0x80552D02u);
|
|
constexpr int Unavailable = static_cast<int>(0x80552D06u);
|
|
|
|
void Require(bool condition, const char* message) {
|
|
if (!condition) {
|
|
std::fprintf(stderr, "NpSessionSignaling: %s\n", message);
|
|
std::abort();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
int main() {
|
|
unsigned char initializeParam[32] = {};
|
|
Require(sceNpSessionSignalingInitialize(initializeParam) == 0, "initialize failed");
|
|
unsigned char contextParam[64] = {};
|
|
std::uint32_t contextId = 0;
|
|
Require(sceNpSessionSignalingCreateContext2(contextParam, &contextId) == 0, "context creation failed");
|
|
|
|
std::uint32_t requestId = 0xa5a5a5a5u;
|
|
Require(sceNpSessionSignalingRequestPrepare(contextId, nullptr) == InvalidArgument, "null request id");
|
|
Require(sceNpSessionSignalingRequestPrepare(contextId, &requestId) == Unavailable, "prepare without network");
|
|
Require(requestId == 0xa5a5a5a5u, "failed prepare wrote a request id");
|
|
|
|
const auto netContextId = static_cast<std::int32_t>(contextId);
|
|
unsigned char info[16];
|
|
std::memset(info, 0xa5, sizeof(info));
|
|
unsigned char untouched[sizeof(info)];
|
|
std::memcpy(untouched, info, sizeof(info));
|
|
Require(sceNpSessionSignalingGetLocalNetInfo(netContextId, nullptr) == InvalidArgument, "null info");
|
|
Require(sceNpSessionSignalingGetLocalNetInfo(netContextId, info) == Unavailable, "local net info without network");
|
|
Require(std::memcmp(info, untouched, sizeof(info)) == 0, "failed query modified the info");
|
|
|
|
Require(sceNpSessionSignalingTerminate() == 0, "terminate failed");
|
|
}
|