diff --git a/src/core/libraries/network/posix_sockets.cpp b/src/core/libraries/network/posix_sockets.cpp index bd8ab6406..6ca60fbb4 100644 --- a/src/core/libraries/network/posix_sockets.cpp +++ b/src/core/libraries/network/posix_sockets.cpp @@ -3,6 +3,7 @@ #include #include "net.h" +#include "net_error.h" #include "sockets.h" namespace Libraries::Net { @@ -51,6 +52,17 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, un case ORBIS_NET_SO_SNDTIMEO: return ConvertReturnErrorCode( setsockopt(sock, level, SO_SNDTIMEO, (const char*)optval, optlen)); + case ORBIS_NET_SO_NBIO: { + if (optlen != sizeof(sockopt_so_nbio)) { + return ORBIS_NET_ERROR_EFAULT; + } + memcpy(&sockopt_so_nbio, optval, optlen); +#ifdef _WIN32 + return ConvertReturnErrorCode(ioctlsocket(sock, FIONBIO, (u_long*)&sockopt_so_nbio)); +#else + return ConvertReturnErrorCode(ioctl(sock, FIONBIO, &sockopt_so_nbio)); +#endif + } } } UNREACHABLE_MSG("Unknown level ={} optname ={}", level, optname); diff --git a/src/core/libraries/network/sockets.h b/src/core/libraries/network/sockets.h index de2b61e85..16c10eedf 100644 --- a/src/core/libraries/network/sockets.h +++ b/src/core/libraries/network/sockets.h @@ -42,6 +42,7 @@ struct Socket { struct PosixSocket : public Socket { net_socket sock; + int sockopt_so_nbio = 0; explicit PosixSocket(int domain, int type, int protocol) : Socket(domain, type, protocol), sock(socket(domain, type, protocol)) {} int SetSocketOptions(int level, int optname, const void* optval, unsigned int optlen) override;