Merge pull request #150 from Megazig/master
PS service key type and socket functionality
This commit is contained in:
commit
50541234b4
@ -17,10 +17,11 @@ typedef enum
|
||||
ps_KEYSLOT_31,
|
||||
ps_KEYSLOT_38,
|
||||
ps_KEYSLOT_32,
|
||||
ps_KEYSLOT_39,
|
||||
ps_KEYSLOT_39_DLP,
|
||||
ps_KEYSLOT_2E,
|
||||
ps_KEYSLOT_INVALID,
|
||||
ps_KEYSLOT_36
|
||||
ps_KEYSLOT_36,
|
||||
ps_KEYSLOT_39_NFC
|
||||
} ps_aes_keytypes;
|
||||
|
||||
/*
|
||||
@ -73,4 +74,4 @@ About: Gets a 32bit device id, it's used for some key slot inits
|
||||
|
||||
device_id ptr to where the device id is written to
|
||||
*/
|
||||
Result PS_GetDeviceId(u32* device_id);
|
||||
Result PS_GetDeviceId(u32* device_id);
|
||||
|
@ -14,6 +14,7 @@ struct hostent {
|
||||
int h_addrtype;
|
||||
int h_length;
|
||||
char **h_addr_list;
|
||||
char *h_addr;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
@ -22,6 +23,7 @@ extern "C" {
|
||||
|
||||
extern int h_errno;
|
||||
struct hostent* gethostbyname(const char *name);
|
||||
struct hostent* gethostbyaddr(const void *addr, socklen_t len, int type);
|
||||
void herror(const char *s);
|
||||
const char* hstrerror(int err);
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
Handle SOCU_handle = 0;
|
||||
Handle socMemhandle = 0;
|
||||
int h_errno = 0;
|
||||
|
||||
//This is based on the array from libogc network_wii.c.
|
||||
static u8 _net_error_code_map[] = {
|
||||
|
72
libctru/source/services/soc/soc_gethostbyaddr.c
Normal file
72
libctru/source/services/soc/soc_gethostbyaddr.c
Normal file
@ -0,0 +1,72 @@
|
||||
#include "soc_common.h"
|
||||
#include <netdb.h>
|
||||
|
||||
#define MAX_HOSTENT_RESULTS 16
|
||||
static struct hostent SOC_hostent;
|
||||
static char *SOC_hostent_results[MAX_HOSTENT_RESULTS+1];
|
||||
static char *SOC_hostent_alias = NULL;
|
||||
|
||||
struct hostent* gethostbyaddr(const void *addr, socklen_t len, int type)
|
||||
{
|
||||
int ret = 0;
|
||||
u32 *cmdbuf = getThreadCommandBuffer();
|
||||
u32 saved_threadstorage[2];
|
||||
static u8 outbuf[0x1A88];
|
||||
|
||||
h_errno = 0;
|
||||
|
||||
cmdbuf[0] = 0x000E00C2;
|
||||
cmdbuf[1] = len;
|
||||
cmdbuf[2] = type;
|
||||
cmdbuf[3] = sizeof(outbuf);
|
||||
cmdbuf[4] = (len << 14) | 0x1002;
|
||||
cmdbuf[5] = (u32)addr;
|
||||
|
||||
saved_threadstorage[0] = cmdbuf[0x100>>2];
|
||||
saved_threadstorage[1] = cmdbuf[0x104>>2];
|
||||
|
||||
cmdbuf[0x100>>2] = (sizeof(outbuf) << 14) | 2;
|
||||
cmdbuf[0x104>>2] = (u32)outbuf;
|
||||
|
||||
ret = svcSendSyncRequest(SOCU_handle);
|
||||
if(ret != 0) {
|
||||
h_errno = NO_RECOVERY;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
cmdbuf[0x100>>2] = saved_threadstorage[0];
|
||||
cmdbuf[0x104>>2] = saved_threadstorage[1];
|
||||
|
||||
ret = (int)cmdbuf[1];
|
||||
if(ret == 0)
|
||||
ret = _net_convert_error(cmdbuf[2]);
|
||||
|
||||
if(ret < 0) {
|
||||
/* TODO: set h_errno based on ret */
|
||||
h_errno = HOST_NOT_FOUND;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u32 num_results, i;
|
||||
memcpy(&num_results, (char*)outbuf+4, sizeof(num_results));
|
||||
if(num_results > MAX_HOSTENT_RESULTS)
|
||||
num_results = MAX_HOSTENT_RESULTS;
|
||||
|
||||
SOC_hostent.h_name = (char*)outbuf + 8;
|
||||
SOC_hostent.h_aliases = &SOC_hostent_alias;
|
||||
SOC_hostent.h_addrtype = AF_INET;
|
||||
SOC_hostent.h_length = 4;
|
||||
SOC_hostent.h_addr_list = SOC_hostent_results;
|
||||
|
||||
SOC_hostent_alias = NULL;
|
||||
|
||||
for(i = 0; i < num_results; ++i)
|
||||
SOC_hostent_results[i] = (char*)outbuf + 0x1908 + i*0x10;
|
||||
SOC_hostent_results[num_results] = NULL;
|
||||
|
||||
SOC_hostent.h_addr = SOC_hostent.h_addr_list[0];
|
||||
|
||||
return &SOC_hostent;
|
||||
}
|
||||
|
@ -6,8 +6,6 @@ static struct hostent SOC_hostent;
|
||||
static char *SOC_hostent_results[MAX_HOSTENT_RESULTS+1];
|
||||
static char *SOC_hostent_alias = NULL;
|
||||
|
||||
int h_errno = 0;
|
||||
|
||||
struct hostent* gethostbyname(const char *name)
|
||||
{
|
||||
int ret = 0;
|
||||
@ -66,5 +64,7 @@ struct hostent* gethostbyname(const char *name)
|
||||
SOC_hostent_results[i] = (char*)outbuf + 0x1908 + i*0x10;
|
||||
SOC_hostent_results[num_results] = NULL;
|
||||
|
||||
SOC_hostent.h_addr = SOC_hostent.h_addr_list[0];
|
||||
|
||||
return &SOC_hostent;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user