Browse Source

Wrap uv_pipe_open, implement net.Stream(fd);

Fixes simple/test-child-process-ipc on unix.
Ryan Dahl 14 years ago
parent
commit
caaa59c559
  1. 19
      lib/net_uv.js
  2. 14
      src/pipe_wrap.cc
  3. 1
      src/pipe_wrap.h

19
lib/net_uv.js

@ -78,22 +78,25 @@ function Socket(options) {
stream.Stream.call(this); stream.Stream.call(this);
if (typeof options == 'number') { if (typeof options == 'number') {
// Legacy interface. Uncomment the following lines after // Legacy interface.
// libuv backend is stable and API compatibile with legaacy.
// console.error('Deprecated interface net.Socket(fd).');
// console.trace();
// Must support legacy interface. NPM depends on it. // Must support legacy interface. NPM depends on it.
// https://github.com/isaacs/npm/blob/c7824f412f0cb59d6f55cf0bc220253c39e6029f/lib/utils/output.js#L110 // 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. var fd = options;
throw new Error("Not yet implemented")
}
// 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 // private
this._handle = options && options.handle; this._handle = options && options.handle;
initSocketHandle(this); initSocketHandle(this);
this.allowHalfOpen = options && options.allowHalfOpen; this.allowHalfOpen = options && options.allowHalfOpen;
} }
}
util.inherits(Socket, stream.Stream); util.inherits(Socket, stream.Stream);

14
src/pipe_wrap.cc

@ -70,6 +70,7 @@ void PipeWrap::Initialize(Handle<Object> target) {
NODE_SET_PROTOTYPE_METHOD(t, "bind", Bind); NODE_SET_PROTOTYPE_METHOD(t, "bind", Bind);
NODE_SET_PROTOTYPE_METHOD(t, "listen", Listen); NODE_SET_PROTOTYPE_METHOD(t, "listen", Listen);
NODE_SET_PROTOTYPE_METHOD(t, "connect", Connect); NODE_SET_PROTOTYPE_METHOD(t, "connect", Connect);
NODE_SET_PROTOTYPE_METHOD(t, "open", Open);
pipeConstructor = Persistent<Function>::New(t->GetFunction()); 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) { Handle<Value> PipeWrap::Connect(const Arguments& args) {
HandleScope scope; HandleScope scope;

1
src/pipe_wrap.h

@ -18,6 +18,7 @@ class PipeWrap : StreamWrap {
static v8::Handle<v8::Value> Bind(const v8::Arguments& args); 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> Listen(const v8::Arguments& args);
static v8::Handle<v8::Value> Connect(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 OnConnection(uv_stream_t* handle, int status);
static void AfterConnect(uv_connect_t* req, int status); static void AfterConnect(uv_connect_t* req, int status);

Loading…
Cancel
Save