From a6c409ac696b82746dfba15903ec94482fed4eec Mon Sep 17 00:00:00 2001 From: exelix Date: Fri, 15 Mar 2019 21:07:47 +0100 Subject: [PATCH] add nifmSetServiceType to set which nifm service to init --- nx/include/switch/services/nifm.h | 13 +++++++++++ nx/source/services/nifm.c | 37 ++++++++++++++----------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/nx/include/switch/services/nifm.h b/nx/include/switch/services/nifm.h index eb28b900..eae72a4f 100644 --- a/nx/include/switch/services/nifm.h +++ b/nx/include/switch/services/nifm.h @@ -9,6 +9,19 @@ #include "../kernel/ipc.h" #include "../services/sm.h" +typedef enum { + NifmServiceType_NotInitialized = 0, + NifmServiceType_User = 1, + NifmServiceType_System = 2, + NifmServiceType_Admin = 3, +} NifmServiceType; + +/** + * @brief Sets the \ref NifmServiceType for initialization. Call this function before \ref nifmInitialize. + * @note By default nifm:u will be used. + */ +void nifmSetServiceType(NifmServiceType serviceType); + Result nifmInitialize(void); void nifmExit(void); diff --git a/nx/source/services/nifm.c b/nx/source/services/nifm.c index 9b8fb25f..9ae96c4d 100644 --- a/nx/source/services/nifm.c +++ b/nx/source/services/nifm.c @@ -9,13 +9,6 @@ #include "arm/atomics.h" #include "runtime/hosversion.h" -typedef enum { - NifmServiceType_NotInitialized = 0, - NifmServiceType_User = 1, - NifmServiceType_System = 2, - NifmServiceType_Admin = 3, -} NifmServiceType; - static NifmServiceType g_nifmServiceType = NifmServiceType_NotInitialized; static Service g_nifmSrv; @@ -25,25 +18,29 @@ static u64 g_refCnt; static Result _nifmCreateGeneralService(Service* out, u64 in); static Result _nifmCreateGeneralServiceOld(Service* out); +void nifmSetServiceType(NifmServiceType serviceType) { + g_nifmServiceType = serviceType; +} + Result nifmInitialize(void) { atomicIncrement64(&g_refCnt); if (serviceIsActive(&g_nifmSrv)) return 0; - Result rc = smGetService(&g_nifmSrv, "nifm:a"); - g_nifmServiceType = NifmServiceType_Admin; - - if (R_FAILED(rc)) - { - rc = smGetService(&g_nifmSrv, "nifm:s"); - g_nifmServiceType = NifmServiceType_System; - } - - if (R_FAILED(rc)) - { - rc = smGetService(&g_nifmSrv, "nifm:u"); - g_nifmServiceType = NifmServiceType_User; + Result rc = 0; + switch (g_nifmServiceType) { + case NifmServiceType_NotInitialized: + case NifmServiceType_User: + g_nifmServiceType = NifmServiceType_User; + rc = smGetService(&g_nifmSrv, "nifm:u"); + break; + case NifmServiceType_System: + rc = smGetService(&g_nifmSrv, "nifm:s"); + break; + case NifmServiceType_Admin: + rc = smGetService(&g_nifmSrv, "nifm:a"); + break; } if (R_SUCCEEDED(rc)) rc = serviceConvertToDomain(&g_nifmSrv);