mirror of
https://github.com/wiiu-env/wut.git
synced 2024-12-05 03:24:17 +01:00
169 lines
2.6 KiB
C
169 lines
2.6 KiB
C
#include "wut_socket.h"
|
|
|
|
#define NSYSNET_UNKNOWN_ERROR_OFFSET 10000
|
|
|
|
int h_errno;
|
|
|
|
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,
|
|
};
|
|
|
|
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,
|
|
};
|
|
|
|
void
|
|
__wut_socket_init_devoptab()
|
|
{
|
|
AddDevice(&__wut_socket_devoptab);
|
|
}
|
|
|
|
void
|
|
__wut_socket_fini_devoptab()
|
|
{
|
|
RemoveDevice("soc:");
|
|
}
|
|
|
|
__attribute__ ((deprecated))
|
|
static inline void
|
|
WHBInitializeSocketLibrary() {}
|
|
|
|
__attribute__ ((deprecated))
|
|
static inline void
|
|
WHBDeinitializeSocketLibrary() {}
|
|
|
|
inline void
|
|
socket_lib_init()
|
|
{
|
|
RPLWRAP(socket_lib_init)();
|
|
}
|
|
|
|
inline void
|
|
socket_lib_finish()
|
|
{
|
|
RPLWRAP(socket_lib_finish)();
|
|
}
|
|
|
|
void __attribute__((weak))
|
|
__init_wut_socket()
|
|
{
|
|
RPLWRAP(socket_lib_init)();
|
|
__wut_socket_init_devoptab();
|
|
ACInitialize();
|
|
ACConnectAsync();
|
|
}
|
|
|
|
void __attribute__((weak))
|
|
__fini_wut_socket() {
|
|
ACClose();
|
|
ACFinalize();
|
|
__wut_socket_fini_devoptab();
|
|
RPLWRAP(socket_lib_finish)();
|
|
}
|
|
|
|
int
|
|
__wut_get_nsysnet_fd(int fd)
|
|
{
|
|
__handle *handle = __get_handle(fd);
|
|
if (handle == NULL) {
|
|
errno = EBADF;
|
|
return -1;
|
|
}
|
|
if (strcmp(devoptab_list[handle->device]->name, "soc") != 0) {
|
|
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 {
|
|
error = NSYSNET_UNKNOWN_ERROR_OFFSET + sockerror;
|
|
}
|
|
|
|
if (r) {
|
|
r->_errno = error;
|
|
} else {
|
|
errno = error;
|
|
}
|
|
|
|
return -1;
|
|
}
|