diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-02 17:33:50 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-02 17:33:50 -0700 |
commit | a607486fb03f328927230958d850d4832c15a77e (patch) | |
tree | 5b510afde9898db6583a4db6bda10469f6c06061 | |
parent | 5d8c2cfa7b383bb9476b640bb8ff5edae657c183 (diff) |
sendmsg and recvmsg
-rw-r--r-- | src/library.js | 43 | ||||
-rw-r--r-- | tests/enet_client.c | 6 | ||||
-rw-r--r-- | tests/enet_server.c | 2 |
3 files changed, 48 insertions, 3 deletions
diff --git a/src/library.js b/src/library.js index ffbe773e..546224d4 100644 --- a/src/library.js +++ b/src/library.js @@ -6410,6 +6410,15 @@ LibraryManager.library = { ['i32', 'sin_addr'], ['i64', 'sin_zero'], ]), + msghdr_layout: Runtime.generateStructInfo([ + ['*', 'msg_name'], + ['i32', 'msg_namelen'], + ['*', 'msg_iov'], + ['i32', 'msg_iovlen'], + ['*', 'msg_control'], + ['i32', 'msg_controllen'], + ['i32', 'msg_flags'], + ]), }, socket__deps: ['$Sockets'], @@ -6504,6 +6513,40 @@ LibraryManager.library = { var info = Sockets.fds[fd]; if (!info) return -1; info.sender(Pointer_stringify(buf, len)); + return len; + }, + + sendmsg__deps: ['$Sockets', 'connect'], + sendmsg: function(fd, msg, flags) { + var info = Sockets.fds[fd]; + if (!info) return -1; + // if we are not connected, use the address info in the message + if (!info.connected) { + var name = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_name', '*') }}}; + assert(name, 'sendmsg on non-connected socket, and no name/address in the message'); + _connect(fd, name, {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_namelen', 'i32') }}}); + } + var num = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iovlen', 'i32') }}}; + var data = ''; + for (var i = 0; i < num; i++) { + var currNum = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov+8*i' + '+4', 'i32') }}}; + if (!currNum) continue; + data += Pointer_stringify({{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov+8*i', 'i8*') }}}, currNum); + } + info.sender(data); + return data.length; + }, + + recvmsg__deps: ['$Sockets', 'connect', 'recv'], + recvmsg: function(fd, buf, len, flags, addr, addrlen) { + var info = Sockets.fds[fd]; + if (!info) return -1; + // if we are not connected, use the address info in the message + if (!info.connected) { + //var name = {{{ makeGetValue('addr', '0', '*') }}}; + _connect(fd, addr, addrlen); + } + return _recv(fd, buf, len, flags); }, shutdown: function(fd, how) { diff --git a/tests/enet_client.c b/tests/enet_client.c index 59010184..b22e7bc4 100644 --- a/tests/enet_client.c +++ b/tests/enet_client.c @@ -1,5 +1,3 @@ -// g++ /home/alon/Dev/emscripten/tests/enet_client.c -I/home/alon/Dev/emscripten/system/include/emscripten/ -Iinclude/ -fpermissive .libs/libenet.a -o enet_client - #include <stdio.h> #include <emscripten.h> @@ -61,7 +59,11 @@ int main (int argc, char ** argv) ENetAddress address; enet_address_set_host (& address, "localhost"); +#if EMSCRIPTEN address.port = 1237; +#else + address.port = 1235; +#endif printf("connecting to server...\n"); diff --git a/tests/enet_server.c b/tests/enet_server.c index 351cc921..8aceda22 100644 --- a/tests/enet_server.c +++ b/tests/enet_server.c @@ -1,4 +1,4 @@ -// g++ /home/alon/Dev/emscripten/tests/enet_server.c -I/home/alon/Dev/emscripten/system/include/emscripten/ -Iinclude/ -fpermissive .libs/libenet.a -o enet_server +// g++ /home/alon/Dev/emscripten/tests/enet_server.c -I/home/alon/Dev/emscripten/system/include/emscripten/ -Iinclude/ -fpermissive .libs/libenet.a -o enet_server ; g++ /home/alon/Dev/emscripten/tests/enet_client.c -I/home/alon/Dev/emscripten/system/include/emscripten/ -Iinclude/ -fpermissive .libs/libenet.a -o enet_client #include <stdio.h> #include <emscripten.h> |