diff options
Diffstat (limited to 'src/library.js')
-rw-r--r-- | src/library.js | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/src/library.js b/src/library.js index e85008f3..b68a9324 100644 --- a/src/library.js +++ b/src/library.js @@ -1022,14 +1022,14 @@ LibraryManager.library = { if (relative.charAt(0) !== '.') { throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY); } - // see if the new path alreay exists + // see if the new path already exists var new_node; try { new_node = FS.lookupNode(new_dir, new_name); } catch (e) { // not fatal } - // early out if nothing needs to changews + // early out if nothing needs to change if (old_node === new_node) { return; } @@ -1383,7 +1383,7 @@ LibraryManager.library = { stream.stream_ops.allocate(stream, offset, length); }, mmap: function(stream, buffer, offset, length, position, prot, flags) { - // TODO if PROT is PROT_WRITE, make sure we have write acccess + // TODO if PROT is PROT_WRITE, make sure we have write access if ((stream.flags & {{{ cDefine('O_ACCMODE') }}}) === {{{ cDefine('O_WRONLY')}}}) { throw new FS.ErrnoError(ERRNO_CODES.EACCES); } @@ -1695,7 +1695,7 @@ LibraryManager.library = { } }, // NOTE: This is weird to support stdout and stderr - // overrides in addition to print and printErr orverrides. + // overrides in addition to print and printErr overrides. default_tty_ops: { get_char: function(tty) { if (!tty.input.length) { @@ -2901,7 +2901,7 @@ LibraryManager.library = { value = ENV['PATH'] || '/'; break; case {{{ cDefine('_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS') }}}: - // Mimicing glibc. + // Mimicking glibc. value = 'POSIX_V6_ILP32_OFF32\nPOSIX_V6_ILP32_OFFBIG'; break; case {{{ cDefine('_CS_GNU_LIBC_VERSION') }}}: @@ -9464,17 +9464,30 @@ LibraryManager.library = { return -1; } - return 0; + // always "fail" in non-blocking mode + ___setErrNo(ERRNO_CODES.EINPROGRESS); + return -1; }, recv__deps: ['$FS'], recv: function(fd, buf, len, flags) { var info = FS.getStream(fd); - if (!info) return -1; - if (!info.hasData()) { - ___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior + if (!info) { + ___setErrNo(ERRNO_CODES.EBADF); return -1; } +#if SOCKET_WEBRTC == 0 + if (!info.hasData()) { + if (info.socket.readyState === WebSocket.CLOSING || info.socket.readyState === WebSocket.CLOSED) { + // socket has closed + return 0; + } else { + // else, our socket is in a valid state but truly has nothing available + ___setErrNo(ERRNO_CODES.EAGAIN); + return -1; + } + } +#endif var buffer = info.inQueue.shift(); #if SOCKET_DEBUG Module.print('recv: ' + [Array.prototype.slice.call(buffer)]); @@ -9496,7 +9509,19 @@ LibraryManager.library = { send__deps: ['$FS'], send: function(fd, buf, len, flags) { var info = FS.getStream(fd); - if (!info) return -1; + if (!info) { + ___setErrNo(ERRNO_CODES.EBADF); + return -1; + } +#if SOCKET_WEBRTC == 0 + if (info.socket.readyState === WebSocket.CLOSING || info.socket.readyState === WebSocket.CLOSED) { + ___setErrNo(ERRNO_CODES.ENOTCONN); + return -1; + } else if (info.socket.readyState === WebSocket.CONNECTING) { + ___setErrNo(ERRNO_CODES.EAGAIN); + return -1; + } +#endif info.sender(HEAPU8.subarray(buf, buf+len)); return len; }, @@ -9634,7 +9659,8 @@ LibraryManager.library = { bind__deps: ['connect'], bind: function(fd, addr, addrlen) { - return _connect(fd, addr, addrlen); + _connect(fd, addr, addrlen); + return 0; }, listen: function(fd, backlog) { @@ -9667,24 +9693,12 @@ LibraryManager.library = { var errorCondition = 0; function canRead(info) { - // make sure hasData exists. - // we do create it when the socket is connected, - // but other implementations may create it lazily - if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED) && info.inQueue.length == 0) { - errorCondition = -1; - return false; - } - return info.hasData && info.hasData(); + return (info.hasData && info.hasData()) || + info.socket.readyState == WebSocket.CLOSING || // let recv return 0 once closed + info.socket.readyState == WebSocket.CLOSED; } function canWrite(info) { - // make sure socket exists. - // we do create it when the socket is connected, - // but other implementations may create it lazily - if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED)) { - errorCondition = -1; - return false; - } return info.socket && (info.socket.readyState == info.socket.OPEN); } @@ -9703,7 +9717,11 @@ LibraryManager.library = { if (int_ & mask) { // index is in the set, check if it is ready for read var info = FS.getStream(fd); - if (info && can(info)) { + if (!info) { + ___setErrNo(ERRNO_CODES.EBADF); + return -1; + } + if (can(info)) { // set bit fd < 32 ? (dstLow = dstLow | mask) : (dstHigh = dstHigh | mask); bitsSet++; |