diff --git a/Makefile b/Makefile index bad6857..0f3e9a7 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ SOURCES := source INCLUDES := source # Bei jedem Release erhöhen - das Auto-Update vergleicht diese Nummer -VERSION := 3.0.4 +VERSION := 3.0.5 APP_TITLE := MBMNET APP_DESCRIPTION := Dein eigenes 3DS-Netzwerk diff --git a/source/admin.c b/source/admin.c index 3f1cd0e..850f037 100644 --- a/source/admin.c +++ b/source/admin.c @@ -23,20 +23,29 @@ static char why[96] = "Werkzeuge: kein MBMNET-Konto angemeldet."; // warum (no static void worker(void *arg) { (void)arg; - // 1. Anmelde-Nachweis vom Konto-Dienst (für das gerade angemeldete Konto) + // 1. Anmelde-Nachweis vom Konto-Dienst (für das gerade angemeldete Konto). "shared": danach für jeden + // Prozess abholbar - nur für diesen Prozess angefordert, gab act ihn nicht heraus (E0A14CCE). Handle done; snprintf(why, sizeof(why), "Werkzeuge: Server prüft noch ..."); if (R_FAILED(svcCreateEvent(&done, RESET_ONESHOT))) return; u32 pid = 0; svcGetProcessId(&pid, CUR_PROCESS_HANDLE); - Result rc = ACT_AcquireIndependentServiceToken(0xFE, CLIENT_ID, 0, false, false, pid, done); - if (R_SUCCEEDED(rc)) rc = svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000); + Result rc = ACT_AcquireIndependentServiceToken(0xFE, CLIENT_ID, 0, false, true, pid, done); + Result wait = R_SUCCEEDED(rc) ? svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000) : rc; svcCloseHandle(done); - if (rc != 0) { snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis nicht erhalten (%08lX).", (unsigned long)rc); return; } + if (wait != 0) { snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis nicht erhalten (%08lX).", (unsigned long)wait); return; } + // Ergebnis der Anfrage beim Account-Server (z. B. abgelehnt oder keine Verbindung) + Result result = ACT_GetLastResponseResult(); static IndependentServiceTokenV1 tok; memset(&tok, 0, sizeof(tok)); - if (R_FAILED(rc = ACT_GetIndependentServiceToken(&tok)) || !tok.token[0]) { - snprintf(why, sizeof(why), "Werkzeuge: Anmelde-Nachweis leer (%08lX).", (unsigned long)rc); + rc = ACT_GetIndependentServiceToken(&tok); + // Notlösung: aus dem Zwischenspeicher von act (gerade eben geholt) + if (R_FAILED(rc) || !tok.token[0]) rc = ACT_GetCachedIndependentServiceToken(&tok, 0xFE, CLIENT_ID, 3600, false, true); + if (R_FAILED(rc) || !tok.token[0]) { + Result shown = R_FAILED(result) ? result : rc; + Result code = ACT_ResultToErrorCode(shown); // 022-XXXX wie in den Einstellungen + snprintf(why, sizeof(why), "Werkzeuge: kein Anmelde-Nachweis vom Server\n(%08lX, Fehler %03lu-%04lu).", + (unsigned long)shown, (unsigned long)(code / 10000), (unsigned long)(code % 10000)); return; }