Files
AnyPS5/core/libs/tests/GuestUserServiceLifecycle.cpp
T
hugodearaujoandClaude Opus 5.5 bae9b32ce3 fix(libSceUserService): report initialization the way the console does
Measured on a PS5 (firmware 13.60): before sceUserServiceInitialize and
after sceUserServiceTerminate, the login list, the event poll and
Terminate return NOT_INITIALIZED (0x80960002); a second Initialize
returns ALREADY_INITIALIZED (0x80960003); a new initialization reports
the initial user's login again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 12:10:35 -03:00

55 lines
2.0 KiB
C++

#include "SceTypes.hpp"
#include "prx/libSceUserService/UserService.hpp"
#include <cstdlib>
#include <cstring>
extern "C" {
int APS5_VABI sceUserServiceInitialize(const void* params);
int APS5_VABI sceUserServiceTerminate(void);
int APS5_VABI sceUserServiceGetLoginUserIdList(UserServiceLoginUserIdList* user_id_list);
int APS5_VABI sceUserServiceGetEvent(SceUserServiceEvent* event);
}
namespace {
void Require(bool value) { if (!value) std::abort(); }
void RequireNotInitialized() {
UserServiceLoginUserIdList list{};
Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_ERROR_NOT_INITIALIZED);
SceUserServiceEvent event{};
std::memset(&event, 0xAA, sizeof(event));
Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NOT_INITIALIZED);
Require(event.user_id == static_cast<int>(0xAAAAAAAAu));
Require(sceUserServiceGetEvent(nullptr) == USER_SERVICE_ERROR_NOT_INITIALIZED);
}
void RequireLoginOnce() {
SceUserServiceEvent event{};
Require(sceUserServiceGetEvent(&event) == USER_SERVICE_OK);
Require(event.event_type == 0 && event.user_id == USER_SERVICE_INITIAL_USER_ID);
Require(sceUserServiceGetEvent(&event) == USER_SERVICE_ERROR_NO_EVENT);
}
}
int main() {
RequireNotInitialized();
Require(sceUserServiceTerminate() == USER_SERVICE_ERROR_NOT_INITIALIZED);
Require(sceUserServiceInitialize(nullptr) == USER_SERVICE_OK);
Require(sceUserServiceInitialize(nullptr) == USER_SERVICE_ERROR_ALREADY_INITIALIZED);
UserServiceLoginUserIdList list{};
Require(sceUserServiceGetLoginUserIdList(&list) == USER_SERVICE_OK);
Require(list.user_id[0] == USER_SERVICE_INITIAL_USER_ID);
RequireLoginOnce();
Require(sceUserServiceTerminate() == USER_SERVICE_OK);
Require(sceUserServiceTerminate() == USER_SERVICE_ERROR_NOT_INITIALIZED);
RequireNotInitialized();
Require(sceUserServiceInitialize(nullptr) == USER_SERVICE_OK);
RequireLoginOnce();
Require(sceUserServiceTerminate() == USER_SERVICE_OK);
}