Browse Source

child_process_uv: Handle spawn errors

v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
b30ad11b59
  1. 12
      deps/uv/src/win/process.c
  2. 33
      lib/child_process_uv.js

12
deps/uv/src/win/process.c

@ -680,7 +680,9 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
/* Create stdio pipes. */ /* Create stdio pipes. */
if (options.stdin_stream) { if (options.stdin_stream) {
err = uv_create_stdio_pipe_pair(options.stdin_stream, &process->stdio_pipes[0].child_pipe, PIPE_ACCESS_OUTBOUND, GENERIC_READ | FILE_WRITE_ATTRIBUTES); err = uv_create_stdio_pipe_pair(options.stdin_stream,
&process->stdio_pipes[0].child_pipe, PIPE_ACCESS_OUTBOUND,
GENERIC_READ | FILE_WRITE_ATTRIBUTES);
if (err) { if (err) {
goto done; goto done;
} }
@ -689,7 +691,9 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
} }
if (options.stdout_stream) { if (options.stdout_stream) {
err = uv_create_stdio_pipe_pair(options.stdout_stream, &process->stdio_pipes[1].child_pipe, PIPE_ACCESS_INBOUND, GENERIC_WRITE); err = uv_create_stdio_pipe_pair(options.stdout_stream,
&process->stdio_pipes[1].child_pipe, PIPE_ACCESS_INBOUND,
GENERIC_WRITE);
if (err) { if (err) {
goto done; goto done;
} }
@ -698,7 +702,9 @@ int uv_spawn(uv_process_t* process, uv_process_options_t options) {
} }
if (options.stderr_stream) { if (options.stderr_stream) {
err = uv_create_stdio_pipe_pair(options.stderr_stream, &process->stdio_pipes[2].child_pipe, PIPE_ACCESS_INBOUND, GENERIC_WRITE); err = uv_create_stdio_pipe_pair(options.stderr_stream,
&process->stdio_pipes[2].child_pipe, PIPE_ACCESS_INBOUND,
GENERIC_WRITE);
if (err) { if (err) {
goto done; goto done;
} }

33
lib/child_process_uv.js

@ -191,6 +191,7 @@ var spawn = exports.spawn = function(file, args, options) {
function maybeExit(subprocess) { function maybeExit(subprocess) {
console.log("maybeExit");
subprocess._closesGot++; subprocess._closesGot++;
if (subprocess._closesGot == subprocess._closesNeeded) { if (subprocess._closesGot == subprocess._closesNeeded) {
@ -213,6 +214,8 @@ function ChildProcess() {
if (signalCode) self.signalCode = signalCode; if (signalCode) self.signalCode = signalCode;
self.exitCode = exitCode; self.exitCode = exitCode;
console.error("onexit ", exitCode, signalCode);
if (self.stdin) { if (self.stdin) {
self.stdin.destroy(); self.stdin.destroy();
} }
@ -250,8 +253,28 @@ ChildProcess.prototype.spawn = function(options) {
var r = this._internal.spawn(options); var r = this._internal.spawn(options);
if (r) {
if (options.stdinStream) {
options.stdinStream.close();
}
if (options.stdoutStream) {
options.stdoutStream.close();
}
if (options.stderrStream) {
options.stderrStream.close();
}
this._internal.close();
this._internal = null;
throw errnoException("spawn", errno)
}
this.pid = this._internal.pid; this.pid = this._internal.pid;
console.log("started pid ", this.pid);
if (options.stdinStream) { if (options.stdinStream) {
this.stdin = createSocket(options.stdinStream, false); this.stdin = createSocket(options.stdinStream, false);
} }
@ -275,6 +298,16 @@ ChildProcess.prototype.spawn = function(options) {
return r; return r;
}; };
function errnoException(errorno, syscall) {
// TODO make this more compatible with ErrnoException from src/node.cc
// Once all of Node is using this function the ErrnoException from
// src/node.cc should be removed.
var e = new Error(syscall + ' ' + errorno);
e.errno = e.code = errorno;
e.syscall = syscall;
return e;
}
ChildProcess.prototype.kill = function(sig) { ChildProcess.prototype.kill = function(sig) {
throw new Error("implement me"); throw new Error("implement me");

Loading…
Cancel
Save