libnx/nx/source/services/nifm.c
shadowninja108 84408ba5b9 Cleanup/Refcounting
Added nifm prefixes
Added refcounting
Removed internal methods from include
Cleaned up spacing, comments
2018-06-03 17:08:46 -07:00

152 lines
2.6 KiB
C

/**
* @file nifm.h
* @brief Network interface service IPC wrapper.
* @author shadowninja108
* @copyright libnx Authors
*/
#include "services/nifm.h"
#include "arm/atomics.h"
static Service g_nifmSrv;
static IGeneralService g_nifmIGS;
static u64 g_refCnt;
static Result _nifmCreateGeneralService(IGeneralService * out, u64 in);
static Result _nifmCreateGeneralServiceOld(IGeneralService * out);
Result nifmInitialize(void) {
atomicIncrement64(&g_refCnt);
if (serviceIsActive( & g_nifmSrv))
return 0;
Result rc;
rc = smGetService( & g_nifmSrv, "nifm:u");
if (R_SUCCEEDED(rc)) {
if (kernelAbove200())
rc = _nifmCreateGeneralService( & g_nifmIGS, 0); // What does this parameter do?
else
rc = _nifmCreateGeneralServiceOld( & g_nifmIGS);
}
if (R_FAILED(rc))
nifmExit();
return rc;
}
void nifmExit(void) {
if (atomicDecrement64(&g_refCnt) == 0){
serviceClose( & g_nifmIGS.s);
serviceClose( & g_nifmSrv);
}
}
Result nifmGetCurrentIpAddress(u32 * out) {
IpcCommand c;
ipcInitialize( & c);
struct {
u64 magic;
u64 cmd_id;
} * raw;
raw = ipcPrepareHeader( & c, sizeof( * raw));
raw -> magic = SFCI_MAGIC;
raw -> cmd_id = 12;
Result rc = serviceIpcDispatch(&g_nifmIGS.s);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse( & r);
struct {
u64 magic;
u64 result;
u32 out;
} * resp = r.Raw;
rc = resp -> result; * out = resp -> out;
}
return rc;
}
static Result _nifmCreateGeneralService(IGeneralService * out, u64 in) {
IpcCommand c;
ipcInitialize( & c);
ipcSendPid( & c);
struct {
u64 magic;
u64 cmd_id;
u64 param;
}
PACKED * raw;
raw = ipcPrepareHeader( & c, sizeof( * raw));
raw -> magic = SFCI_MAGIC;
raw -> cmd_id = 5;
raw -> param = in ;
Result rc = serviceIpcDispatch( & g_nifmSrv);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct {
u64 magic;
u64 result;
} * resp = r.Raw;
rc = resp -> result;
if (R_SUCCEEDED(rc))
serviceCreate(&out->s, r.Handles[0]);
}
return rc;
}
static Result _nifmCreateGeneralServiceOld(IGeneralService * out) {
IpcCommand c;
ipcInitialize(&c);
struct {
u64 magic;
u64 cmd_id;
}
PACKED * raw;
raw = ipcPrepareHeader( & c, sizeof( * raw));
raw -> magic = SFCI_MAGIC;
raw -> cmd_id = 4;
Result rc = serviceIpcDispatch( & g_nifmSrv);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct {
u64 magic;
u64 result;
} * resp = r.Raw;
rc = resp -> result;
if (R_SUCCEEDED(rc))
serviceCreate(&out->s, r.Handles[0]);
}
return rc;
}