Refactor soc to use errno.

This commit is contained in:
mtheall 2015-01-24 14:14:06 -06:00 committed by Dave Murphy
parent 67f991e452
commit e75fd8b648
27 changed files with 433 additions and 289 deletions

View File

@ -1,11 +1,8 @@
#pragma once
Result SOC_Initialize(u32 *context_addr, u32 context_size);//Example context_size: 0x48000. The specified context buffer can no longer be accessed by the process which called this function, since the userland permissions for this block are set to no-access.
Result SOC_Shutdown();
int SOC_GetErrno();
Result SOC_Shutdown(void);
int SOC_GetErrno(void);
/* this is supposed to be in unistd.h but newlib only puts it for cygwin */
long gethostid(void);

View File

@ -22,6 +22,8 @@ extern "C" {
extern int h_errno;
struct hostent* gethostbyname(const char *name);
void herror(const char *s);
const char* hstrerror(int err);
#ifdef __cplusplus
}

View File

@ -1,4 +1,5 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
@ -12,23 +13,20 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
u32 saved_threadstorage[2];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
dev = FindDevice("soc:");
if(dev < 0)
{
SOCU_errno = -ENODEV;
if(dev < 0) {
errno = ENODEV;
return -1;
}
fd = __alloc_handle(sizeof(__handle) + sizeof(Handle));
if(fd < 0)
{
SOCU_errno = -ENOMEM;
if(fd < 0) {
errno = ENOMEM;
return -1;
}
@ -49,9 +47,10 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle)) != 0)
{
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
__release_handle(fd);
errno = SYNC_ERROR;
return ret;
}
@ -63,18 +62,16 @@ int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0)
SOCU_errno = ret;
errno = -ret;
if(ret >= 0 && addr != NULL)
{
if(ret >= 0 && addr != NULL) {
addr->sa_family = tmpaddr[1];
if(*addrlen > tmpaddr[0])
*addrlen = tmpaddr[0];
memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
}
if(ret < 0)
{
if(ret < 0) {
__release_handle(fd);
return -1;
}

View File

@ -4,32 +4,26 @@
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
int ret=0;
int tmp_addrlen=0;
int ret = 0;
int tmp_addrlen = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u8 tmpaddr[0x1c];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
memset(tmpaddr, 0, 0x1c);
if(addr->sa_family == AF_INET)
{
tmp_addrlen = 8;
}
else
{
tmp_addrlen = 0x1c;
}
if(addrlen < tmp_addrlen)
{
SOCU_errno = EINVAL;
if(addrlen < tmp_addrlen) {
errno = EINVAL;
return -1;
}
@ -44,12 +38,20 @@ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
cmdbuf[5] = (((u32)tmp_addrlen)<<14) | 2;
cmdbuf[6] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return 0;
}

View File

@ -1,12 +1,13 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
#include <unistd.h>
int closesocket(int sockfd)
{
int fd = soc_get_fd(sockfd);
if(fd < 0)
{
SOCU_errno = fd;
if(fd < 0) {
errno = -fd;
return -1;
}

View File

@ -3,7 +3,6 @@
#include <sys/iosupport.h>
Handle SOCU_handle = 0;
int SOCU_errno = 0;
Handle socMemhandle = 0;
//This is based on the array from libogc network_wii.c.
@ -92,14 +91,11 @@ static u8 _net_error_code_map[] = {
//This is based on the function from libogc network_wii.c.
s32 _net_convert_error(s32 sock_retval)
{
if (sock_retval >= 0) return sock_retval;
if (sock_retval < -sizeof(_net_error_code_map)
|| !_net_error_code_map[-sock_retval])
return NET_UNKNOWN_ERROR_OFFSET + sock_retval;
if(sock_retval >= 0)
return sock_retval;
if(sock_retval < -sizeof(_net_error_code_map)
|| !_net_error_code_map[-sock_retval])
return NET_UNKNOWN_ERROR_OFFSET + sock_retval;
return -_net_error_code_map[-sock_retval];
}
int SOC_GetErrno(void)
{
return SOCU_errno;
}

View File

@ -8,12 +8,13 @@
#include <3ds/srv.h>
#include <3ds/services/soc.h>
#define SYNC_ERROR ENODEV
int __alloc_handle(int size);
__handle *__get_handle(int fd);
void __release_handle(int fd);
extern Handle SOCU_handle;
extern int SOCU_errno;
extern Handle socMemhandle;
static inline int

View File

@ -4,32 +4,26 @@
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
int ret=0;
int tmp_addrlen=0;
int ret = 0;
int tmp_addrlen = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u8 tmpaddr[0x1c];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
memset(tmpaddr, 0, 0x1c);
if(addr->sa_family == AF_INET)
{
tmp_addrlen = 8;
}
else
{
tmp_addrlen = 0x1c;
}
if(addrlen < tmp_addrlen)
{
SOCU_errno = -EINVAL;
if(addrlen < tmp_addrlen) {
errno = EINVAL;
return -1;
}
@ -44,12 +38,20 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
cmdbuf[5] = (((u32)tmp_addrlen)<<14) | 2;
cmdbuf[6] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return 0;
}

View File

@ -12,7 +12,8 @@ static int from_3ds(int flags)
{
int newflags = 0;
if(flags & O_NONBLOCK_3DS) newflags |= O_NONBLOCK;
if(flags & O_NONBLOCK_3DS)
newflags |= O_NONBLOCK;
/* add other flag translations here, but I have only seen O_NONBLOCK */
return newflags;
@ -22,7 +23,8 @@ static int to_3ds(int flags)
{
int newflags = 0;
if(flags & O_NONBLOCK) newflags |= O_NONBLOCK_3DS;
if(flags & O_NONBLOCK)
newflags |= O_NONBLOCK_3DS;
/* add other flag translations here, but I have only seen O_NONBLOCK */
return newflags;
@ -37,34 +39,29 @@ int fcntl(int sockfd, int cmd, ...)
va_list args;
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
if(cmd != F_GETFL && cmd != F_SETFL)
{
SOCU_errno = -EINVAL;
if(cmd != F_GETFL && cmd != F_SETFL) {
errno = EINVAL;
return -1;
}
va_start(args, cmd);
if(cmd == F_SETFL)
{
if(cmd == F_SETFL) {
va_start(args, cmd);
arg = va_arg(args, int);
va_end(args);
/* make sure they only used known flags */
if(arg & ~ALL_FLAGS)
{
SOCU_errno = -EINVAL;
va_end(args);
if(arg & ~ALL_FLAGS) {
errno = EINVAL;
return -1;
}
arg = to_3ds(arg);
}
va_end(args);
cmdbuf[0] = 0x001300C2;
cmdbuf[1] = (u32)sockfd;
@ -72,20 +69,22 @@ int fcntl(int sockfd, int cmd, ...)
cmdbuf[3] = (u32)arg;
cmdbuf[4] = 0x20;
if((ret = svcSendSyncRequest(SOCU_handle)) != 0)
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0)
SOCU_errno = ret;
if(ret < 0)
if(ret < 0) {
errno = ret;
return -1;
}
if(ret & ~ALL_3DS)
{
if(ret & ~ALL_3DS) {
/* somehow report unknown flags */
}

View File

@ -10,11 +10,13 @@ int h_errno = 0;
struct hostent* gethostbyname(const char *name)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 saved_threadstorage[2];
static u8 outbuf[0x1A88];
h_errno = 0;
cmdbuf[0] = 0x000D0082;
cmdbuf[1] = strlen(name)+1;
cmdbuf[2] = sizeof(outbuf);
@ -27,17 +29,25 @@ struct hostent* gethostbyname(const char *name)
cmdbuf[0x100>>2] = (sizeof(outbuf) << 14) | 2;
cmdbuf[0x104>>2] = (u32)outbuf;
if(( ret = svcSendSyncRequest(SOCU_handle))!=0)return NULL;
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)SOCU_errno = ret;
/* TODO: set h_errno based on SOCU_errno */
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret<0)return NULL;
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));

View File

@ -1,16 +1,22 @@
#include "soc_common.h"
#include <errno.h>
long gethostid(void)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00160000;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return -1;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = cmdbuf[2];
if(ret == 0)
ret = cmdbuf[2];
return ret;
}

View File

@ -1,17 +1,17 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 saved_threadstorage[2];
u8 tmpaddr[0x1c];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -26,23 +26,29 @@ int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
cmdbuf[0x100>>2] = (0x1c<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
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)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret==0)
{
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
memset(addr, 0, sizeof(struct sockaddr));
addr->sa_family = tmpaddr[1];
memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
if(*addrlen > tmpaddr[0])
*addrlen = tmpaddr[0];
memset(addr, 0, sizeof(struct sockaddr));
addr->sa_family = tmpaddr[1];
memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
return ret;
}

View File

@ -1,17 +1,17 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 saved_threadstorage[2];
u8 tmpaddr[0x1c];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -26,23 +26,29 @@ int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
cmdbuf[0x100>>2] = (0x1c<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
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)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret==0)
{
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
memset(addr, 0, sizeof(struct sockaddr));
addr->sa_family = tmpaddr[1];
memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
if(*addrlen > tmpaddr[0])
*addrlen = tmpaddr[0];
memset(addr, 0, sizeof(struct sockaddr));
addr->sa_family = tmpaddr[1];
memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
return ret;
}

View File

@ -1,16 +1,16 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 saved_threadstorage[2];
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -27,17 +27,25 @@ int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optl
cmdbuf[0x100>>2] = ((*optlen)<<14) | 2;
cmdbuf[0x104>>2] = (u32)optval;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
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)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret==0)*optlen = cmdbuf[3];
if(ret < 0) {
errno = -ret;
return -1;
}
*optlen = cmdbuf[3];
if(ret<0)return -1;
return ret;
}

View File

@ -0,0 +1,10 @@
#include "soc_common.h"
#include <netdb.h>
#include <stdio.h>
void herror(const char *s) {
if(s)
fiprintf(stderr, "%s\n", hstrerror(h_errno));
else
fiprintf(stderr, "%s: %s\n", s, hstrerror(h_errno));
}

View File

@ -0,0 +1,26 @@
#include "soc_common.h"
#include <netdb.h>
static const struct
{
int err;
const char *str;
} error_strings[] =
{
{ 0, "Resolver Error 0 (no error)", },
{ HOST_NOT_FOUND, "Unknown host", },
{ NO_DATA, "No address associated with name", },
{ NO_RECOVERY, "Unknown server error", },
{ TRY_AGAIN, "Host name lookup failure", },
};
static const size_t num_error_strings = sizeof(error_strings)/sizeof(error_strings[0]);
const char* hstrerror(int err) {
size_t i;
for(i = 0; i < num_error_strings; ++i) {
if(error_strings[i].err == err)
return error_strings[i].str;
}
return "Unknown resolver error";
}

View File

@ -1,4 +1,5 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
static int soc_open(struct _reent *r, void *fileStruct, const char *path, int flags, int mode);
@ -39,7 +40,7 @@ soc_devoptab =
static Result socu_cmd1(Handle memhandle, u32 memsize)
{
Result ret=0;
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00010044;
@ -48,14 +49,18 @@ static Result socu_cmd1(Handle memhandle, u32 memsize)
cmdbuf[4] = 0;
cmdbuf[5] = memhandle;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
return cmdbuf[1];
}
Result SOC_Initialize(u32 *context_addr, u32 context_size)
{
Result ret=0;
Result ret = 0;
/* check that the "soc" device doesn't already exist */
int dev = FindDevice("soc:");
@ -68,20 +73,19 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)
return dev;
ret = svcCreateMemoryBlock(&socMemhandle, (u32)context_addr, context_size, 0, 3);
if(ret != 0)
{
if(ret != 0) {
RemoveDevice("soc");
return ret;
}
if((ret = srvGetServiceHandle(&SOCU_handle, "soc:U")) != 0)
{
ret = srvGetServiceHandle(&SOCU_handle, "soc:U");
if(ret != 0) {
RemoveDevice("soc");
return ret;
}
if((ret = socu_cmd1(socMemhandle, context_size)) != 0)
{
ret = socu_cmd1(socMemhandle, context_size);
if(ret != 0) {
RemoveDevice("soc");
return ret;
}
@ -91,13 +95,17 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)
Result SOC_Shutdown(void)
{
Result ret=0;
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
int dev;
cmdbuf[0] = 0x00190000;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
svcCloseHandle(SOCU_handle);
svcCloseHandle(socMemhandle);
@ -116,6 +124,7 @@ soc_open(struct _reent *r,
int flags,
int mode)
{
r->_errno = ENOSYS;
return -1;
}
@ -125,20 +134,28 @@ soc_close(struct _reent *r,
{
Handle sockfd = *(Handle*)fd;
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000B0042;
cmdbuf[1] = (u32)sockfd;
cmdbuf[2] = 0x20;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret =_net_convert_error(cmdbuf[2]);
SOCU_errno = ret;
if(ret == 0)
ret =_net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret!=0)return -1;
return 0;
}

View File

@ -12,17 +12,17 @@ int ioctl(int sockfd, int request, ...)
va_list ap;
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
va_start(ap, request);
switch(request) {
case FIONBIO:
va_start(ap, request);
value = va_arg(ap, int*);
va_end(ap);
if(value == NULL) {
errno = EFAULT;
va_end(ap);
@ -30,17 +30,13 @@ int ioctl(int sockfd, int request, ...)
}
flags = fcntl(sockfd, F_GETFL, 0);
if(flags == -1) {
errno = SOC_GetErrno();
va_end(ap);
if(flags == -1)
return -1;
}
if(*value) ret = fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
else ret = fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK);
if(ret != 0)
errno = SOC_GetErrno();
if(*value)
ret = fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
else
ret = fcntl(sockfd, F_SETFL, flags & ~O_NONBLOCK);
break;
@ -50,7 +46,5 @@ int ioctl(int sockfd, int request, ...)
break;
}
va_end(ap);
return ret;
}

View File

@ -1,15 +1,15 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int listen(int sockfd, int max_connections)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -18,12 +18,20 @@ int listen(int sockfd, int max_connections)
cmdbuf[2] = (u32)max_connections;
cmdbuf[3] = 0x20;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret!=0)return -1;
return 0;
}

View File

@ -1,4 +1,5 @@
#include "soc_common.h"
#include <errno.h>
#include <poll.h>
#include <stdlib.h>
#include <stdio.h>
@ -11,30 +12,27 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
u32 *cmdbuf = getThreadCommandBuffer();
u32 saved_threadstorage[2];
if(nfds == 0)
{
SOCU_errno = -EINVAL;
if(nfds == 0) {
errno = EINVAL;
return -1;
}
struct pollfd *tmp_fds = (struct pollfd*)malloc(sizeof(struct pollfd) * nfds);
if(tmp_fds == NULL)
{
SOCU_errno = -ENOMEM;
if(tmp_fds == NULL) {
errno = ENOMEM;
return -1;
}
memcpy(tmp_fds, fds, sizeof(struct pollfd) * nfds);
for(i = 0; i < nfds; ++i)
{
for(i = 0; i < nfds; ++i) {
tmp_fds[i].fd = soc_get_fd(fds[i].fd);
if(tmp_fds[i].fd < 0)
{
SOCU_errno = tmp_fds[i].fd;
if(tmp_fds[i].fd < 0) {
errno = -tmp_fds[i].fd;
free(tmp_fds);
return -1;
}
tmp_fds[i].revents = 0;
}
cmdbuf[0] = 0x00140084;
@ -50,26 +48,30 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
cmdbuf[0x100>>2] = (size<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmp_fds;
if((ret = svcSendSyncRequest(SOCU_handle)) != 0)
{
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
free(tmp_fds);
errno = SYNC_ERROR;
return ret;
}
for(i = 0; i < nfds; ++i)
{
fds[i].revents = tmp_fds[i].revents;
}
free(tmp_fds);
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)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
free(tmp_fds);
errno = -ret;
return -1;
}
for(i = 0; i < nfds; ++i)
fds[i].revents = tmp_fds[i].revents;
free(tmp_fds);
if(ret<0)return -1;
return ret;
}

View File

@ -1,17 +1,19 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 tmp_addrlen=0;
u32 tmp_addrlen = 0;
u8 tmpaddr[0x1c];
u32 saved_threadstorage[2];
memset(tmpaddr, 0, 0x1c);
if(src_addr)tmp_addrlen = 0x1c;
if(src_addr)
tmp_addrlen = 0x1c;
cmdbuf[0] = 0x00070104;
cmdbuf[1] = (u32)sockfd;
@ -28,35 +30,44 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
cmdbuf[0x100>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x104>>2] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return -1;
}
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)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret>0 && src_addr!=NULL)
{
if(ret < 0) {
errno = -ret;
return -1;
}
if(src_addr != NULL) {
src_addr->sa_family = tmpaddr[1];
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
if(*addrlen > tmpaddr[0])
*addrlen = tmpaddr[0];
memcpy(src_addr->sa_data, &tmpaddr[2], *addrlen - 2);
}
if(ret<0)return -1;
return ret;
}
ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 tmp_addrlen=0;
u32 tmp_addrlen = 0;
u8 tmpaddr[0x1c];
u32 saved_threadstorage[4];
if(src_addr)tmp_addrlen = 0x1c;
if(src_addr)
tmp_addrlen = 0x1c;
memset(tmpaddr, 0, 0x1c);
@ -77,7 +88,11 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
cmdbuf[0x108>>2] = (tmp_addrlen<<14) | 2;
cmdbuf[0x10c>>2] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
cmdbuf[0x100>>2] = saved_threadstorage[0];
cmdbuf[0x104>>2] = saved_threadstorage[1];
@ -85,17 +100,21 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
cmdbuf[0x10c>>2] = saved_threadstorage[3];
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
if(ret<0)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret>0 && src_addr!=NULL)
{
if(ret < 0) {
errno = -ret;
return -1;
}
if(src_addr != NULL) {
src_addr->sa_family = tmpaddr[1];
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
if(*addrlen > tmpaddr[0])
*addrlen = tmpaddr[0];
memcpy(src_addr->sa_data, &tmpaddr[2], *addrlen - 2);
}
if(ret<0)return -1;
return ret;
}
@ -103,12 +122,12 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
{
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
if(len<0x2000)return socuipc_cmd8(sockfd, buf, len, flags, src_addr, addrlen);
if(len < 0x2000)
return socuipc_cmd8(sockfd, buf, len, flags, src_addr, addrlen);
return socuipc_cmd7(sockfd, buf, len, flags, src_addr, addrlen);
}

View File

@ -20,7 +20,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struc
pollinfo = (struct pollfd*)calloc(numfds, sizeof(struct pollfd));
if(pollinfo == NULL) {
SOCU_errno = ENOMEM;
errno = ENOMEM;
return -1;
}
@ -79,7 +79,8 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struc
FD_CLR(i, exceptfds);
}
if(found) ++rc;
if(found)
++rc;
++j;
}
}

View File

@ -4,27 +4,21 @@
ssize_t socuipc_cmd9(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 tmp_addrlen=0;
u32 tmp_addrlen = 0;
u8 tmpaddr[0x1c];
memset(tmpaddr, 0, 0x1c);
if(dest_addr)
{
if(dest_addr) {
if(dest_addr->sa_family == AF_INET)
{
tmp_addrlen = 8;
}
else
{
tmp_addrlen = 0x1c;
}
if(addrlen < tmp_addrlen)
{
SOCU_errno = -EINVAL;
if(addrlen < tmp_addrlen) {
errno = EINVAL;
return -1;
}
@ -44,39 +38,41 @@ ssize_t socuipc_cmd9(int sockfd, const void *buf, size_t len, int flags, const s
cmdbuf[9] = (((u32)len)<<4) | 10;
cmdbuf[10] = (u32)buf;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
if(ret<0)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return ret;
}
ssize_t socuipc_cmda(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 tmp_addrlen=0;
u32 tmp_addrlen = 0;
u8 tmpaddr[0x1c];
memset(tmpaddr, 0, 0x1c);
if(dest_addr)
{
if(dest_addr) {
if(dest_addr->sa_family == AF_INET)
{
tmp_addrlen = 8;
}
else
{
tmp_addrlen = 0x1c;
}
if(addrlen < tmp_addrlen)
{
SOCU_errno = -EINVAL;
if(addrlen < tmp_addrlen) {
errno = EINVAL;
return -1;
}
@ -96,25 +92,33 @@ ssize_t socuipc_cmda(int sockfd, const void *buf, size_t len, int flags, const s
cmdbuf[9] = (tmp_addrlen<<14) | 0x402;
cmdbuf[10] = (u32)tmpaddr;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
if(ret<0)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return ret;
}
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen)
{
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
if(len<0x2000)return socuipc_cmda(sockfd, buf, len, flags, dest_addr, addrlen);
return socuipc_cmd9(sockfd, buf, len, flags, (struct sockaddr*)dest_addr, addrlen);
if(len < 0x2000)
return socuipc_cmda(sockfd, buf, len, flags, dest_addr, addrlen);
return socuipc_cmd9(sockfd, buf, len, flags, dest_addr, addrlen);
}

View File

@ -1,11 +1,18 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
sockfd = soc_get_fd(sockfd);
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
cmdbuf[0] = 0x00120104;
cmdbuf[1] = (u32)sockfd;
cmdbuf[2] = (u32)level;
@ -15,12 +22,20 @@ int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t
cmdbuf[7] = (optlen<<14) | 0x2402;
cmdbuf[8] = (u32)optval;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
if(ret<0)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return ret;
}

View File

@ -1,15 +1,15 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int shutdown(int sockfd, int shutdown_type)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -18,12 +18,20 @@ int shutdown(int sockfd, int shutdown_type)
cmdbuf[2] = (u32)shutdown_type;
cmdbuf[3] = 0x20;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret!=0)return -1;
return 0;
}

View File

@ -1,15 +1,15 @@
#include "soc_common.h"
#include <errno.h>
#include <sys/socket.h>
int sockatmark(int sockfd)
{
int ret=0;
int ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
sockfd = soc_get_fd(sockfd);
if(sockfd < 0)
{
SOCU_errno = sockfd;
if(sockfd < 0) {
errno = -sockfd;
return -1;
}
@ -17,12 +17,20 @@ int sockatmark(int sockfd)
cmdbuf[1] = (u32)sockfd;
cmdbuf[2] = 0x20;
if((ret = svcSendSyncRequest(SOCU_handle))!=0)return ret;
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return -1;
}
ret = (int)cmdbuf[1];
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
if(ret<0)SOCU_errno = ret;
if(ret == 0)
ret = _net_convert_error(cmdbuf[2]);
if(ret < 0) {
errno = -ret;
return -1;
}
if(ret<0)return -1;
return ret;
}

View File

@ -5,7 +5,7 @@
int socket(int domain, int type, int protocol)
{
int ret=0;
int ret = 0;
int fd, dev;
__handle *handle;
u32 *cmdbuf = getThreadCommandBuffer();
@ -17,16 +17,14 @@ int socket(int domain, int type, int protocol)
cmdbuf[4] = 0x20;
dev = FindDevice("soc:");
if(dev < 0)
{
SOCU_errno = -ENODEV;
if(dev < 0) {
errno = ENODEV;
return -1;
}
fd = __alloc_handle(sizeof(__handle) + sizeof(Handle));
if(fd < 0)
{
SOCU_errno = -ENOMEM;
if(fd < 0) {
errno = ENOMEM;
return -1;
}
@ -34,17 +32,18 @@ int socket(int domain, int type, int protocol)
handle->device = dev;
handle->fileStruct = ((void *)handle) + sizeof(__handle);
if((ret = svcSendSyncRequest(SOCU_handle)) != 0)
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0)
{
__release_handle(fd);
errno = SYNC_ERROR;
return ret;
}
ret = (int)cmdbuf[1];
if(ret != 0)
{
SOCU_errno = _net_convert_error(cmdbuf[2]);
if(ret != 0) {
__release_handle(fd);
errno = _net_convert_error(cmdbuf[2]);
return -1;
}