From b0b6034e634917c7f44e2b563a0c32086084cd89 Mon Sep 17 00:00:00 2001 From: darkf Date: Thu, 24 Apr 2014 05:10:43 -0700 Subject: [PATCH 1/3] accept accepts NULL address --- rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index 03f2c3ba30..aed1f6045d 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -90,13 +90,20 @@ using pck_len_t = u32; int sys_net_accept(s32 s, mem_ptr_t addr, mem32_t paddrlen) { sys_net.Warning("accept(s=%d, family_addr=0x%x, paddrlen=0x%x)", s, addr.GetAddr(), paddrlen.GetAddr()); - sockaddr _addr; - memcpy(&_addr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr)); - _addr.sa_family = addr->sa_family; - pck_len_t *_paddrlen = (pck_len_t *) Memory.VirtualToRealAddr(paddrlen.GetAddr()); - int ret = accept(s, &_addr, _paddrlen); - g_lastError = getLastError(); - return ret; + if (addr.GetAddr() == 0) { + int ret = accept(s, NULL, NULL); + g_lastError = getLastError(); + return ret; + } + else { + sockaddr _addr; + memcpy(&_addr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr)); + _addr.sa_family = addr->sa_family; + pck_len_t *_paddrlen = (pck_len_t *)Memory.VirtualToRealAddr(paddrlen.GetAddr()); + int ret = accept(s, &_addr, _paddrlen); + g_lastError = getLastError(); + return ret; + } } int sys_net_bind(s32 s, mem_ptr_t family, u32 addrlen) From ee2e0b3bbfb5cab8f0060f7253ef2111386dc676 Mon Sep 17 00:00:00 2001 From: darkf Date: Thu, 24 Apr 2014 22:02:33 -0700 Subject: [PATCH 2/3] sys_net: Implement sockaddr_in, inet_addr, listen --- rpcs3/Emu/SysCalls/Modules/sys_net.cpp | 47 +++++++++++++++----------- rpcs3/Emu/SysCalls/Modules/sys_net.h | 9 +++++ 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp index aed1f6045d..61214fafeb 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.cpp @@ -106,24 +106,28 @@ int sys_net_accept(s32 s, mem_ptr_t addr, mem32_t paddrlen) } } -int sys_net_bind(s32 s, mem_ptr_t family, u32 addrlen) +int sys_net_bind(s32 s, mem_ptr_t addr, u32 addrlen) { - sys_net.Warning("bind(s=%d, family_addr=0x%x, addrlen=%u)", s, family.GetAddr(), addrlen); - sockaddr _family; - memcpy(&_family, Memory.VirtualToRealAddr(family.GetAddr()), sizeof(sockaddr)); - _family.sa_family = family->sa_family; - int ret = bind(s, &_family, addrlen); + sys_net.Warning("bind(s=%d, family_addr=0x%x, addrlen=%u)", s, addr.GetAddr(), addrlen); + sockaddr_in saddr; + memcpy(&saddr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr_in)); + saddr.sin_family = addr->sin_family; + const char *ipaddr = inet_ntoa(saddr.sin_addr); + sys_net.Warning("binding on %s to port %d", ipaddr, ntohs(saddr.sin_port)); + int ret = bind(s, (const sockaddr *)&saddr, addrlen); g_lastError = getLastError(); return ret; } -int sys_net_connect(s32 s, mem_ptr_t family, u32 addrlen) +int sys_net_connect(s32 s, mem_ptr_t addr, u32 addrlen) { - sys_net.Warning("connect(s=%d, family_addr=0x%x, addrlen=%u)", s, family.GetAddr(), addrlen); - sockaddr _family; - memcpy(&_family, Memory.VirtualToRealAddr(family.GetAddr()), sizeof(sockaddr)); - _family.sa_family = family->sa_family; - int ret = connect(s, &_family, addrlen); + sys_net.Warning("connect(s=%d, family_addr=0x%x, addrlen=%u)", s, addr.GetAddr(), addrlen); + sockaddr_in saddr; + memcpy(&saddr, Memory.VirtualToRealAddr(addr.GetAddr()), sizeof(sockaddr_in)); + saddr.sin_family = addr->sin_family; + const char *ipaddr = inet_ntoa(saddr.sin_addr); + sys_net.Warning("connecting on %s to port %d", ipaddr, ntohs(saddr.sin_port)); + int ret = connect(s, (const sockaddr *) &saddr, addrlen); g_lastError = getLastError(); return ret; } @@ -158,10 +162,11 @@ int getsockopt() return CELL_OK; } -int inet_addr() +int sys_net_inet_addr(mem8_ptr_t cp) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + std::string cp_ = Memory.ReadString(cp.GetAddr()); + sys_net.Warning("inet_addr(cp=\"%s\")", cp_.c_str()); + return htonl(inet_addr(cp_.c_str())); // return a big-endian IP address } int inet_aton() @@ -214,10 +219,12 @@ int sys_net_inet_pton(s32 af, u32 src_addr, u32 dst_addr) return inet_pton(af, src, dst); } -int listen() +int sys_net_listen(s32 s, s32 backlog) { - UNIMPLEMENTED_FUNC(sys_net); - return CELL_OK; + sys_net.Warning("listen(s=%d, backlog=%d)", s, backlog); + int ret = listen(s, backlog); + g_lastError = getLastError(); + return ret; } int sys_net_recv(s32 s, u32 buf_addr, u32 len, s32 flags) @@ -500,7 +507,7 @@ void sys_net_init() //sys_net.AddFunc(0xf9ec2db6, sys_net_getpeername); //sys_net.AddFunc(0x13efe7f5, sys_net_getsockname); //sys_net.AddFunc(0x5a045bd1, sys_net_getsockopt); - //sys_net.AddFunc(0xdabbc2c0, sys_net_inet_addr); + sys_net.AddFunc(0xdabbc2c0, sys_net_inet_addr); //sys_net.AddFunc(0xa9a079e0, sys_net_inet_aton); //sys_net.AddFunc(0x566893ce, sys_net_inet_lnaof); //sys_net.AddFunc(0xb4152c74, sys_net_inet_makeaddr); @@ -509,7 +516,7 @@ void sys_net_init() //sys_net.AddFunc(0x858a930b, sys_net_inet_ntoa); //sys_net.AddFunc(0xc98a3146, sys_net_inet_ntop); sys_net.AddFunc(0x8af3825e, sys_net_inet_pton); - //sys_net.AddFunc(0x28e208bb, sys_net_listen); + sys_net.AddFunc(0x28e208bb, sys_net_listen); //sys_net.AddFunc(, sys_net_ntohl); //sys_net.AddFunc(, sys_net_ntohs); sys_net.AddFunc(0xfba04f37, sys_net_recv); diff --git a/rpcs3/Emu/SysCalls/Modules/sys_net.h b/rpcs3/Emu/SysCalls/Modules/sys_net.h index 6c7abd3f37..37b04d05eb 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_net.h +++ b/rpcs3/Emu/SysCalls/Modules/sys_net.h @@ -14,3 +14,12 @@ struct sys_net_sockaddr u8 sa_family; // sa_family_t u8 sa_data[14]; }; + +struct sys_net_sockaddr_in +{ + u8 sin_len; + u8 sin_family; + be_t sin_port; + be_t sa_addr; // struct in_addr + u8 unused[8]; +}; From 2b7c12a3f0f27b777ecbc414a54f1686e28263af Mon Sep 17 00:00:00 2001 From: darkf Date: Thu, 24 Apr 2014 22:14:40 -0700 Subject: [PATCH 3/3] Stub cellWebBrowserEstimate2 so some apps proceed --- rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index e8e92d9fb4..12b20a0fb5 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -924,6 +924,14 @@ int cellSysutilGetBgmPlaybackStatus(mem_ptr_t status) return CELL_OK; } +int cellWebBrowserEstimate2(mem8_ptr_t _config, mem32_ptr_t memSize) +{ + // TODO: When cellWebBrowser stuff is implemented, change this to some real + // needed memory buffer size. + *memSize = 1024 * 1024 * 1; // 1 MB + return CELL_OK; +} + void cellSysutil_init() { cellSysutil.AddFunc(0x40e895d3, cellSysutilGetSystemParamInt); @@ -994,4 +1002,6 @@ void cellSysutil_init() //cellSysutil.AddFunc(0xcdc6aefd, cellSaveDataUserAutoLoad); //cellSysutil.AddFunc(0x0e091c36, cellSaveDataUserListAutoSave); //cellSysutil.AddFunc(0xe7fa820b, cellSaveDataEnableOverlay); + + cellSysutil.AddFunc(0x6d087930, cellWebBrowserEstimate2); }