Refactor soc to use errno.
This commit is contained in:
parent
67f991e452
commit
e75fd8b648
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -10,26 +10,20 @@ int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 >= 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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -10,26 +10,20 @@ int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
if(cmd == F_SETFL) {
|
||||
va_start(args, cmd);
|
||||
if(cmd == F_SETFL)
|
||||
{
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,8 @@ struct hostent* gethostbyname(const char *name)
|
||||
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));
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
|
||||
long gethostid(void)
|
||||
{
|
||||
@ -7,10 +8,15 @@ long gethostid(void)
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
@ -9,9 +10,8 @@ int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
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)
|
||||
{
|
||||
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
|
||||
ret = _net_convert_error(cmdbuf[2]);
|
||||
|
||||
if(ret < 0) {
|
||||
errno = -ret;
|
||||
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);
|
||||
}
|
||||
|
||||
if(ret<0)return -1;
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
@ -9,9 +10,8 @@ int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
|
||||
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)
|
||||
{
|
||||
if(*addrlen > tmpaddr[0])*addrlen = tmpaddr[0];
|
||||
ret = _net_convert_error(cmdbuf[2]);
|
||||
|
||||
if(ret < 0) {
|
||||
errno = -ret;
|
||||
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);
|
||||
}
|
||||
|
||||
if(ret<0)return -1;
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
|
||||
@ -8,9 +9,8 @@ int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optl
|
||||
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;
|
||||
}
|
||||
|
10
libctru/source/services/soc/soc_herror.c
Normal file
10
libctru/source/services/soc/soc_herror.c
Normal 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));
|
||||
}
|
26
libctru/source/services/soc/soc_hstrerror.c
Normal file
26
libctru/source/services/soc/soc_hstrerror.c
Normal 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";
|
||||
}
|
@ -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);
|
||||
@ -48,7 +49,11 @@ 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];
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -97,7 +101,11 @@ Result SOC_Shutdown(void)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -132,13 +141,21 @@ soc_close(struct _reent *r,
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int listen(int sockfd, int max_connections)
|
||||
@ -7,9 +8,8 @@ int listen(int sockfd, int max_connections)
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#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)
|
||||
@ -11,7 +12,8 @@ ssize_t socuipc_cmd7(int sockfd, void *buf, size_t len, int flags, struct sockad
|
||||
|
||||
memset(tmpaddr, 0, 0x1c);
|
||||
|
||||
if(src_addr)tmp_addrlen = 0x1c;
|
||||
if(src_addr)
|
||||
tmp_addrlen = 0x1c;
|
||||
|
||||
cmdbuf[0] = 0x00070104;
|
||||
cmdbuf[1] = (u32)sockfd;
|
||||
@ -28,23 +30,31 @@ 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;
|
||||
}
|
||||
|
||||
@ -56,7 +66,8 @@ ssize_t socuipc_cmd8(int sockfd, void *buf, size_t len, int flags, struct sockad
|
||||
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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -11,20 +11,14 @@ ssize_t socuipc_cmd9(int sockfd, const void *buf, size_t len, int flags, const s
|
||||
|
||||
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,13 +38,21 @@ 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;
|
||||
}
|
||||
|
||||
@ -63,20 +65,14 @@ ssize_t socuipc_cmda(int sockfd, const void *buf, size_t len, int flags, const s
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#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)
|
||||
@ -6,6 +7,12 @@ int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t
|
||||
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 = (int)cmdbuf[1];
|
||||
if(ret==0)ret = _net_convert_error(cmdbuf[2]);
|
||||
if(ret<0)SOCU_errno = ret;
|
||||
|
||||
if(ret<0)return -1;
|
||||
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) {
|
||||
errno = -ret;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int shutdown(int sockfd, int shutdown_type)
|
||||
@ -7,9 +8,8 @@ int shutdown(int sockfd, int shutdown_type)
|
||||
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;
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "soc_common.h"
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int sockatmark(int sockfd)
|
||||
@ -7,9 +8,8 @@ int sockatmark(int sockfd)
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user