summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2011-09-22 22:00:00 -0700
committerRyan Dahl <ry@tinyclouds.org>2011-09-27 13:03:28 -0700
commit1de156abb10e646c05485d95dfce6d1805514822 (patch)
treeb59efc5c83be08062b5202dd257da4dabbfd9506 /src
parent74b6426ec657aaa36bd3a6beab3f5723006a7ea0 (diff)
downloadandroid-node-v8-1de156abb10e646c05485d95dfce6d1805514822.tar.gz
android-node-v8-1de156abb10e646c05485d95dfce6d1805514822.tar.bz2
android-node-v8-1de156abb10e646c05485d95dfce6d1805514822.zip
Bind/use uv_guess_handle
Diffstat (limited to 'src')
-rw-r--r--src/node.js116
-rw-r--r--src/tty_wrap.cc26
2 files changed, 95 insertions, 47 deletions
diff --git a/src/node.js b/src/node.js
index dd8f850104..334c4eb422 100644
--- a/src/node.js
+++ b/src/node.js
@@ -223,43 +223,54 @@
process.__defineGetter__('stdout', function() {
if (stdout) return stdout;
- var binding = process.binding('stdio'),
- fd = binding.stdoutFD;
+ var tty_wrap = process.binding('tty_wrap');
+ var binding = process.binding('stdio');
+ var fd = 1;
// Note stdout._type is used for test-module-load-list.js
- if (binding.isatty(fd)) {
- var tty = NativeModule.require('tty');
- stdout = new tty.WriteStream(fd);
- stdout._type = "tty";
-
- // FIXME Hack to have stdout not keep the event loop alive.
- // See https://github.com/joyent/node/issues/1726
- binding.unref();
- stdout.on('close', function() {
- binding.ref();
- });
- } else if (binding.isStdoutBlocking()) {
- var fs = NativeModule.require('fs');
- stdout = new fs.WriteStream(null, {fd: fd});
- stdout._type = "fs";
- } else {
- var net = NativeModule.require('net');
- stdout = new net.Stream(fd);
-
- // FIXME Hack to have stdout not keep the event loop alive.
- // See https://github.com/joyent/node/issues/1726
- binding.unref();
- stdout.on('close', function() {
- binding.ref();
- });
-
- // FIXME Should probably have an option in net.Stream to create a
- // stream from an existing fd which is writable only. But for now
- // we'll just add this hack and set the `readable` member to false.
- // Test: ./node test/fixtures/echo.js < /etc/passwd
- stdout.readable = false;
- stdout._type = "pipe";
+ switch (tty_wrap.guessHandleType(fd)) {
+ case 'TTY':
+ var tty = NativeModule.require('tty');
+ stdout = new tty.WriteStream(fd);
+ stdout._type = "tty";
+
+ // FIXME Hack to have stdout not keep the event loop alive.
+ // See https://github.com/joyent/node/issues/1726
+ binding.unref();
+ stdout.on('close', function() {
+ binding.ref();
+ });
+ break;
+
+ case 'FILE':
+ var fs = NativeModule.require('fs');
+ stdout = new fs.WriteStream(null, {fd: fd});
+ stdout._type = "fs";
+ break;
+
+ case 'PIPE':
+ var net = NativeModule.require('net');
+ stdout = new net.Stream(fd);
+
+ // FIXME Should probably have an option in net.Stream to create a
+ // stream from an existing fd which is writable only. But for now
+ // we'll just add this hack and set the `readable` member to false.
+ // Test: ./node test/fixtures/echo.js < /etc/passwd
+ stdout.readable = false;
+ stdout._type = "pipe";
+
+ // FIXME Hack to have stdout not keep the event loop alive.
+ // See https://github.com/joyent/node/issues/1726
+ binding.unref();
+ stdout.on('close', function() {
+ binding.ref();
+ });
+ break;
+
+ default:
+ // Probably an error on in uv_guess_handle()
+ throw new Error("Implement me. Unknown stdout file type!");
}
// For supporting legacy API we put the FD here.
@@ -280,19 +291,30 @@
process.__defineGetter__('stdin', function() {
if (stdin) return stdin;
- var binding = process.binding('stdio'),
- fd = binding.openStdin();
-
- if (binding.isatty(fd)) {
- var tty = NativeModule.require('tty');
- stdin = new tty.ReadStream(fd);
- } else if (binding.isStdinBlocking()) {
- var fs = NativeModule.require('fs');
- stdin = new fs.ReadStream(null, {fd: fd});
- } else {
- var net = NativeModule.require('net');
- stdin = new net.Stream(fd);
- stdin.readable = true;
+ var tty_wrap = process.binding('tty_wrap');
+ var binding = process.binding('stdio');
+ var fd = 0;
+
+ switch (tty_wrap.guessHandleType(fd)) {
+ case 'TTY':
+ var tty = NativeModule.require('tty');
+ stdin = new tty.ReadStream(fd);
+ break;
+
+ case 'FILE':
+ var fs = NativeModule.require('fs');
+ stdin = new fs.ReadStream(null, {fd: fd});
+ break;
+
+ case 'PIPE':
+ var net = NativeModule.require('net');
+ stdin = new net.Stream(fd);
+ stdin.readable = true;
+ break;
+
+ default:
+ // Probably an error on in uv_guess_handle()
+ throw new Error("Implement me. Unknown stdin file type!");
}
// For supporting legacy API we put the FD here.
diff --git a/src/tty_wrap.cc b/src/tty_wrap.cc
index 3c85aaeb07..0d3e037068 100644
--- a/src/tty_wrap.cc
+++ b/src/tty_wrap.cc
@@ -54,11 +54,37 @@ class TTYWrap : StreamWrap {
NODE_SET_PROTOTYPE_METHOD(t, "setRawMode", SetRawMode);
NODE_SET_METHOD(target, "isTTY", IsTTY);
+ NODE_SET_METHOD(target, "guessHandleType", GuessHandleType);
target->Set(String::NewSymbol("TTY"), t->GetFunction());
}
private:
+ static Handle<Value> GuessHandleType(const Arguments& args) {
+ HandleScope scope;
+ int fd = args[0]->Int32Value();
+ assert(fd >= 0);
+
+ uv_handle_type t = uv_guess_handle(fd);
+
+ switch (t) {
+ case UV_TTY:
+ return String::New("TTY");
+
+ case UV_NAMED_PIPE:
+ return String::New("PIPE");
+
+ case UV_FILE:
+ return String::New("FILE");
+
+ default:
+ assert(0);
+ return v8::Undefined();
+ }
+ return uv_is_tty(fd) ? v8::True() : v8::False();
+
+ }
+
static Handle<Value> IsTTY(const Arguments& args) {
HandleScope scope;
int fd = args[0]->Int32Value();