aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-10-02 17:33:50 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-10-02 17:33:50 -0700
commita607486fb03f328927230958d850d4832c15a77e (patch)
tree5b510afde9898db6583a4db6bda10469f6c06061
parent5d8c2cfa7b383bb9476b640bb8ff5edae657c183 (diff)
sendmsg and recvmsg
-rw-r--r--src/library.js43
-rw-r--r--tests/enet_client.c6
-rw-r--r--tests/enet_server.c2
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>