extern int __system_argc;
extern char** __system_argv;
+static bool sdmcInitialised = false;
+
/*! Initialize SDMC device */
Result sdmcInit(void)
{
- Result rc;
+ Result rc = 0;
+ if (sdmcInitialised) return rc;
rc = FSUSER_OpenArchive(NULL, &sdmcArchive);
}
}
+ sdmcInitialised = true;
+
return rc;
}
/*! Clean up SDMC device */
Result sdmcExit(void)
{
- Result rc;
+ Result rc = 0;
+
+ if (!sdmcInitialised) return rc;
rc = FSUSER_CloseArchive(NULL, &sdmcArchive);
if(rc == 0)
svcExitThread();
}
+static bool aptInitialised = false;
+
Result aptInit(void)
{
Result ret=0;
+ if (aptInitialised) return ret;
+
// Initialize APT stuff, escape load screen.
ret = __apt_initservicehandle();
if(ret!=0)return ret;
} else
aptAppStarted();
+ aptInitialised = true;
+
return 0;
}
void aptExit()
{
+ if (!aptInitialised) return;
+
if(!(__system_runflags&RUNFLAG_APTWORKAROUND))aptAppletUtility_Exit_RetToApp(0);
// This is only executed when application-termination was triggered via the home-menu power-off screen.
*
* @returns error
*/
+
+static bool fsInitialised = false;
+
Result
fsInit(void)
{
- Result ret;
+ Result ret = 0;
+
+ if (fsInitialised) return ret;
+
if((ret=srvGetServiceHandle(&fsuHandle, "fs:USER"))!=0)return ret;
if(__get_handle_from_list("fs:USER")==0)ret=FSUSER_Initialize(NULL);
+
+ fsInitialised = true;
+
return ret;
}
Result
fsExit(void)
{
+ if (!fsInitialised) return 0;
+
return svcCloseHandle(fsuHandle);
}
static accelVector aVec;
static angularRate gRate;
+static bool hidInitialised;
Result hidInit(u32* sharedMem)
{
u8 val=0;
+ Result ret=0;
+
+ if(hidInitialised) return ret;
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
- Result ret=0;
// Request service.
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
void hidExit()
{
+ if(!hidInitialised) return;
+
// Unmap HID sharedmem and close handles.
u8 val=0;
int i; for(i=0; i<5; i++)svcCloseHandle(hidEvents[i]);
__service_ptr->num = 0;
}
+
Result srvInit()
{
Result rc = 0;
+ if(g_srv_handle != 0) return rc;
+
if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
if((rc = srvRegisterClient())) {
--- /dev/null
+#include <3ds/types.h>
+#include <3ds/srv.h>
+#include <3ds/gfx.h>
+#include <3ds/sdmc.h>
+#include <3ds/services/apt.h>
+#include <3ds/services/fs.h>
+#include <3ds/services/hid.h>
+
+void __attribute__((weak)) __appExit() {
+ // Exit services
+ sdmcExit();
+ fsExit();
+
+ hidExit();
+ aptExit();
+ srvExit();
+}
--- /dev/null
+#include <3ds/types.h>
+#include <3ds/srv.h>
+#include <3ds/gfx.h>
+#include <3ds/sdmc.h>
+#include <3ds/services/apt.h>
+#include <3ds/services/fs.h>
+#include <3ds/services/hid.h>
+
+void __attribute__((weak)) __appInit() {
+ // Initialize services
+ srvInit();
+ aptInit();
+ hidInit(NULL);
+
+ fsInit();
+ sdmcInit();
+}
extern void (*__system_retAddr)(void);
void __destroy_handle_list(void);
+void __appExit();
void __libc_fini_array(void);
// Run the global destructors
__libc_fini_array();
- // TODO: APT exit goes here
+ __appExit();
// Unmap the linear heap
svcControlMemory(&tmp, __linear_heap, 0x0, __linear_heap_size, MEMOP_FREE, 0x0);
void __system_allocateHeaps();
void __system_initArgv();
+void __appInit();
// newlib definitions we need
void __libc_init_array(void);
// Build argc/argv if present
__system_initArgv();
- // TODO: APT init goes here
+ __appInit();
// Run the global constructors
__libc_init_array();