diff --git a/libctru/include/3ds/services/am.h b/libctru/include/3ds/services/am.h index dc301b1..d02650b 100644 --- a/libctru/include/3ds/services/am.h +++ b/libctru/include/3ds/services/am.h @@ -56,9 +56,12 @@ typedef struct { u64 titlesFreeSpace; ///< Free space for titles. } AM_TWLPartitionInfo; -/// Initializes AM. +/// Initializes AM. This doesn't initialize with "am:app", see amAppInit(). Result amInit(void); +/// Initializes AM with a service which has access to the amapp-commands. This should only be used when using the amapp commands, not non-amapp AM commands. +Result amAppInit(void); + /// Exits AM. void amExit(void); diff --git a/libctru/source/services/am.c b/libctru/source/services/am.c index 6e3f452..cc51e25 100644 --- a/libctru/source/services/am.c +++ b/libctru/source/services/am.c @@ -20,6 +20,18 @@ Result amInit(void) ret = srvGetServiceHandle(&amHandle, "am:net"); if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:u"); if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:sys"); + if (R_FAILED(ret)) AtomicDecrement(&amRefCount); + + return ret; +} + +Result amAppInit(void) +{ + Result ret; + + if (AtomicPostIncrement(&amRefCount)) return 0; + + ret = srvGetServiceHandle(&amHandle, "am:sys"); if (R_FAILED(ret)) ret = srvGetServiceHandle(&amHandle, "am:app"); if (R_FAILED(ret)) AtomicDecrement(&amRefCount);