|
|
|
@ -13,6 +13,7 @@
|
|
|
|
|
#include "core/hle/kernel/errors.h"
|
|
|
|
|
#include "core/hle/kernel/hle_ipc.h"
|
|
|
|
|
#include "core/hle/kernel/semaphore.h"
|
|
|
|
|
#include "core/hle/kernel/server_port.h"
|
|
|
|
|
#include "core/hle/kernel/server_session.h"
|
|
|
|
|
#include "core/hle/service/sm/sm.h"
|
|
|
|
|
#include "core/hle/service/sm/srv.h"
|
|
|
|
@ -184,12 +185,35 @@ void SRV::PublishToSubscriber(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
flags);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SRV::RegisterService(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp(ctx, 0x3, 4, 0);
|
|
|
|
|
|
|
|
|
|
auto name_buf = rp.PopRaw<std::array<char, 8>>();
|
|
|
|
|
size_t name_len = rp.Pop<u32>();
|
|
|
|
|
u32 max_sessions = rp.Pop<u32>();
|
|
|
|
|
|
|
|
|
|
std::string name(name_buf.data(), std::min(name_len, name_buf.size()));
|
|
|
|
|
|
|
|
|
|
auto port = service_manager->RegisterService(name, max_sessions);
|
|
|
|
|
|
|
|
|
|
if (port.Failed()) {
|
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 0);
|
|
|
|
|
rb.Push(port.Code());
|
|
|
|
|
LOG_ERROR(Service_SRV, "called service=%s -> error 0x%08X", name.c_str(), port.Code().raw);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPC::RequestBuilder rb = rp.MakeBuilder(1, 2);
|
|
|
|
|
rb.Push(RESULT_SUCCESS);
|
|
|
|
|
rb.PushObjects(port.Unwrap());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SRV::SRV(std::shared_ptr<ServiceManager> service_manager)
|
|
|
|
|
: ServiceFramework("srv:", 4), service_manager(std::move(service_manager)) {
|
|
|
|
|
static const FunctionInfo functions[] = {
|
|
|
|
|
{0x00010002, &SRV::RegisterClient, "RegisterClient"},
|
|
|
|
|
{0x00020000, &SRV::EnableNotification, "EnableNotification"},
|
|
|
|
|
{0x00030100, nullptr, "RegisterService"},
|
|
|
|
|
{0x00030100, &SRV::RegisterService, "RegisterService"},
|
|
|
|
|
{0x000400C0, nullptr, "UnregisterService"},
|
|
|
|
|
{0x00050100, &SRV::GetServiceHandle, "GetServiceHandle"},
|
|
|
|
|
{0x000600C2, nullptr, "RegisterPort"},
|
|
|
|
|