aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-08-03 15:12:43 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-08-03 15:12:43 -0700
commitcb990bd69e45c6e4fc28c9e9e932cde5f07adb09 (patch)
tree22deb263f926a85e30105da176637a44513ce9f7
parent069a356cda09cf60a4be904beeef4705c6095746 (diff)
properly account for the difference between dup2 and fcntl/F_DUPFD
-rw-r--r--src/library.js6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/library.js b/src/library.js
index bfd02151..887d3706 100644
--- a/src/library.js
+++ b/src/library.js
@@ -1131,7 +1131,7 @@ LibraryManager.library = {
return _open(path, {{{ cDefine('O_WRONLY') }}} | {{{ cDefine('O_CREAT') }}} | {{{ cDefine('O_TRUNC') }}}, allocate([mode, 0, 0, 0], 'i32', ALLOC_STACK));
},
fcntl__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', '__flock_struct_layout'],
- fcntl: function(fildes, cmd, varargs) {
+ fcntl: function(fildes, cmd, varargs, dup2) {
// int fcntl(int fildes, int cmd, ...);
// http://pubs.opengroup.org/onlinepubs/009695399/functions/fcntl.html
if (!FS.streams[fildes]) {
@@ -1150,7 +1150,7 @@ LibraryManager.library = {
for (var member in stream) {
newStream[member] = stream[member];
}
- arg = Math.max(arg, FS.streams.length);
+ arg = dup2 ? arg : Math.max(arg, FS.streams.length); // dup2 wants exactly arg; fcntl wants a free descriptor >= arg
for (var i = FS.streams.length; i < arg; i++) {
FS.streams[i] = null; // Keep dense
}
@@ -1339,7 +1339,7 @@ LibraryManager.library = {
return fildes;
} else {
_close(fildes2);
- return _fcntl(fildes, 0, allocate([fildes2, 0, 0, 0], 'i32', ALLOC_STACK)); // F_DUPFD.
+ return _fcntl(fildes, 0, allocate([fildes2, 0, 0, 0], 'i32', ALLOC_STACK), true); // F_DUPFD.
}
},
fchown__deps: ['$FS', '__setErrNo', '$ERRNO_CODES', 'chown'],