diff --git a/libctru/include/3ds/services/soc.h b/libctru/include/3ds/services/soc.h index 55ff21e..3ec99b7 100644 --- a/libctru/include/3ds/services/soc.h +++ b/libctru/include/3ds/services/soc.h @@ -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); diff --git a/libctru/include/netdb.h b/libctru/include/netdb.h index 7f769a4..b3fac81 100644 --- a/libctru/include/netdb.h +++ b/libctru/include/netdb.h @@ -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 } diff --git a/libctru/source/services/soc/soc_accept.c b/libctru/source/services/soc/soc_accept.c index cf64863..71ce790 100644 --- a/libctru/source/services/soc/soc_accept.c +++ b/libctru/source/services/soc/soc_accept.c @@ -1,4 +1,5 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_bind.c b/libctru/source/services/soc/soc_bind.c index dd37f7e..610cdf6 100644 --- a/libctru/source/services/soc/soc_bind.c +++ b/libctru/source/services/soc/soc_bind.c @@ -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; } diff --git a/libctru/source/services/soc/soc_closesocket.c b/libctru/source/services/soc/soc_closesocket.c index 37e1923..9a3c93b 100644 --- a/libctru/source/services/soc/soc_closesocket.c +++ b/libctru/source/services/soc/soc_closesocket.c @@ -1,12 +1,13 @@ #include "soc_common.h" +#include #include +#include int closesocket(int sockfd) { int fd = soc_get_fd(sockfd); - if(fd < 0) - { - SOCU_errno = fd; + if(fd < 0) { + errno = -fd; return -1; } diff --git a/libctru/source/services/soc/soc_common.c b/libctru/source/services/soc/soc_common.c index c41491c..a610919 100644 --- a/libctru/source/services/soc/soc_common.c +++ b/libctru/source/services/soc/soc_common.c @@ -3,7 +3,6 @@ #include 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; -} diff --git a/libctru/source/services/soc/soc_common.h b/libctru/source/services/soc/soc_common.h index f325bf7..f35c5fe 100644 --- a/libctru/source/services/soc/soc_common.h +++ b/libctru/source/services/soc/soc_common.h @@ -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 diff --git a/libctru/source/services/soc/soc_connect.c b/libctru/source/services/soc/soc_connect.c index cf01759..4cab7cc 100644 --- a/libctru/source/services/soc/soc_connect.c +++ b/libctru/source/services/soc/soc_connect.c @@ -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; } diff --git a/libctru/source/services/soc/soc_fcntl.c b/libctru/source/services/soc/soc_fcntl.c index 23b5f8a..f14a0e0 100644 --- a/libctru/source/services/soc/soc_fcntl.c +++ b/libctru/source/services/soc/soc_fcntl.c @@ -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 */ } diff --git a/libctru/source/services/soc/soc_gethostbyname.c b/libctru/source/services/soc/soc_gethostbyname.c index 4932378..ed712db 100644 --- a/libctru/source/services/soc/soc_gethostbyname.c +++ b/libctru/source/services/soc/soc_gethostbyname.c @@ -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)); diff --git a/libctru/source/services/soc/soc_gethostid.c b/libctru/source/services/soc/soc_gethostid.c index fb747c3..7a254aa 100644 --- a/libctru/source/services/soc/soc_gethostid.c +++ b/libctru/source/services/soc/soc_gethostid.c @@ -1,16 +1,22 @@ #include "soc_common.h" +#include 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; } diff --git a/libctru/source/services/soc/soc_getpeername.c b/libctru/source/services/soc/soc_getpeername.c index 80af375..977b14b 100644 --- a/libctru/source/services/soc/soc_getpeername.c +++ b/libctru/source/services/soc/soc_getpeername.c @@ -1,17 +1,17 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_getsockname.c b/libctru/source/services/soc/soc_getsockname.c index dceda3a..2fd16b3 100644 --- a/libctru/source/services/soc/soc_getsockname.c +++ b/libctru/source/services/soc/soc_getsockname.c @@ -1,17 +1,17 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_getsockopt.c b/libctru/source/services/soc/soc_getsockopt.c index 85d0d4a..8b48994 100644 --- a/libctru/source/services/soc/soc_getsockopt.c +++ b/libctru/source/services/soc/soc_getsockopt.c @@ -1,16 +1,16 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_herror.c b/libctru/source/services/soc/soc_herror.c new file mode 100644 index 0000000..04a7e24 --- /dev/null +++ b/libctru/source/services/soc/soc_herror.c @@ -0,0 +1,10 @@ +#include "soc_common.h" +#include +#include + +void herror(const char *s) { + if(s) + fiprintf(stderr, "%s\n", hstrerror(h_errno)); + else + fiprintf(stderr, "%s: %s\n", s, hstrerror(h_errno)); +} diff --git a/libctru/source/services/soc/soc_hstrerror.c b/libctru/source/services/soc/soc_hstrerror.c new file mode 100644 index 0000000..cb1660c --- /dev/null +++ b/libctru/source/services/soc/soc_hstrerror.c @@ -0,0 +1,26 @@ +#include "soc_common.h" +#include + +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"; +} diff --git a/libctru/source/services/soc/soc_init.c b/libctru/source/services/soc/soc_init.c index 1837da2..c28e1de 100644 --- a/libctru/source/services/soc/soc_init.c +++ b/libctru/source/services/soc/soc_init.c @@ -1,4 +1,5 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_ioctl.c b/libctru/source/services/soc/soc_ioctl.c index 9e25c4f..97fb5cb 100644 --- a/libctru/source/services/soc/soc_ioctl.c +++ b/libctru/source/services/soc/soc_ioctl.c @@ -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; } diff --git a/libctru/source/services/soc/soc_listen.c b/libctru/source/services/soc/soc_listen.c index 41b73e4..53257d2 100644 --- a/libctru/source/services/soc/soc_listen.c +++ b/libctru/source/services/soc/soc_listen.c @@ -1,15 +1,15 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_poll.c b/libctru/source/services/soc/soc_poll.c index 80b6514..324612c 100644 --- a/libctru/source/services/soc/soc_poll.c +++ b/libctru/source/services/soc/soc_poll.c @@ -1,4 +1,5 @@ #include "soc_common.h" +#include #include #include #include @@ -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; } diff --git a/libctru/source/services/soc/soc_recvfrom.c b/libctru/source/services/soc/soc_recvfrom.c index 3af3c1a..8480c5f 100644 --- a/libctru/source/services/soc/soc_recvfrom.c +++ b/libctru/source/services/soc/soc_recvfrom.c @@ -1,17 +1,19 @@ #include "soc_common.h" +#include #include 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); } diff --git a/libctru/source/services/soc/soc_select.c b/libctru/source/services/soc/soc_select.c index d2cd911..7e47827 100644 --- a/libctru/source/services/soc/soc_select.c +++ b/libctru/source/services/soc/soc_select.c @@ -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; } } diff --git a/libctru/source/services/soc/soc_sendto.c b/libctru/source/services/soc/soc_sendto.c index 64eeb9e..7183c11 100644 --- a/libctru/source/services/soc/soc_sendto.c +++ b/libctru/source/services/soc/soc_sendto.c @@ -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); } diff --git a/libctru/source/services/soc/soc_setsockopt.c b/libctru/source/services/soc/soc_setsockopt.c index ff142b2..600d8cf 100644 --- a/libctru/source/services/soc/soc_setsockopt.c +++ b/libctru/source/services/soc/soc_setsockopt.c @@ -1,11 +1,18 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_shutdown.c b/libctru/source/services/soc/soc_shutdown.c index 4dca8c4..89b2db6 100644 --- a/libctru/source/services/soc/soc_shutdown.c +++ b/libctru/source/services/soc/soc_shutdown.c @@ -1,15 +1,15 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_sockatmark.c b/libctru/source/services/soc/soc_sockatmark.c index 4fbec75..f774389 100644 --- a/libctru/source/services/soc/soc_sockatmark.c +++ b/libctru/source/services/soc/soc_sockatmark.c @@ -1,15 +1,15 @@ #include "soc_common.h" +#include #include 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; } diff --git a/libctru/source/services/soc/soc_socket.c b/libctru/source/services/soc/soc_socket.c index 94f2ad1..5072275 100644 --- a/libctru/source/services/soc/soc_socket.c +++ b/libctru/source/services/soc/soc_socket.c @@ -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; }