Wrap uv_pipe_open, implement net.Stream(fd);
authorRyan Dahl <ry@tinyclouds.org>
Mon, 12 Sep 2011 21:59:51 +0000 (14:59 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Mon, 12 Sep 2011 22:09:44 +0000 (15:09 -0700)
Fixes simple/test-child-process-ipc on unix.

lib/net_uv.js
src/pipe_wrap.cc
src/pipe_wrap.h

index 97470f8..dddc03f 100644 (file)
@@ -78,21 +78,24 @@ function Socket(options) {
   stream.Stream.call(this);
 
   if (typeof options == 'number') {
-    // Legacy interface. Uncomment the following lines after
-    // libuv backend is stable and API compatibile with legaacy.
-    //   console.error('Deprecated interface net.Socket(fd).');
-    //   console.trace();
+    // Legacy interface.
     // Must support legacy interface. NPM depends on it.
     // https://github.com/isaacs/npm/blob/c7824f412f0cb59d6f55cf0bc220253c39e6029f/lib/utils/output.js#L110
-    // TODO Before we can do this we need a way to open a uv_stream_t by fd.
-    throw new Error("Not yet implemented")
-  }
+    var fd = options;
 
-  // private
-  this._handle = options && options.handle;
-  initSocketHandle(this);
-
-  this.allowHalfOpen = options && options.allowHalfOpen;
+    // Uncomment the following lines after libuv backend is stable and API
+    // compatibile with legaacy.
+    //   console.error('Deprecated interface net.Socket(fd).');
+    //   console.trace();
+    this._handle = createPipe();
+    this._handle.open(fd);
+    initSocketHandle(this);
+  } else {
+    // private
+    this._handle = options && options.handle;
+    initSocketHandle(this);
+    this.allowHalfOpen = options && options.allowHalfOpen;
+  }
 }
 util.inherits(Socket, stream.Stream);
 
index 247d715..f8a8c84 100644 (file)
@@ -70,6 +70,7 @@ void PipeWrap::Initialize(Handle<Object> target) {
   NODE_SET_PROTOTYPE_METHOD(t, "bind", Bind);
   NODE_SET_PROTOTYPE_METHOD(t, "listen", Listen);
   NODE_SET_PROTOTYPE_METHOD(t, "connect", Connect);
+  NODE_SET_PROTOTYPE_METHOD(t, "open", Open);
 
   pipeConstructor = Persistent<Function>::New(t->GetFunction());
 
@@ -195,6 +196,19 @@ void PipeWrap::AfterConnect(uv_connect_t* req, int status) {
 }
 
 
+Handle<Value> PipeWrap::Open(const Arguments& args) {
+  HandleScope scope;
+
+  UNWRAP
+
+  int fd = args[0]->IntegerValue();
+
+  uv_pipe_open(&wrap->handle_, fd);
+
+  return scope.Close(v8::Null());
+}
+
+
 Handle<Value> PipeWrap::Connect(const Arguments& args) {
   HandleScope scope;
 
index 65bec64..1ec51c7 100644 (file)
@@ -18,6 +18,7 @@ class PipeWrap : StreamWrap {
   static v8::Handle<v8::Value> Bind(const v8::Arguments& args);
   static v8::Handle<v8::Value> Listen(const v8::Arguments& args);
   static v8::Handle<v8::Value> Connect(const v8::Arguments& args);
+  static v8::Handle<v8::Value> Open(const v8::Arguments& args);
 
   static void OnConnection(uv_stream_t* handle, int status);
   static void AfterConnect(uv_connect_t* req, int status);