move h_errno definition to soc_common

add h_addr member to hostent structure
implement gethostbyaddr
This commit is contained in:
megazig 2015-08-18 16:55:50 -05:00
parent 033b353128
commit 8e7606692d
4 changed files with 77 additions and 2 deletions

View File

@ -14,6 +14,7 @@ struct hostent {
int h_addrtype; int h_addrtype;
int h_length; int h_length;
char **h_addr_list; char **h_addr_list;
char *h_addr;
}; };
#ifdef __cplusplus #ifdef __cplusplus
@ -22,6 +23,7 @@ extern "C" {
extern int h_errno; extern int h_errno;
struct hostent* gethostbyname(const char *name); struct hostent* gethostbyname(const char *name);
struct hostent* gethostbyaddr(const char *addr, socklen_t len, int type);
void herror(const char *s); void herror(const char *s);
const char* hstrerror(int err); const char* hstrerror(int err);

View File

@ -4,6 +4,7 @@
Handle SOCU_handle = 0; Handle SOCU_handle = 0;
Handle socMemhandle = 0; Handle socMemhandle = 0;
int h_errno = 0;
//This is based on the array from libogc network_wii.c. //This is based on the array from libogc network_wii.c.
static u8 _net_error_code_map[] = { static u8 _net_error_code_map[] = {

View 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 char *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;
}

View File

@ -6,8 +6,6 @@ static struct hostent SOC_hostent;
static char *SOC_hostent_results[MAX_HOSTENT_RESULTS+1]; static char *SOC_hostent_results[MAX_HOSTENT_RESULTS+1];
static char *SOC_hostent_alias = NULL; static char *SOC_hostent_alias = NULL;
int h_errno = 0;
struct hostent* gethostbyname(const char *name) struct hostent* gethostbyname(const char *name)
{ {
int ret = 0; 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[i] = (char*)outbuf + 0x1908 + i*0x10;
SOC_hostent_results[num_results] = NULL; SOC_hostent_results[num_results] = NULL;
SOC_hostent.h_addr = SOC_hostent.h_addr_list[0];
return &SOC_hostent; return &SOC_hostent;
} }