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="Inventory.c" />
<ClCompile Include="Launcher.c" /> <ClCompile Include="Launcher.c" />
<ClCompile Include="LBackend.c" /> <ClCompile Include="LBackend.c" />
<ClCompile Include="LBackend_Android.c" />
<ClCompile Include="LScreens.c" /> <ClCompile Include="LScreens.c" />
<ClCompile Include="LWeb.c" /> <ClCompile Include="LWeb.c" />
<ClCompile Include="LWidgets.c" /> <ClCompile Include="LWidgets.c" />

View File

@ -785,6 +785,9 @@
<ClCompile Include="TouchUI.c"> <ClCompile Include="TouchUI.c">
<Filter>Source Files\2D</Filter> <Filter>Source Files\2D</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="LBackend_Android.c">
<Filter>Source Files\Launcher</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="..\misc\windows\CCicon.rc"> <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 */ /* TODO: Connect in parallel instead of serial, but that's a lot of work */
for (i = 0; i < numValidAddrs; i++) for (i = 0; i < numValidAddrs; i++)
{ {
res = Socket_Connect(&conn->socket, &addrs[i], false); res = Socket_Create(&conn->socket, &addrs[i], false);
if (!res) break; 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; 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 */ /* 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); 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 */ /* Allocates a new socket that is capable of connecting to the given address */
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);
/* Begins connecting to the given address */
cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr);
/* Attempts to read data from the given socket */ /* Attempts to read data from the given socket */
/* NOTE: A closed socket may set modified to 0, but still return 'success' (i.e. 0) */ /* 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); cc_result Socket_Read(cc_socket s, cc_uint8* data, cc_uint32 count, cc_uint32* modified);

View File

@ -309,19 +309,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return i == 0 ? ERR_INVALID_ARGUMENT : 0; 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = socket(raw->sa_family, SOCK_STREAM, 0); // https://www.3dbrew.org/wiki/SOCU:socket *s = socket(raw->sa_family, SOCK_STREAM, 0); // https://www.3dbrew.org/wiki/SOCU:socket
if (*s == -1) return errno; if (*s == -1) return errno;
if (nonblocking) { if (nonblocking) {
int flags = fcntl(*s, F_GETFL, 0); int flags = fcntl(*s, F_GETFL, 0);
if (flags >= 0) fcntl(*s, F_SETFL, flags | O_NONBLOCK); 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; 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; 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno; if (*s == -1) return errno;
@ -462,8 +461,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
if (nonblocking) { if (nonblocking) {
fcntl(*s, F_SETFL, O_NONBLOCK); 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; 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = net_socket(raw->sa_family, SOCK_STREAM, 0); *s = net_socket(raw->sa_family, SOCK_STREAM, 0);
if (*s < 0) return *s; 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 */ int blocking_raw = -1; /* non-blocking mode */
net_ioctl(*s, FIONBIO, &blocking_raw); 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; 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; 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; 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; 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; 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
if (!net_supported) { *s = -1; return ERR_NO_NETWORKING; } if (!net_supported) { *s = -1; return ERR_NO_NETWORKING; }
*s = socket(raw->sa_family, SOCK_STREAM, 0); *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 */ int blocking_raw = 1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw); 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; 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; 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; return ERR_NOT_SUPPORTED;
} }

View File

@ -512,20 +512,24 @@ static cc_result GetSocketError(cc_socket s) {
return res; 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = socket(raw->sa_family, SOCK_STREAM, 0); *s = socket(raw->sa_family, SOCK_STREAM, 0);
if (*s < 0) return *s; if (*s < 0) return *s;
if (nonblocking) { if (nonblocking) {
int blocking_raw = -1; // non-blocking mode int blocking_raw = -1; // non-blocking mode
//ioctlsocket(*s, FIONBIO, &blocking_raw); TODO doesn't work //ioctlsocket(*s, FIONBIO, &blocking_raw); TODO doesn't work
} }
return 0;
}
res = connect(*s, raw, addr->size); cc_result Socket_Connect(cc_socket s, cc_sockaddr* addr) {
return res == -1 ? GetSocketError(*s) : 0; 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) { 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
res = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); *s = netSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (res < 0) return net_errno; if (*s < 0) return net_errno;
*s = res;
if (nonblocking) { if (nonblocking) {
int on = 1; int on = 1;
netSetSockOpt(*s, SOL_SOCKET, SO_NBIO, &on, sizeof(int)); 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; return res < 0 ? net_errno : 0;
} }

View File

@ -311,19 +311,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return 0; 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = sceNetInetSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); *s = sceNetInetSocket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s < 0) return sceNetInetGetErrno(); if (*s < 0) return sceNetInetGetErrno();
if (nonblocking) { if (nonblocking) {
int on = 1; int on = 1;
sceNetInetSetsockopt(*s, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)); 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; return res < 0 ? sceNetInetGetErrno() : 0;
} }

View File

@ -294,19 +294,23 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
return 0; 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; struct SceNetSockaddr* raw = (struct SceNetSockaddr*)addr->data;
int res;
*s = sceNetSocket("CC socket", raw->sa_family, SCE_NET_SOCK_STREAM, SCE_NET_IPPROTO_TCP); *s = sceNetSocket("CC socket", raw->sa_family, SCE_NET_SOCK_STREAM, SCE_NET_IPPROTO_TCP);
if (*s < 0) return *s; if (*s < 0) return *s;
if (nonblocking) { if (nonblocking) {
int on = 1; int on = 1;
sceNetSetsockopt(*s, SCE_NET_SOL_SOCKET, SCE_NET_SO_NBIO, &on, sizeof(int)); 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; 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res; 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 */ int blocking_raw = -1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw); 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; 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; 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; 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno; if (*s == -1) return errno;
@ -428,8 +427,13 @@ cc_result Socket_Connect(cc_socket* s, cc_sockaddr* addr, cc_bool nonblocking) {
if (nonblocking) { if (nonblocking) {
fcntl(*s, F_SETFL, O_NONBLOCK); 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; 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_SocketCreate(void);
extern int interop_SocketConnect(int sock, const cc_uint8* host, int port); 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;
*s = interop_SocketCreate(); 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 */ /* size is used to store port number instead */
/* returned result is negative for error */ /* 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 */ /* error returned when invalid address provided */
if (res == _EHOSTUNREACH) return ERR_INVALID_ARGUMENT; 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); 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
cc_result res;
*s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP); *s = socket(raw->sa_family, SOCK_STREAM, IPPROTO_TCP);
if (*s == -1) return errno; 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 */ int blocking_raw = -1; /* non-blocking mode */
ioctl(*s, FIONBIO, &blocking_raw); 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; 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; SOCKADDR* raw_addr = (SOCKADDR*)addr->data;
cc_result res; 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 */ u_long blockingMode = -1; /* non-blocking mode */
_ioctlsocket(*s, FIONBIO, &blockingMode); _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; 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; 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; struct sockaddr* raw = (struct sockaddr*)addr->data;
int res;
*s = lwip_socket(raw->sa_family, SOCK_STREAM, 0); *s = lwip_socket(raw->sa_family, SOCK_STREAM, 0);
if (*s == -1) return errno; 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 */ int blocking_raw = -1; /* non-blocking mode */
lwip_ioctl(*s, FIONBIO, &blocking_raw); 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; 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; 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; return ERR_NOT_SUPPORTED;
} }

View File

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