diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-10-04 16:06:47 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-10-04 16:06:47 -0700 |
commit | 1cfd5c91b0a7d0d0009f4fece429f8c2cc6a501c (patch) | |
tree | 1e47ddf34d5d455ad6a56c65e2cf358c9622a48e /src | |
parent | 4a5d3521d7f72b8aded5d2bddd74d5541d1eff3f (diff) |
recvmsg and further socket debugging
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 58 | ||||
-rw-r--r-- | src/settings.js | 1 |
2 files changed, 54 insertions, 5 deletions
diff --git a/src/library.js b/src/library.js index 221da010..6662e9b7 100644 --- a/src/library.js +++ b/src/library.js @@ -6475,7 +6475,7 @@ LibraryManager.library = { if (info.bufferWrite == info.bufferRead) throw 'socket buffer overflow'; } #if SOCKET_DEBUG - Module.print(['onmessage data:', out]); + Module.print(['onmessage data:', len, ':', out]); #endif } else { console.log('binary!'); @@ -6515,6 +6515,9 @@ LibraryManager.library = { return 0; // should this be -1 like the spec says? } var ret = 0; +#if SOCKET_DEBUG + Module.print('pre-recv: ' + [len, info.bufferWrite, info.bufferRead]); +#endif while (info.bufferWrite != info.bufferRead && len > 0) { // write out a byte {{{ makeSetValue('buf++', '0', 'info.buffer[info.bufferRead++]', 'i8') }}}; @@ -6523,7 +6526,7 @@ LibraryManager.library = { ret++; } #if SOCKET_DEBUG - Module.print('recv: ' + Array.prototype.slice.call(HEAPU8.subarray(buf-len, buf))); + Module.print('recv: ' + ret + ' : ' + Array.prototype.slice.call(HEAPU8.subarray(buf-len, buf))); #endif return ret; }, @@ -6556,7 +6559,7 @@ LibraryManager.library = { if (!currNum) continue; var currBuf = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov+8*i', 'i8*') }}}; #if SOCKET_DEBUG - Module.print('sendmsg part ' + i + ' : ' + Array.prototype.slice.call(HEAPU8.subarray(currBuf, currBuf+currNum))); + Module.print('sendmsg part ' + i + ' : ' + currNum + ' : ' + Array.prototype.slice.call(HEAPU8.subarray(currBuf, currBuf+currNum))); #endif data += Pointer_stringify(currBuf, currNum); } @@ -6564,8 +6567,53 @@ LibraryManager.library = { return data.length; }, - recvmsg__deps: ['$Sockets', 'connect', 'recv'], - recvmsg: function(fd, buf, len, flags, addr, addrlen) { + recvmsg__deps: ['$Sockets', 'connect', 'recv', '__setErrNo', '$ERRNO_CODES'], + recvmsg: function(fd, msg, flags) { +#if SOCKET_DEBUG + Module.print('recvmsg!'); +#endif + var info = Sockets.fds[fd]; + if (!info) return -1; + // if we are not connected, use the address info in the message + if (!info.connected) { +#if SOCKET_DEBUG + Module.print('recvmsg connecting'); +#endif + 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 bytes = info.bufferWrite - info.bufferRead; + if (bytes < 0) bytes += Sockets.BUFFER_SIZE; +#if SOCKET_DEBUG + Module.print('recvmsg bytes: ' + bytes); +#endif + if (bytes == 0) { + ___setErrNo(ERRNO_CODES.EWOULDBLOCK); + return -1; + } + var ret = bytes; + var num = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iovlen', 'i32') }}}; + var data = ''; + for (var i = 0; i < num && bytes > 0; i++) { + var currNum = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov+8*i' + '+4', 'i32') }}}; +#if SOCKET_DEBUG + Module.print('recvmsg loop ' + [i, num, bytes, currNum]); +#endif + if (!currNum) continue; + currNum = Math.min(currNum, bytes); // XXX what should happen when we partially fill a buffer..? + bytes -= currNum; + var currBuf = {{{ makeGetValue('msg', 'Sockets.msghdr_layout.msg_iov+8*i', 'i8*') }}}; +#if SOCKET_DEBUG + Module.print('recvmsg call recv ' + currNum); +#endif + assert(_recv(fd, currBuf, currNum, 0) == currNum); + } + return ret; + }, + + recvfrom__deps: ['$Sockets', 'connect', 'recv'], + recvfrom: 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 diff --git a/src/settings.js b/src/settings.js index 5970737c..9e6f257a 100644 --- a/src/settings.js +++ b/src/settings.js @@ -124,6 +124,7 @@ var LIBRARY_DEBUG = 0; // Print out when we enter a library call (library*.js). // emscripten_run_script("Runtime.debug = ...;"); var GL_DEBUG = 0; // Print out all calls into WebGL. As with LIBRARY_DEBUG, you can set a runtime // option, in this case GL.debug. +var SOCKET_DEBUG = 0; // Log out socket/network data transfer. var PROFILE_MAIN_LOOP = 0; // Profile the function called in set_main_loop |