diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-03-10 18:43:31 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-03-10 18:43:31 -0800 |
commit | ec9bd63e8c935e1784be2ec1171a8445b7673ea1 (patch) | |
tree | 2d30bfc1550e97187c4104eb9018acaf27f706f4 /src | |
parent | a78a13dc7bee141afc6be2a68e6b19912f2a260c (diff) |
properly implement isatty
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/src/library.js b/src/library.js index 598838a0..4d90fa05 100644 --- a/src/library.js +++ b/src/library.js @@ -315,33 +315,46 @@ LibraryManager.library = { error = error || Module['stderr']; // Default handlers. - if (!input) input = function() { - if (!input.cache || !input.cache.length) { - var result; - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); - } else if (typeof readline == 'function') { - // Command line. - result = readline(); + var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true; + if (!input) { + stdinOverridden = false; + input = function() { + if (!input.cache || !input.cache.length) { + var result; + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + } + if (!result) result = ''; + input.cache = intArrayFromString(result + '\n', true); } - if (!result) result = ''; - input.cache = intArrayFromString(result + '\n', true); - } - return input.cache.shift(); - }; - if (!output) output = function(val) { + return input.cache.shift(); + }; + } + function simpleOutput(val) { if (val === null || val === '\n'.charCodeAt(0)) { output.printer(output.buffer.join('')); output.buffer = []; } else { output.buffer.push(String.fromCharCode(val)); } - }; + } + if (!output) { + stdoutOverridden = false; + output = simpleOutput; + } if (!output.printer) output.printer = print; if (!output.buffer) output.buffer = []; - if (!error) error = output; + if (!error) { + stderrOverridden = false; + error = simpleOutput; + } + if (!error.printer) error.printer = print; + if (!error.buffer) error.buffer = []; // Create the temporary folder. FS.createFolder('/', 'tmp', true, true); @@ -361,6 +374,7 @@ LibraryManager.library = { isRead: true, isWrite: false, isAppend: false, + isTerminal: !stdinOverridden, error: false, eof: false, ungotten: [] @@ -372,6 +386,7 @@ LibraryManager.library = { isRead: false, isWrite: true, isAppend: false, + isTerminal: !stdoutOverridden, error: false, eof: false, ungotten: [] @@ -383,6 +398,7 @@ LibraryManager.library = { isRead: false, isWrite: true, isAppend: false, + isTerminal: !stderrOverridden, error: false, eof: false, ungotten: [] @@ -1391,9 +1407,13 @@ LibraryManager.library = { isatty: function(fildes) { // int isatty(int fildes); // http://pubs.opengroup.org/onlinepubs/000095399/functions/isatty.html - // For now it's easier to pretend we have no terminals. - ___setErrNo(FS.streams[fildes] ? ERRNO_CODES.ENOTTY : ERRNO_CODES.EBADF); - return -1; + if (!FS.streams[fildes]) { + ___setErrNo(ERRNO_CODES.EBADF); + return 0; + } + if (FS.streams[fildes].isTerminal) return 1; + ___setErrNo(ERRNO_CODES.ENOTTY); + return 0; }, lchown__deps: ['chown'], lchown: function(path, owner, group) { |