mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2026-06-06 00:04:59 -06:00
Fix get/setsockopt levels (#3384)
This commit is contained in:
parent
339081d08f
commit
b53bda852d
@ -260,7 +260,8 @@ int PosixSocket::GetSocketAddress(OrbisNetSockaddr* name, u32* namelen) {
|
|||||||
|
|
||||||
#define CASE_SETSOCKOPT(opt) \
|
#define CASE_SETSOCKOPT(opt) \
|
||||||
case ORBIS_NET_##opt: \
|
case ORBIS_NET_##opt: \
|
||||||
return ConvertReturnErrorCode(setsockopt(sock, level, opt, (const char*)optval, optlen))
|
return ConvertReturnErrorCode( \
|
||||||
|
setsockopt(sock, native_level, opt, (const char*)optval, optlen))
|
||||||
|
|
||||||
#define CASE_SETSOCKOPT_VALUE(opt, value) \
|
#define CASE_SETSOCKOPT_VALUE(opt, value) \
|
||||||
case opt: \
|
case opt: \
|
||||||
@ -285,13 +286,16 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
|
|||||||
CASE_SETSOCKOPT(SO_RCVBUF);
|
CASE_SETSOCKOPT(SO_RCVBUF);
|
||||||
CASE_SETSOCKOPT(SO_SNDTIMEO);
|
CASE_SETSOCKOPT(SO_SNDTIMEO);
|
||||||
CASE_SETSOCKOPT(SO_RCVTIMEO);
|
CASE_SETSOCKOPT(SO_RCVTIMEO);
|
||||||
CASE_SETSOCKOPT(SO_ERROR);
|
|
||||||
CASE_SETSOCKOPT(SO_TYPE);
|
CASE_SETSOCKOPT(SO_TYPE);
|
||||||
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_CONNECTTIMEO, &sockopt_so_connecttimeo);
|
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_CONNECTTIMEO, &sockopt_so_connecttimeo);
|
||||||
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_REUSEPORT, &sockopt_so_reuseport);
|
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_REUSEPORT, &sockopt_so_reuseport);
|
||||||
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_ONESBCAST, &sockopt_so_onesbcast);
|
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_ONESBCAST, &sockopt_so_onesbcast);
|
||||||
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, &sockopt_so_usecrypto);
|
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USECRYPTO, &sockopt_so_usecrypto);
|
||||||
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USESIGNATURE, &sockopt_so_usesignature);
|
CASE_SETSOCKOPT_VALUE(ORBIS_NET_SO_USESIGNATURE, &sockopt_so_usesignature);
|
||||||
|
case ORBIS_NET_SO_ERROR: {
|
||||||
|
*Libraries::Kernel::__Error() = ORBIS_NET_ENOPROTOOPT;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
case ORBIS_NET_SO_LINGER: {
|
case ORBIS_NET_SO_LINGER: {
|
||||||
if (socket_type != ORBIS_NET_SOCK_STREAM) {
|
if (socket_type != ORBIS_NET_SOCK_STREAM) {
|
||||||
*Libraries::Kernel::__Error() = ORBIS_NET_EPROCUNAVAIL;
|
*Libraries::Kernel::__Error() = ORBIS_NET_EPROCUNAVAIL;
|
||||||
@ -316,11 +320,12 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
|
|||||||
*Libraries::Kernel::__Error() = ORBIS_NET_EINVAL;
|
*Libraries::Kernel::__Error() = ORBIS_NET_EINVAL;
|
||||||
return -1; // don't support set for name
|
return -1; // don't support set for name
|
||||||
case ORBIS_NET_SO_NBIO: {
|
case ORBIS_NET_SO_NBIO: {
|
||||||
if (optlen != sizeof(sockopt_so_nbio)) {
|
if (optlen < sizeof(sockopt_so_nbio)) {
|
||||||
*Libraries::Kernel::__Error() = ORBIS_NET_EFAULT;
|
*Libraries::Kernel::__Error() = ORBIS_NET_EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
|
} else {
|
||||||
|
memcpy(&sockopt_so_nbio, optval, sizeof(sockopt_so_nbio));
|
||||||
}
|
}
|
||||||
memcpy(&sockopt_so_nbio, optval, optlen);
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
static_assert(sizeof(u_long) == sizeof(sockopt_so_nbio),
|
static_assert(sizeof(u_long) == sizeof(sockopt_so_nbio),
|
||||||
"type used for ioctlsocket value does not have the expected size");
|
"type used for ioctlsocket value does not have the expected size");
|
||||||
@ -366,8 +371,8 @@ int PosixSocket::SetSocketOptions(int level, int optname, const void* optval, u3
|
|||||||
#define CASE_GETSOCKOPT(opt) \
|
#define CASE_GETSOCKOPT(opt) \
|
||||||
case ORBIS_NET_##opt: { \
|
case ORBIS_NET_##opt: { \
|
||||||
socklen_t optlen_temp = *optlen; \
|
socklen_t optlen_temp = *optlen; \
|
||||||
auto retval = \
|
auto retval = ConvertReturnErrorCode( \
|
||||||
ConvertReturnErrorCode(getsockopt(sock, level, opt, (char*)optval, &optlen_temp)); \
|
getsockopt(sock, native_level, opt, (char*)optval, &optlen_temp)); \
|
||||||
*optlen = optlen_temp; \
|
*optlen = optlen_temp; \
|
||||||
return retval; \
|
return retval; \
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user