Split up socket_connect into creation and connect calls

This commit is contained in:
UnknownShadow200 2024-06-21 11:38:23 +10:00
parent fb54ec45ec
commit e91ce96900
24 changed files with 150 additions and 64 deletions

View File

@ -494,6 +494,7 @@
<ClCompile Include="Inventory.c" />
<ClCompile Include="Launcher.c" />
<ClCompile Include="LBackend.c" />
<ClCompile Include="LBackend_Android.c" />
<ClCompile Include="LScreens.c" />
<ClCompile Include="LWeb.c" />
<ClCompile Include="LWidgets.c" />

View File

@ -785,6 +785,9 @@
<ClCompile Include="TouchUI.c">
<Filter>Source Files\2D</Filter>
</ClCompile>
<ClCompile Include="LBackend_Android.c">
<Filter>Source Files\Launcher</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\misc\windows\CCicon.rc">

View File

@ -489,10 +489,13 @@ static cc_result HttpConnection_Open(struct HttpConnection* conn, const struct H
/* TODO: Connect in parallel instead of serial, but that's a lot of work */
for (i = 0; i < numValidAddrs; i++)
{
res = Socket_Connect(&conn->socket, &addrs[i], false);
if (!res) break;
res = Socket_Create(&conn->socket, &addrs[i], false);
if (res) { HttpConnection_Close(conn); continue; }
HttpConnection_Close(conn);
res = Socket_Connect(conn->socket, &addrs[i]);
if (res) { HttpConnection_Close(conn); continue; }
break; /* Successful connection */
}
if (res) return res;

View File

@ -273,8 +273,10 @@ cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable);
/* Otherwise, attempts to resolve the input via DNS into one or more IP addresses */
cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* addrs, int* numValidAddrs);
/* Allocates a new socket and then begins connecting to the given address */
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking);
/* Allocates a new socket that is capable of connecting to the given address */
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking);
/* Begins connecting to the given address */
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr);
/* Attempts to read data from the given socket */
/* NOTE: A closed socket may set modified to 0, but still return 'success' (i.e. 0) */
cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified);

View File

@ -309,9 +309,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return i == 0 ? ERR_INVALID_ARGUMENT : 0;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = socket(raw->sa_family, SOCK_STREAM, 0); // https://www.3dbrew.org/wiki/SOCU:socket
if (*s == -1) return errno;
@ -320,8 +319,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int flags = fcntl(*s, F_GETFL, 0);
if (flags >= 0) fcntl(*s, F_SETFL, flags | O_NONBLOCK);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -452,9 +452,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return i == 0 ? ERR_INVALID_ARGUMENT : 0;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno;
@ -462,8 +461,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
if (nonblocking) {
fcntl(*s, F_SETFL, O_NONBLOCK);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -417,9 +417,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = net_socket(raw->sa_family, SOCK_STREAM, 0);
if (*s < 0) return *s;
@ -428,8 +427,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = -1; /* non-blocking mode */
net_ioctl(*s, FIONBIO, &blocking_raw);
}
return 0;
}
res = net_connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = net_connect(s, raw, addr->size);
return res < 0 ? res : 0;
}

View File

@ -391,7 +391,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return ERR_NOT_SUPPORTED;
}

View File

@ -215,7 +215,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return ERR_NOT_SUPPORTED;
}

View File

@ -359,9 +359,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
if (!net_supported) { *s = -1; return ERR_NO_NETWORKING; }
*s = socket(raw->sa_family, SOCK_STREAM, 0);
@ -371,8 +370,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = 1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res < 0 ? errno : 0;
}

View File

@ -198,7 +198,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return ERR_NOT_SUPPORTED;
}

View File

@ -512,9 +512,8 @@ static cc_result GetSocketError(cc_socket s) {
return res;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = socket(raw->sa_family, SOCK_STREAM, 0);
if (*s < 0) return *s;
@ -523,9 +522,14 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = -1; // non-blocking mode
//ioctlsocket(*s, FIONBIO, &blocking_raw); TODO doesn't work
}
return 0;
}
res = connect(*s, raw, addr->size);
return res == -1 ? GetSocketError(*s) : 0;
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? GetSocketError(s) : 0;
}
cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified) {

View File

@ -374,20 +374,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
res = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (res < 0) return net_errno;
*s = res;
*s = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s < 0) return net_errno;
if (nonblocking) {
int on = 1;
netSetSockOpt(*s, SOL_SOCKET, SO_NBIO, &on, sizeof(int));
}
return 0;
}
res = netConnect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = netConnect(s, raw, addr->size);
return res < 0 ? net_errno : 0;
}

View File

@ -311,9 +311,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return 0;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = sceNetInetSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s < 0) return sceNetInetGetErrno();
@ -322,8 +321,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int on = 1;
sceNetInetSetsockopt(*s, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int));
}
return 0;
}
res = sceNetInetConnect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = sceNetInetConnect(*s, raw, addr->size);
return res < 0 ? sceNetInetGetErrno() : 0;
}

View File

@ -294,9 +294,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return 0;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct SceNetSockaddr* raw = (struct SceNetSockaddr*)addr->data;
int res;
*s = sceNetSocket("CC socket", raw->sa_family, SCE_NET_SOCK_STREAM, SCE_NET_IPPROTO_TCP);
if (*s < 0) return *s;
@ -305,8 +304,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int on = 1;
sceNetSetsockopt(*s, SCE_NET_SOL_SOCKET, SCE_NET_SO_NBIO, &on, sizeof(int));
}
return 0;
}
res = sceNetConnect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct SceNetSockaddr* raw = (struct SceNetSockaddr*)addr->data;
int res = sceNetConnect(s, raw, addr->size);
return res;
}

View File

@ -642,7 +642,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
@ -653,8 +653,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = -1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -193,7 +193,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return ERR_NOT_SUPPORTED;
}

View File

@ -418,9 +418,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno;
@ -428,8 +427,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
if (nonblocking) {
fcntl(*s, F_SETFL, O_NONBLOCK);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -265,13 +265,16 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
extern int interop_SocketCreate(void);
extern int interop_SocketConnect(int sock, const cc_uint8* host, int port);
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int res;
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
*s = interop_SocketCreate();
return 0;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
/* size is used to store port number instead */
/* returned result is negative for error */
res = -interop_SocketConnect(*s, addr->data, addr->size);
int res = -interop_SocketConnect(s, addr->data, addr->size);
/* error returned when invalid address provided */
if (res == _EHOSTUNREACH) return ERR_INVALID_ARGUMENT;

View File

@ -355,9 +355,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ParseHost(str, port, addrs, numValidAddrs);
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno;
@ -366,8 +365,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = -1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw);
}
return 0;
}
res = connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -607,7 +607,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
}
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
SOCKADDR* raw_addr = (SOCKADDR*)addr->data;
cc_result res;
@ -618,8 +618,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
u_long blockingMode = -1; /* non-blocking mode */
_ioctlsocket(*s, FIONBIO, &blockingMode);
}
return 0;
}
res = _connect(*s, raw_addr, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
SOCKADDR* raw_addr = (SOCKADDR*)addr->data;
int res = _connect(s, raw_addr, addr->size);
return res == -1 ? _WSAGetLastError() : 0;
}

View File

@ -336,9 +336,8 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return i == 0 ? ERR_INVALID_ARGUMENT : 0;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = lwip_socket(raw->sa_family, SOCK_STREAM, 0);
if (*s == -1) return errno;
@ -347,8 +346,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
int blocking_raw = -1; /* non-blocking mode */
lwip_ioctl(*s, FIONBIO, &blocking_raw);
}
return 0;
}
res = lwip_connect(*s, raw, addr->size);
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
struct sockaddr* raw = (struct sockaddr*)addr->data;
int res = lwip_connect(s, raw, addr->size);
return res == -1 ? errno : 0;
}

View File

@ -232,7 +232,11 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
cc_result Socket_Create(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
return ERR_NOT_SUPPORTED;
}
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return ERR_NOT_SUPPORTED;
}

View File

@ -315,10 +315,11 @@ static void MPConnection_BeginConnect(void) {
MPConnection_FailConnect(res); return;
}
res = Socket_Connect(&net_socket, &addrs[0], true);
if (res == ERR_INVALID_ARGUMENT) {
MPConnection_Fail(&invalid_reason);
} else if (res && res != ReturnCode_SocketInProgess && res != ReturnCode_SocketWouldBlock) {
res = Socket_Create(&net_socket, &addrs[0], true);
if (res) { MPConnection_FailConnect(res); return; }
res = Socket_Connect(net_socket, &addrs[0]);
if (res && res != ReturnCode_SocketInProgess && res != ReturnCode_SocketWouldBlock) {
MPConnection_FailConnect(res);
} else {
Server.Disconnected = false;