summaryrefslogtreecommitdiff
path: root/src/network/core
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2020-12-05 21:57:47 +0100
committerPatric Stout <github@truebrain.nl>2020-12-15 15:46:39 +0100
commitd15dc9f40f5a20bff452547a2dcb15231f9f969d (patch)
tree7b8d88635c048d906cbb6358007fb26055e24410 /src/network/core
parent2da07f76154d841bcfe9aaff4833144550186deb (diff)
downloadopenttd-d15dc9f40f5a20bff452547a2dcb15231f9f969d.tar.xz
Add: support for emscripten (play-OpenTTD-in-the-browser)
Emscripten compiles to WASM, which can be loaded via HTML / JavaScript. This allows you to play OpenTTD inside a browser. Co-authored-by: milek7 <me@milek7.pl>
Diffstat (limited to 'src/network/core')
-rw-r--r--src/network/core/address.cpp10
-rw-r--r--src/network/core/os_abstraction.h24
2 files changed, 30 insertions, 4 deletions
diff --git a/src/network/core/address.cpp b/src/network/core/address.cpp
index c2fecc7ff..1aaa0b5fb 100644
--- a/src/network/core/address.cpp
+++ b/src/network/core/address.cpp
@@ -299,7 +299,15 @@ static SOCKET ConnectLoopProc(addrinfo *runp)
if (!SetNoDelay(sock)) DEBUG(net, 1, "[%s] setting TCP_NODELAY failed", type);
- if (connect(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) {
+ int err = connect(sock, runp->ai_addr, (int)runp->ai_addrlen);
+#ifdef __EMSCRIPTEN__
+ /* Emscripten is asynchronous, and as such a connect() is still in
+ * progress by the time the call returns. */
+ if (err != 0 && errno != EINPROGRESS)
+#else
+ if (err != 0)
+#endif
+ {
DEBUG(net, 1, "[%s] could not connect %s socket: %s", type, family, strerror(errno));
closesocket(sock);
return INVALID_SOCKET;
diff --git a/src/network/core/os_abstraction.h b/src/network/core/os_abstraction.h
index 01ab68b27..be8b8f919 100644
--- a/src/network/core/os_abstraction.h
+++ b/src/network/core/os_abstraction.h
@@ -83,6 +83,16 @@ typedef unsigned long in_addr_t;
# include <errno.h>
# include <sys/time.h>
# include <netdb.h>
+
+# if defined(__EMSCRIPTEN__)
+/* Emscripten doesn't support AI_ADDRCONFIG and errors out on it. */
+# undef AI_ADDRCONFIG
+# define AI_ADDRCONFIG 0
+/* Emscripten says it supports FD_SETSIZE fds, but it really only supports 64.
+ * https://github.com/emscripten-core/emscripten/issues/1711 */
+# undef FD_SETSIZE
+# define FD_SETSIZE 64
+# endif
#endif /* UNIX */
/* OS/2 stuff */
@@ -148,12 +158,16 @@ typedef unsigned long in_addr_t;
*/
static inline bool SetNonBlocking(SOCKET d)
{
-#ifdef _WIN32
- u_long nonblocking = 1;
+#ifdef __EMSCRIPTEN__
+ return true;
#else
+# ifdef _WIN32
+ u_long nonblocking = 1;
+# else
int nonblocking = 1;
-#endif
+# endif
return ioctlsocket(d, FIONBIO, &nonblocking) == 0;
+#endif
}
/**
@@ -163,10 +177,14 @@ static inline bool SetNonBlocking(SOCKET d)
*/
static inline bool SetNoDelay(SOCKET d)
{
+#ifdef __EMSCRIPTEN__
+ return true;
+#else
/* XXX should this be done at all? */
int b = 1;
/* The (const char*) cast is needed for windows */
return setsockopt(d, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b)) == 0;
+#endif
}
/* Make sure these structures have the size we expect them to be */