Fix regressions caused by network code. (#3702)

* Stub SOCK_DGRAM_P2P to allow some games to load again.

* Add 'support' for unspec sockets
(Have only seen the youtube app using these so far)
This commit is contained in:
clienthax 2017-11-20 13:42:16 +00:00 committed by kd-11
parent 5d87ef86b5
commit 86a34fbb45

View file

@ -1237,6 +1237,18 @@ s32 sys_net_bnet_setsockopt(ppu_thread& ppu, s32 s, s32 level, s32 optname, vm::
native_linger.l_linger = ((const sys_net_linger*)optval.get_ptr())->l_linger; native_linger.l_linger = ((const sys_net_linger*)optval.get_ptr())->l_linger;
break; break;
} }
case SYS_NET_SO_USECRYPTO:
{
//TODO
sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): Stubbed option (0x%x) (SYS_NET_SO_USECRYPTO)", s, optname);
return 0;
}
case SYS_NET_SO_USESIGNATURE:
{
//TODO
sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): Stubbed option (0x%x) (SYS_NET_SO_USESIGNATURE)", s, optname);
return 0;
}
default: default:
{ {
sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): unknown option (0x%x)", s, optname); sys_net.error("sys_net_bnet_setsockopt(s=%d, SOL_SOCKET): unknown option (0x%x)", s, optname);
@ -1333,24 +1345,38 @@ s32 sys_net_bnet_socket(ppu_thread& ppu, s32 family, s32 type, s32 protocol)
{ {
sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol); sys_net.warning("sys_net_bnet_socket(family=%d, type=%d, protocol=%d)", family, type, protocol);
if (family != SYS_NET_AF_INET) if (family != SYS_NET_AF_INET && family != SYS_NET_AF_UNSPEC)
{ {
sys_net.error("sys_net_bnet_socket(): unknown family (%d)", family); sys_net.error("sys_net_bnet_socket(): unknown family (%d)", family);
} }
if (type != SYS_NET_SOCK_STREAM && type != SYS_NET_SOCK_DGRAM) if (type != SYS_NET_SOCK_STREAM && type != SYS_NET_SOCK_DGRAM && type != SYS_NET_SOCK_DGRAM_P2P)
{ {
sys_net.error("sys_net_bnet_socket(): unsupported type (%d)", type); sys_net.error("sys_net_bnet_socket(): unsupported type (%d)", type);
return -SYS_NET_EPROTONOSUPPORT; return -SYS_NET_EPROTONOSUPPORT;
} }
const int native_domain = AF_INET; const int native_domain = family == SYS_NET_AF_INET ? AF_INET :
family == SYS_NET_AF_UNSPEC ? AF_UNSPEC : AF_INET;
const int native_type = const int native_type =
type == SYS_NET_SOCK_STREAM ? SOCK_STREAM : type == SYS_NET_SOCK_STREAM ? SOCK_STREAM :
type == SYS_NET_SOCK_DGRAM ? SOCK_DGRAM : SOCK_RAW; type == SYS_NET_SOCK_DGRAM ? SOCK_DGRAM :
const int native_proto = type == SYS_NET_SOCK_DGRAM_P2P ? SOCK_DGRAM : SOCK_RAW;
type == SYS_NET_SOCK_STREAM ? 0 :
type == SYS_NET_SOCK_DGRAM ? 0 : 0; int native_proto =
protocol == SYS_NET_IPPROTO_IP ? IPPROTO_IP :
protocol == SYS_NET_IPPROTO_ICMP ? IPPROTO_ICMP :
protocol == SYS_NET_IPPROTO_IGMP ? IPPROTO_IGMP :
protocol == SYS_NET_IPPROTO_TCP ? IPPROTO_TCP :
protocol == SYS_NET_IPPROTO_UDP ? IPPROTO_UDP :
protocol == SYS_NET_IPPROTO_ICMPV6 ? IPPROTO_ICMPV6 : 0;
if (native_domain == AF_UNSPEC && type == SYS_NET_SOCK_DGRAM)
{
//Windows gets all errory if you try a unspec socket with protocol 0
native_proto = IPPROTO_UDP;
}
const auto native_socket = ::socket(native_domain, native_type, native_proto); const auto native_socket = ::socket(native_domain, native_type, native_proto);