From 8f7b5a1050fc36292e00037484b16c83fed77f4e Mon Sep 17 00:00:00 2001 From: Cthulhu-throwaway <96153783+Cthulhu-throwaway@users.noreply.github.com> Date: Tue, 31 May 2022 05:07:23 -0300 Subject: [PATCH 1/2] (Networking) Define isinprogress function --- libretro-common/include/net/net_compat.h | 52 ++++++++++++++---------- libretro-common/net/net_socket.c | 5 +-- network/netplay/netplay_frontend.c | 11 ++--- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/libretro-common/include/net/net_compat.h b/libretro-common/include/net/net_compat.h index 8013fa85e3..2dc5cb5a2b 100644 --- a/libretro-common/include/net/net_compat.h +++ b/libretro-common/include/net/net_compat.h @@ -56,6 +56,16 @@ #include +#define sendto(s, msg, len, flags, addr, tolen) net_sendto(s, msg, len, 0, addr, 8) +#define socket(domain, type, protocol) net_socket(domain, type, protocol) +#define bind(s, name, namelen) net_bind(s, name, namelen) +#define listen(s, backlog) net_listen(s, backlog) +#define accept(s, addr, addrlen) net_accept(s, addr, addrlen) +#define connect(s, addr, addrlen) net_connect(s, addr, addrlen) +#define send(s, data, size, flags) net_send(s, data, size, flags) +#define recv(s, mem, len, flags) net_recv(s, mem, len, flags) +#define recvfrom(s, mem, len, flags, from, fromlen) net_recvfrom(s, mem, len, flags, from, fromlen) +#define select(maxfdp1, readset, writeset, exceptset, timeout) net_select(maxfdp1, readset, writeset, exceptset, timeout) #define getsockopt net_getsockopt #define setsockopt net_setsockopt @@ -132,35 +142,33 @@ struct SceNetInAddr inet_aton(const char *ip_addr); #include -#ifdef GEKKO -#define sendto(s, msg, len, flags, addr, tolen) net_sendto(s, msg, len, 0, addr, 8) -#define socket(domain, type, protocol) net_socket(domain, type, protocol) -#define bind(s, name, namelen) net_bind(s, name, namelen) -#define listen(s, backlog) net_listen(s, backlog) -#define accept(s, addr, addrlen) net_accept(s, addr, addrlen) -#define connect(s, addr, addrlen) net_connect(s, addr, addrlen) -#define send(s, data, size, flags) net_send(s, data, size, flags) -#define recv(s, mem, len, flags) net_recv(s, mem, len, flags) -#define recvfrom(s, mem, len, flags, from, fromlen) net_recvfrom(s, mem, len, flags, from, fromlen) -#define select(maxfdp1, readset, writeset, exceptset, timeout) net_select(maxfdp1, readset, writeset, exceptset, timeout) -#endif - static INLINE bool isagain(int bytes) { #if defined(_WIN32) - if (bytes != SOCKET_ERROR) - return false; - if (WSAGetLastError() != WSAEWOULDBLOCK) - return false; - return true; + return (bytes == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK); #elif !defined(__PSL1GHT__) && defined(__PS3__) - return (sys_net_errno == SYS_NET_EWOULDBLOCK) || (sys_net_errno == SYS_NET_EAGAIN); + return (sys_net_errno == SYS_NET_EAGAIN) || (sys_net_errno == SYS_NET_EWOULDBLOCK); #elif defined(VITA) - return (bytes<0 && (bytes == SCE_NET_ERROR_EAGAIN || bytes == SCE_NET_ERROR_EWOULDBLOCK)); + return (bytes == SCE_NET_ERROR_EAGAIN) || (bytes == SCE_NET_ERROR_EWOULDBLOCK); #elif defined(WIIU) - return (bytes == -1) && ((socketlasterr() == SO_SUCCESS) || (socketlasterr() == SO_EWOULDBLOCK)); + return (bytes == -1) && (socketlasterr() == SO_SUCCESS || socketlasterr() == SO_EWOULDBLOCK); #else - return (bytes < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)); + return (bytes < 0) && (errno == EAGAIN || errno == EWOULDBLOCK); +#endif +} + +static INLINE bool isinprogress(int bytes) +{ +#if defined(_WIN32) + return (bytes == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK); +#elif !defined(__PSL1GHT__) && defined(__PS3__) + return (sys_net_errno == SYS_NET_EINPROGRESS); +#elif defined(VITA) + return (bytes == SCE_NET_ERROR_EINPROGRESS); +#elif defined(WIIU) + return (bytes == -1) && (socketlasterr() == SO_SUCCESS || socketlasterr() == SO_EWOULDBLOCK); +#else + return (bytes < 0) && (errno == EINPROGRESS); #endif } diff --git a/libretro-common/net/net_socket.c b/libretro-common/net/net_socket.c index e941e1df44..a970aa0c19 100644 --- a/libretro-common/net/net_socket.c +++ b/libretro-common/net/net_socket.c @@ -443,10 +443,7 @@ bool socket_connect_with_timeout(int fd, void *data, unsigned timeout) fd_set wfd, efd; struct timeval tv = {0}; - if (!isagain(res)) -#if !defined(_WIN32) && defined(EINPROGRESS) - if (errno != EINPROGRESS) -#endif + if (!isinprogress(res) && !isagain(res)) return false; FD_ZERO(&wfd); diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index 90e1780b42..2cb929a002 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -3255,16 +3255,13 @@ static bool netplay_tunnel_connect(int fd, const struct addrinfo *addr) if (!socket_nonblock(fd)) return false; - result = socket_connect(fd, (void*) addr, false); - if (result && !isagain(result)) -#if !defined(_WIN32) && defined(EINPROGRESS) - if (errno != EINPROGRESS) -#endif - return false; - SET_TCP_NODELAY(fd) SET_FD_CLOEXEC(fd) + result = socket_connect(fd, (void*) addr, false); + if (result && !isinprogress(result) && !isagain(result)) + return false; + return true; } From 39de84eb05974857092766fa8f36472ae45440b6 Mon Sep 17 00:00:00 2001 From: Cthulhu-throwaway <96153783+Cthulhu-throwaway@users.noreply.github.com> Date: Tue, 31 May 2022 06:07:57 -0300 Subject: [PATCH 2/2] Wii buildfix --- libretro-common/net/net_socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretro-common/net/net_socket.c b/libretro-common/net/net_socket.c index a970aa0c19..da4f504c8e 100644 --- a/libretro-common/net/net_socket.c +++ b/libretro-common/net/net_socket.c @@ -457,7 +457,7 @@ bool socket_connect_with_timeout(int fd, void *data, unsigned timeout) return false; } -#ifdef SO_ERROR +#if !defined(GEKKO) && defined(SO_ERROR) { int error = -1; socklen_t errsz = sizeof(error);