Index: bin/process_win.cc |
=================================================================== |
--- bin/process_win.cc (revision 390) |
+++ bin/process_win.cc (working copy) |
@@ -73,18 +73,29 @@ |
} |
+// Types of pipes to create. |
+enum NamedPipeType { |
+ kInheritRead, |
+ kInheritWrite, |
+ kInheritNone |
+}; |
+ |
+ |
// Create a pipe for communicating with a new process. The handles array |
-// will contain the read and write ends of the pipe. Based on the is_input |
-// argument either the read or the write end of the handle will be |
-// non-inherited. |
+// will contain the read and write ends of the pipe. Based on the type |
+// one of the handles will be inheritable. |
+// NOTE: If this function returns false the handled might have been allocated |
Mads Ager (google)
2011/10/13 12:40:35
handled -> handles
Søren Gjesse
2011/10/13 13:33:10
Done.
|
+// and the caller should make sure to close then in case of an error. |
Mads Ager (google)
2011/10/13 12:40:35
then -> them
Søren Gjesse
2011/10/13 13:33:10
Done.
|
static bool CreateProcessPipe(HANDLE handles[2], |
char* pipe_name, |
- bool is_input) { |
+ NamedPipeType type) { |
+ // Security attributes describing an inheritable handle. |
SECURITY_ATTRIBUTES security_attributes; |
security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES); |
security_attributes.bInheritHandle = TRUE; |
security_attributes.lpSecurityDescriptor = NULL; |
- if (is_input) { |
+ |
+ if (type == kInheritRead) { |
handles[kWriteHandle] = |
CreateNamedPipe(pipe_name, |
PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, |
@@ -112,7 +123,7 @@ |
fprintf(stderr, "CreateFile failed %d\n", GetLastError()); |
return false; |
} |
- } else { |
+ } else if (type == kInheritWrite) { |
Mads Ager (google)
2011/10/13 12:40:35
InheritWrite and InheritNone are identical except
Søren Gjesse
2011/10/13 13:33:10
Combined the two and used a conditional for the se
|
handles[kReadHandle] = |
CreateNamedPipe(pipe_name, |
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, |
@@ -140,6 +151,35 @@ |
fprintf(stderr, "CreateFile failed %d\n", GetLastError()); |
return false; |
} |
+ } else { |
+ ASSERT(type == kInheritNone); |
+ handles[kReadHandle] = |
+ CreateNamedPipe(pipe_name, |
+ PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, |
+ PIPE_TYPE_BYTE | PIPE_WAIT, |
+ 1, // Number of pipes |
+ 1024, // Out buffer size |
+ 1024, // In buffer size |
+ 0, // Timeout in ms |
+ NULL); |
+ |
+ if (handles[kReadHandle] == INVALID_HANDLE_VALUE) { |
+ fprintf(stderr, "CreateNamedPipe failed %d\n", GetLastError()); |
+ return false; |
+ } |
+ |
+ handles[kWriteHandle] = |
+ CreateFile(pipe_name, |
+ GENERIC_WRITE, |
+ 0, |
+ NULL, |
+ OPEN_EXISTING, |
+ FILE_WRITE_ATTRIBUTES | FILE_FLAG_OVERLAPPED, |
+ NULL); |
+ if (handles[kWriteHandle] == INVALID_HANDLE_VALUE) { |
+ fprintf(stderr, "CreateFile failed %d\n", GetLastError()); |
+ return false; |
+ } |
} |
return true; |
} |
@@ -208,14 +248,14 @@ |
pipe_id++; |
snprintf(pipe_name, sizeof(pipe_name), |
"\\\\.\\Pipe\\dart%d_%d_1", current_pid, pipe_id); |
- if (!CreateProcessPipe(stdin_handles, pipe_name, true)) { |
+ if (!CreateProcessPipe(stdin_handles, pipe_name, kInheritRead)) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
CloseProcessPipe(stdin_handles); |
Mads Ager (google)
2011/10/13 12:40:35
Can't you abstract all of these closing parts into
Søren Gjesse
2011/10/13 13:33:10
Done.
|
return error_code; |
} |
snprintf(pipe_name, sizeof(pipe_name), |
"\\\\.\\Pipe\\dart%d_%d_2", current_pid, pipe_id); |
- if (!CreateProcessPipe(stdout_handles, pipe_name, false)) { |
+ if (!CreateProcessPipe(stdout_handles, pipe_name, kInheritWrite)) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
CloseProcessPipe(stdin_handles); |
CloseProcessPipe(stdout_handles); |
@@ -223,7 +263,7 @@ |
} |
snprintf(pipe_name, sizeof(pipe_name), |
"\\\\.\\Pipe\\dart%d_%d_3", current_pid, pipe_id); |
- if (!CreateProcessPipe(stderr_handles, pipe_name, false)) { |
+ if (!CreateProcessPipe(stderr_handles, pipe_name, kInheritWrite)) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
CloseProcessPipe(stdin_handles); |
CloseProcessPipe(stdout_handles); |
@@ -232,7 +272,7 @@ |
} |
snprintf(pipe_name, sizeof(pipe_name), |
"\\\\.\\Pipe\\dart%d_%d_4", current_pid, pipe_id); |
- if (!CreateProcessPipe(exit_handles, pipe_name, false)) { |
+ if (!CreateProcessPipe(exit_handles, pipe_name, kInheritNone)) { |
Mads Ager (google)
2011/10/13 12:40:35
kDontInheritWrite?
Or maybe kReadInherit, kWriteI
Søren Gjesse
2011/10/13 13:33:10
The pipe is always created with both read and writ
|
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
CloseProcessPipe(stdin_handles); |
CloseProcessPipe(stdout_handles); |