libctru/libctru/source/services/ac.c

287 lines
6.1 KiB
C
Raw Normal View History

2014-04-22 04:58:05 +02:00
#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/ac.h>
2015-09-09 16:00:46 +02:00
#include <3ds/ipc.h>
2014-04-22 04:58:05 +02:00
2014-08-25 18:14:48 +02:00
static Handle acHandle;
static int acRefCount;
2014-08-25 18:14:48 +02:00
Result acInit(void)
2014-08-25 18:14:48 +02:00
{
Result ret;
if (AtomicPostIncrement(&acRefCount)) return 0;
2019-07-21 18:03:03 +02:00
// ac:i has the most commands, then ac:u
ret = srvGetServiceHandle(&acHandle, "ac:i");
if(R_FAILED(ret)) ret = srvGetServiceHandle(&acHandle, "ac:u");
if(R_FAILED(ret)) AtomicDecrement(&acRefCount);
return ret;
2014-08-25 18:14:48 +02:00
}
void acExit(void)
2014-08-25 18:14:48 +02:00
{
if (AtomicDecrement(&acRefCount)) return;
svcCloseHandle(acHandle);
2014-08-25 18:14:48 +02:00
}
2015-11-11 05:33:37 +01:00
Result acWaitInternetConnection(void)
2014-04-22 04:58:05 +02:00
{
2015-11-11 05:33:37 +01:00
Result ret = 0;
u32 status = 0;
while(R_SUCCEEDED(ret = ACU_GetWifiStatus(&status)) && status == 0);
return ret;
2014-04-22 04:58:05 +02:00
}
Result ACU_GetWifiStatus(u32 *out)
2014-04-22 04:58:05 +02:00
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xD,0,0); // 0xD0000
2014-04-22 04:58:05 +02:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
2014-04-22 04:58:05 +02:00
*out = cmdbuf[2];
return (Result)cmdbuf[1];
}
2017-12-01 17:58:08 +01:00
Result ACU_GetStatus(u32 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
2017-12-01 17:58:08 +01:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*out = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_GetSecurityMode(acSecurityMode *mode)
2017-12-01 17:58:08 +01:00
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x33,0,0); // 0x330000
2017-12-01 17:58:08 +01:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*mode = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_GetSSID(char *SSID)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
cmdbuf[0] = IPC_MakeHeader(0x34,0,0); // 0x340000
staticbufs[0] = IPC_Desc_StaticBuffer(0x20, 0);
staticbufs[1] = (u32)SSID;
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
2017-12-01 17:58:08 +01:00
return (Result)cmdbuf[1];
}
Result ACU_GetSSIDLength(u32 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x35,0,0); // 0x350000
2017-12-01 17:58:08 +01:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*out = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_GetProxyEnable(bool *enable)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x36,0,0); // 0x360000
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*enable = cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1];
}
Result ACU_GetProxyPort(u32 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x38,0,0); // 0x380000
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
*out = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_GetProxyUserName(char *username)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
cmdbuf[0] = IPC_MakeHeader(0x3A,0,0); // 0x3A0000
staticbufs[0] = IPC_Desc_StaticBuffer(0x20, 0);
staticbufs[1] = (u32)username;
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
return (Result)cmdbuf[1];
}
Result ACU_GetProxyPassword(char *password)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
cmdbuf[0] = IPC_MakeHeader(0x3B,0,0); // 0x3B0000
staticbufs[0] = IPC_Desc_StaticBuffer(0x20, 0);
staticbufs[1] = (u32)password;
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
return (Result)cmdbuf[1];
}
Result ACU_GetLastErrorCode(u32* errorCode)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
if(errorCode) *errorCode = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_GetLastDetailErrorCode(u32* errorCode)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xB,0,0); // 0xB0000
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
if(errorCode) *errorCode = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result ACU_CreateDefaultConfig(acuConfig* config)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x10000
staticbufs[0] = IPC_Desc_StaticBuffer(0x200, 0);
staticbufs[1] = (u32)config;
if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
return (Result)cmdbuf[1];
}
Result ACU_SetNetworkArea(acuConfig* config, u8 area)
{
2019-07-21 22:52:13 +02:00
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
2019-07-21 22:52:13 +02:00
cmdbuf[0] = IPC_MakeHeader(0x25,1,2); // 0x250042
cmdbuf[1] = area;
cmdbuf[2] = IPC_Desc_StaticBuffer(0x200, 0);
cmdbuf[3] = (u32)config;
staticbufs[0] = IPC_Desc_StaticBuffer(0x200, 0);
staticbufs[1] = (u32)config;
2019-07-21 22:52:13 +02:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
2019-07-21 22:52:13 +02:00
return (Result)cmdbuf[1];
}
Result ACU_SetAllowApType(acuConfig* config, u8 type)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
cmdbuf[0] = IPC_MakeHeader(0x22,1,2); // 0x220042
cmdbuf[1] = type;
cmdbuf[2] = IPC_Desc_StaticBuffer(0x200, 0);
cmdbuf[3] = (u32)config;
staticbufs[0] = IPC_Desc_StaticBuffer(0x200, 0);
staticbufs[1] = (u32)config;
if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
return (Result)cmdbuf[1];
}
Result ACU_SetRequestEulaVersion(acuConfig* config)
{
2019-07-21 22:52:13 +02:00
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
2019-07-21 22:52:13 +02:00
cmdbuf[0] = IPC_MakeHeader(0x2D,2,2); // 0x2D0082
cmdbuf[1] = 0;
cmdbuf[2] = 0;
cmdbuf[3] = IPC_Desc_StaticBuffer(0x200, 0);
cmdbuf[4] = (u32)config;
staticbufs[0] = IPC_Desc_StaticBuffer(0x200, 0);
staticbufs[1] = (u32)config;
2019-07-21 22:52:13 +02:00
if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
2019-07-21 22:52:13 +02:00
return (Result)cmdbuf[1];
}
Result ACU_ConnectAsync(const acuConfig* config, Handle connectionHandle)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,0,6); // 0x40006
cmdbuf[1] = 0x20;
cmdbuf[3] = 0;
cmdbuf[4] = connectionHandle;
cmdbuf[5] = IPC_Desc_StaticBuffer(0x200, 1);
cmdbuf[6] = (u32)config;
if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
return (Result)cmdbuf[1];
}