diff options
87 files changed, 10785 insertions, 34 deletions
diff --git a/src/library.js b/src/library.js index 3531db97..938a3c92 100644 --- a/src/library.js +++ b/src/library.js @@ -6315,6 +6315,122 @@ LibraryManager.library = { ntohl: 'htonl', ntohs: 'htons', + inet_pton__deps: ['__setErrNo', '$ERRNO_CODES'], + inet_pton: function(af, src, dst) { + // int af, const char *src, void *dst + if ((af ^ {{{ cDefine("AF_INET") }}}) !== 0) { ___setErrNo(ERRNO_CODES.EAFNOSUPPORT); return -1; } + var b = Pointer_stringify(src).split("."); + if (b.length !== 4) return 0; + var ret = Number(b[0]) | (Number(b[1]) << 8) | (Number(b[2]) << 16) | (Number(b[3]) << 24); + if (isNaN(ret)) return 0; + setValue(dst, ret, 'i32'); + return 1; + }, + + _inet_ntop_raw: function(addr) { + return (addr & 0xff) + '.' + ((addr >> 8) & 0xff) + '.' + ((addr >> 16) & 0xff) + '.' + ((addr >> 24) & 0xff) + }, + + inet_ntop__deps: ['_inet_ntop_raw'], + inet_ntop: function(af, src, dst, size) { + var addr = getValue(src, 'i32'); + var str = __inet_ntop_raw(addr); + writeStringToMemory(str.substr(0, size), dst, true); + return dst; + }, + + // ========================================================================== + // sockets + // ========================================================================== + + $Sockets__deps: ['__setErrNo', '$ERRNO_CODES'], + $Sockets: { + BUFFER_SIZE: 10*1024, + nextFd: 1, + fds: {}, + sockaddr_in_layout: Runtime.generateStructInfo([ + ['i16', 'sin_family'], + ['i16', 'sin_port'], + ['i32', 'sin_addr'], + ['i64', 'sin_zero'], + ]), + }, + + socket__deps: ['$Sockets'], + socket: function(family, type, protocol) { + var fd = Sockets.nextFd++; + Sockets.fds[fd] = { + connected: false + }; + return fd; + }, + + connect__deps: ['$Sockets', '_inet_ntop_raw', 'ntohs'], + connect: function(fd, addr, addrlen) { + var info = Sockets.fds[fd]; + if (!info) return -1; + info.connected = true; + info.addr = getValue(addr + Sockets.sockaddr_in_layout.sin_addr, 'i32'); + info.port = _ntohs(getValue(addr + Sockets.sockaddr_in_layout.sin_port, 'i16')); + info.host = __inet_ntop_raw(info.addr); + info.socket = new WebSocket('ws://' + info.host + ':' + info.port, ['arraybuffer']); + info.socket.binaryType = 'arraybuffer'; + info.buffer = new Uint8Array(Sockets.BUFFER_SIZE); + info.bufferWrite = info.bufferRead = 0; + info.socket.onmessage = function (event) { + var data = event.data; + if (typeof data == 'string') { + var binaryString = window.atob(data); + var len = binaryString.length; + for (var i = 0; i < len; i++) { + info.buffer[info.bufferWrite++] = binaryString.charCodeAt(i); + if (info.bufferWrite == Sockets.BUFFER_SIZE) info.bufferWrite = 0; + if (info.bufferWrite == info.bufferRead) throw 'socket buffer overflow'; + } + } else { + console.log('binary!'); + } + } + return 0; + }, + + recv__deps: ['$Sockets'], + recv: function(fd, buf, len, flags) { + var info = Sockets.fds[fd]; + if (!info) return -1; + if (info.bufferWrite == info.bufferRead) { + ___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior + return 0; // should this be -1 like the spec says? + } + var ret = 0; + while (info.bufferWrite != info.bufferRead && len > 0) { + // write out a byte + {{{ makeSetValue('buf++', '0', 'info.buffer[info.bufferRead++]', 'i8') }}}; + if (info.bufferRead == Sockets.BUFFER_SIZE) info.bufferRead = 0; + len--; + ret++; + } + return ret; + }, + + shutdown: function(fd, how) { + var info = Sockets.fds[fd]; + if (!info) return -1; + info.socket.close(); + Sockets.fds[fd] = null; + }, + + ioctl: function(fd, request, varargs) { + var info = Sockets.fds[fd]; + if (!info) return -1; + var start = info.bufferRead; + var end = info.bufferWrite; + if (end < start) end += Sockets.BUFFER_SIZE; + var dest = {{{ makeGetValue('varargs', '0', 'i32') }}}; + {{{ makeSetValue('dest', '0', 'end - start', 'i32') }}}; + return 0; + }, + // ========================================================================== // emscripten.h // ========================================================================== diff --git a/src/library_browser.js b/src/library_browser.js index 5291dcee..27bf4a0c 100644 --- a/src/library_browser.js +++ b/src/library_browser.js @@ -347,6 +347,12 @@ mergeInto(LibraryManager.library, { }); addRunDependency('al ' + url); }, + + setCanvasSize: function(width, height) { + var canvas = Module['canvas']; + canvas.width = width; + canvas.height = height; + } }, emscripten_async_wget: function(url, file, onload, onerror) { @@ -494,8 +500,7 @@ mergeInto(LibraryManager.library, { }, emscripten_set_canvas_size: function(width, height) { - Module['canvas'].width = width; - Module['canvas'].height = height; + Browser.setCanvasSize(width, height); }, emscripten_get_now: function() { diff --git a/src/library_glut.js b/src/library_glut.js index d33f8436..b146cf47 100644 --- a/src/library_glut.js +++ b/src/library_glut.js @@ -237,8 +237,7 @@ var LibraryGLUT = { document.removeEventListener('mozfullscreenchange', GLUT.onFullScreenEventChange, true); document.removeEventListener('webkitfullscreenchange', GLUT.onFullScreenEventChange, true); } - Module['canvas'].width = width; - Module['canvas'].height = height; + Browser.setCanvasSize(width, height); /* Can't call _glutReshapeWindow as that requests cancelling fullscreen. */ if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc (from FS): " + width + ", " + height); @@ -274,8 +273,8 @@ var LibraryGLUT = { }, glutInitWindowSize: function(width, height) { - Module['canvas'].width = GLUT.initWindowWidth = width; - Module['canvas'].height = GLUT.initWindowHeight = height; + Browser.setCanvasSize( GLUT.initWindowWidth = width, + GLUT.initWindowHeight = height ); }, glutInitWindowPosition: function(x, y) { @@ -371,8 +370,7 @@ var LibraryGLUT = { glutReshapeWindow: function(width, height) { GLUT.cancelFullScreen(); // console.log("glutReshapeWindow: " + width + ", " + height); - Module['canvas'].width = width; - Module['canvas'].height = height; + Browser.setCanvasSize(width, height); if (GLUT.reshapeFunc) { // console.log("GLUT.reshapeFunc: " + width + ", " + height); FUNCTION_TABLE[GLUT.reshapeFunc](width, height); diff --git a/src/library_sdl.js b/src/library_sdl.js index da1e88af..c056c3f1 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -659,8 +659,7 @@ var LibrarySDL = { ['mousedown', 'mouseup', 'mousemove', 'DOMMouseScroll', 'mousewheel', 'mouseout'].forEach(function(event) { Module['canvas'].addEventListener(event, SDL.receiveEvent, true); }); - Module['canvas'].width = width; - Module['canvas'].height = height; + Browser.setCanvasSize(width, height); return SDL.screen = SDL.makeSurface(width, height, flags, true, 'screen'); }, diff --git a/src/library_xlib.js b/src/library_xlib.js index a110c786..7e420400 100644 --- a/src/library_xlib.js +++ b/src/library_xlib.js @@ -6,8 +6,7 @@ var LibraryXlib = { XCreateWindow: function(display, parent, x, y, width, height, border_width, depth, class_, visual, valuemask, attributes) { // All we can do is set the width and height - Module['canvas'].width = width; - Module['canvas'].height = height; + Browser.setCanvasSize(width, height); return 2; }, diff --git a/src/settings.js b/src/settings.js index 9a1afd69..5970737c 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1126,5 +1126,9 @@ var C_DEFINES = {'SI_MESGQ': '5', 'AT_FDCWD': '-2', 'SIGTTOU': '22', '_CS_POSIX_V7_LP64_OFF64_LDFLAGS': '10', - '_SC_TTY_NAME_MAX': '41'}; + '_SC_TTY_NAME_MAX': '41', + 'AF_INET': '1', + 'AF_INET6': '6', + 'FIONREAD': '1' +}; diff --git a/system/include/net/arpa/inet.h b/system/include/net/arpa/inet.h index 06d44183..9d078276 100644 --- a/system/include/net/arpa/inet.h +++ b/system/include/net/arpa/inet.h @@ -16,6 +16,9 @@ uint16_t ntohs(uint16_t netshort); int inet_aton(const char *cp, struct in_addr *addr); char *inet_ntoa(struct in_addr in); +int inet_pton(int af, const char *src, void *dst); +const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); + typedef long in_addr_t; in_addr_t inet_addr(const char *cp); diff --git a/system/include/sys/ioctl.h b/system/include/sys/ioctl.h index edc9ea36..12857ae3 100644 --- a/system/include/sys/ioctl.h +++ b/system/include/sys/ioctl.h @@ -11,6 +11, |