diff --git a/lib/stream.js b/lib/stream.js index 530b087e491654..fa45b8b1e150bd 100644 --- a/lib/stream.js +++ b/lib/stream.js @@ -54,7 +54,7 @@ Stream.prototype.pipe = function(dest, options) { // If the 'end' option is not supplied, dest.end() will be called when // source gets the 'end' or 'close' events. Only dest.end() once, and // only when all sources have ended. - if (!options || options.end !== false) { + if (!dest._isStdio && (!options || options.end !== false)) { dest._pipeCount = dest._pipeCount || 0; dest._pipeCount++; diff --git a/src/node.js b/src/node.js index f24a92ee22bed5..2d409eb534ff42 100644 --- a/src/node.js +++ b/src/node.js @@ -269,6 +269,8 @@ // For supporting legacy API we put the FD here. stream.fd = fd; + stream._isStdio = true; + return stream; } @@ -278,14 +280,18 @@ process.__defineGetter__('stdout', function() { if (stdout) return stdout; stdout = createWritableStdioStream(1); - stdout.end = stdout.destroy = stdout.destroySoon = function() { }; + stdout.end = stdout.destroy = stdout.destroySoon = function() { + throw new Error('process.stdout cannot be closed'); + }; return stdout; }); process.__defineGetter__('stderr', function() { if (stderr) return stderr; stderr = createWritableStdioStream(2); - stderr.end = stderr.destroy = stderr.destroySoon = function() { }; + stderr.end = stderr.destroy = stderr.destroySoon = function() { + throw new Error('process.stderr cannot be closed'); + }; return stderr; }); diff --git a/test/simple/test-tty-stdout-end.js b/test/simple/test-tty-stdout-end.js index c79e029e1e9297..f09bf8ac76f050 100644 --- a/test/simple/test-tty-stdout-end.js +++ b/test/simple/test-tty-stdout-end.js @@ -22,14 +22,15 @@ // Can't test this when 'make test' doesn't assign a tty to the stdout. var common = require('../common'); var assert = require('assert'); -var tty = require('tty'); -var closed = false; -process.stdout.on('close', function() { - closed = true; -}); -process.on('exit', function() { - assert.ok(closed); -}); +var exceptionCaught = false; -process.stdout.end(); +try { + process.stdout.end(); +} catch(e) { + exceptionCaught = true; + assert.ok(common.isError(e)); + assert.equal('process.stdout cannot be closed', e.message); +} + +assert.ok(exceptionCaught);