#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);
extern int h_errno;
struct hostent* gethostbyname(const char *name);
+ void herror(const char *s);
+ const char* hstrerror(int err);
#ifdef __cplusplus
}
#include "soc_common.h"
+#include <errno.h>
#include <sys/socket.h>
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;
}
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;
}
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;
}
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;
}
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;
}
#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;
}
#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.
//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;
- return -_net_error_code_map[-sock_retval];
-}
+ if(sock_retval >= 0)
+ return sock_retval;
-int SOC_GetErrno(void)
-{
- return SOCU_errno;
+ 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];
}
#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
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;
}
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;
}
{
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;
{
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;
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;
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 */
}
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);
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));
#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;
}
#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;
}
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];
- memset(addr, 0, sizeof(struct sockaddr));
- addr->sa_family = tmpaddr[1];
- memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
+ if(ret == 0)
+ ret = _net_convert_error(cmdbuf[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;
}
#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;
}
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];
- memset(addr, 0, sizeof(struct sockaddr));
- addr->sa_family = tmpaddr[1];
- memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
+ if(ret == 0)
+ ret = _net_convert_error(cmdbuf[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;
}
#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;
}
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) {
+ errno = -ret;
+ return -1;
+ }
- if(ret==0)*optlen = cmdbuf[3];
+ *optlen = cmdbuf[3];
- if(ret<0)return -1;
return ret;
}
--- /dev/null
+#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));
+}
--- /dev/null
+#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";
+}
#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);
static Result socu_cmd1(Handle memhandle, u32 memsize)
{
- Result ret=0;
+ Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00010044;
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:");
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;
}
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);
int flags,
int mode)
{
+ r->_errno = ENOSYS;
return -1;
}
{
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;
}
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;
ret = -1;
}
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;
break;
}
- va_end(ap);
-
return ret;
}
#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;
}
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;
}
#include "soc_common.h"
+#include <errno.h>
#include <poll.h>
#include <stdlib.h>
#include <stdio.h>
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;
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;
}
#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;
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) {
+ errno = -ret;
+ return -1;
+ }
- if(ret>0 && src_addr!=NULL)
- {
+ 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);
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];
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) {
+ errno = -ret;
+ return -1;
+ }
- if(ret>0 && src_addr!=NULL)
- {
+ 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 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);
}
pollinfo = (struct pollfd*)calloc(numfds, sizeof(struct pollfd));
if(pollinfo == NULL) {
- SOCU_errno = ENOMEM;
+ errno = ENOMEM;
return -1;
}
FD_CLR(i, exceptfds);
}
- if(found) ++rc;
+ if(found)
+ ++rc;
++j;
}
}
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;
}
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;
}
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);
}
#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;
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;
}
#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;
}
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;
}
#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;
}
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;
}
int socket(int domain, int type, int protocol)
{
- int ret=0;
+ int ret = 0;
int fd, dev;
__handle *handle;
u32 *cmdbuf = getThreadCommandBuffer();
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;
}
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;
}