aboutsummaryrefslogtreecommitdiff
path: root/src/library.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/library.js')
-rw-r--r--src/library.js72
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++;