2021-03-07 13:09:12 +01:00
|
|
|
#include "wut_socket.h"
|
|
|
|
|
|
|
|
#define NSYSNET_UNKNOWN_ERROR_OFFSET 10000
|
|
|
|
|
2021-03-07 13:36:30 +01:00
|
|
|
static BOOL
|
|
|
|
__wut_socket_initialised = FALSE;
|
|
|
|
|
|
|
|
static devoptab_t
|
|
|
|
__wut_socket_devoptab =
|
|
|
|
{
|
|
|
|
.name = "soc",
|
|
|
|
.structSize = sizeof(int),
|
|
|
|
.open_r = __wut_socket_open,
|
|
|
|
.close_r = __wut_socket_close,
|
|
|
|
.write_r = __wut_socket_write,
|
|
|
|
.read_r = __wut_socket_read,
|
|
|
|
};
|
|
|
|
|
2021-03-07 13:09:12 +01:00
|
|
|
static unsigned char
|
|
|
|
__wut_nsysnet_error_code_map[] =
|
|
|
|
{
|
|
|
|
0, // 0
|
|
|
|
ENOBUFS,
|
|
|
|
ETIMEDOUT,
|
|
|
|
EISCONN,
|
|
|
|
EOPNOTSUPP,
|
|
|
|
ECONNABORTED, // 5
|
|
|
|
EWOULDBLOCK,
|
|
|
|
ECONNREFUSED,
|
|
|
|
ECONNRESET,
|
|
|
|
ENOTCONN,
|
|
|
|
EALREADY, // 10
|
|
|
|
EINVAL,
|
|
|
|
EMSGSIZE,
|
|
|
|
EPIPE,
|
|
|
|
EDESTADDRREQ,
|
|
|
|
ESHUTDOWN, // 15
|
|
|
|
ENOPROTOOPT,
|
|
|
|
EBUSY,
|
|
|
|
ENOMEM,
|
|
|
|
EADDRNOTAVAIL,
|
|
|
|
EADDRINUSE, // 20
|
|
|
|
EAFNOSUPPORT,
|
|
|
|
EINPROGRESS,
|
|
|
|
EIO,
|
|
|
|
ENOTSOCK,
|
|
|
|
EINVAL, // 25
|
|
|
|
EINVAL,
|
|
|
|
EIO,
|
|
|
|
ETOOMANYREFS,
|
|
|
|
EFAULT,
|
|
|
|
ENETUNREACH, // 30
|
|
|
|
EPROTONOSUPPORT,
|
|
|
|
EPROTOTYPE,
|
|
|
|
EINVAL,
|
|
|
|
EINVAL,
|
|
|
|
EINVAL, // 35
|
|
|
|
EINVAL,
|
|
|
|
EINVAL,
|
|
|
|
EINVAL,
|
|
|
|
EINVAL,
|
|
|
|
EINVAL, // 40
|
|
|
|
EINVAL,
|
|
|
|
ENODEV,
|
|
|
|
EBUSY,
|
|
|
|
EBUSY,
|
|
|
|
EINVAL, // 45
|
|
|
|
EINVAL,
|
|
|
|
EINVAL,
|
|
|
|
ENOMEM,
|
|
|
|
EBADFD,
|
|
|
|
ECANCELED, // 50
|
|
|
|
EMFILE,
|
|
|
|
};
|
|
|
|
|
2021-03-07 13:36:30 +01:00
|
|
|
void
|
|
|
|
__init_wut_socket()
|
|
|
|
{
|
|
|
|
BOOL connected = FALSE;
|
|
|
|
int dev;
|
|
|
|
|
|
|
|
if (__wut_socket_initialised) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ACInitialize();
|
|
|
|
ACConnect();
|
|
|
|
|
|
|
|
ACIsApplicationConnected(&connected);
|
|
|
|
if (!connected) {
|
|
|
|
ACFinalize();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RPLWRAP(socket_lib_init)();
|
|
|
|
|
|
|
|
dev = AddDevice(&__wut_socket_devoptab);
|
|
|
|
if (dev == -1) {
|
|
|
|
RPLWRAP(socket_lib_finish)();
|
|
|
|
ACFinalize();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
__wut_socket_initialised = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
__fini_wut_socket()
|
|
|
|
{
|
|
|
|
if (!__wut_socket_initialised) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RPLWRAP(socket_lib_finish)();
|
|
|
|
ACFinalize();
|
|
|
|
|
|
|
|
__wut_socket_initialised = FALSE;
|
|
|
|
}
|
|
|
|
|
2021-03-07 13:09:12 +01:00
|
|
|
int
|
|
|
|
__wut_get_nsysnet_fd(int fd)
|
|
|
|
{
|
|
|
|
__handle *handle = __get_handle(fd);
|
|
|
|
if (handle == NULL) {
|
|
|
|
errno = EBADF;
|
|
|
|
return -1;
|
|
|
|
}
|
2021-03-07 13:36:30 +01:00
|
|
|
if (strcmp(devoptab_list[handle->device]->name, "soc") != 0) {
|
2021-03-07 13:09:12 +01:00
|
|
|
errno = ENOTSOCK;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return *(int *)handle->fileStruct;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
__wut_get_nsysnet_result(struct _reent *r,
|
|
|
|
int rc)
|
|
|
|
{
|
|
|
|
int sockerror, error;
|
|
|
|
|
|
|
|
if (rc >= 0) {
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
sockerror = RPLWRAP(socketlasterr)();
|
|
|
|
|
|
|
|
if (sockerror < 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sockerror < sizeof(__wut_nsysnet_error_code_map)) {
|
|
|
|
error = __wut_nsysnet_error_code_map[sockerror];
|
|
|
|
} else {
|
2021-03-07 13:36:30 +01:00
|
|
|
error = NSYSNET_UNKNOWN_ERROR_OFFSET + sockerror;
|
2021-03-07 13:09:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (r) {
|
|
|
|
r->_errno = error;
|
|
|
|
} else {
|
|
|
|
errno = error;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|