/* Create stdio pipes. */
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) {
goto done;
}
}
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) {
goto done;
}
}
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) {
goto done;
}
function maybeExit(subprocess) {
+ console.log("maybeExit");
subprocess._closesGot++;
if (subprocess._closesGot == subprocess._closesNeeded) {
if (signalCode) self.signalCode = signalCode;
self.exitCode = exitCode;
+ console.error("onexit ", exitCode, signalCode);
+
if (self.stdin) {
self.stdin.destroy();
}
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;
+ console.log("started pid ", this.pid);
+
if (options.stdinStream) {
this.stdin = createSocket(options.stdinStream, false);
}
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) {
throw new Error("implement me");