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 handles might have been allocated |
+// and the caller should make sure to close them in case of an error. |
static bool CreateProcessPipe(HANDLE handles[2], |
char* pipe_name, |
- bool is_input) { |
- SECURITY_ATTRIBUTES security_attributes; |
- security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES); |
- security_attributes.bInheritHandle = TRUE; |
- security_attributes.lpSecurityDescriptor = NULL; |
- if (is_input) { |
+ NamedPipeType type) { |
+ // Security attributes describing an inheritable handle. |
+ SECURITY_ATTRIBUTES inherit_handle; |
+ inherit_handle.nLength = sizeof(SECURITY_ATTRIBUTES); |
+ inherit_handle.bInheritHandle = TRUE; |
+ inherit_handle.lpSecurityDescriptor = NULL; |
+ |
+ if (type == kInheritRead) { |
handles[kWriteHandle] = |
CreateNamedPipe(pipe_name, |
PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED, |
@@ -104,7 +115,7 @@ |
CreateFile(pipe_name, |
GENERIC_READ, |
0, |
- &security_attributes, |
+ &inherit_handle, |
OPEN_EXISTING, |
FILE_READ_ATTRIBUTES | FILE_FLAG_OVERLAPPED, |
NULL); |
@@ -113,6 +124,7 @@ |
return false; |
} |
} else { |
+ ASSERT(type == kInheritWrite || type == kInheritNone); |
handles[kReadHandle] = |
CreateNamedPipe(pipe_name, |
PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, |
@@ -132,7 +144,7 @@ |
CreateFile(pipe_name, |
GENERIC_WRITE, |
0, |
- &security_attributes, |
+ (type == kInheritWrite) ? &inherit_handle : NULL, |
OPEN_EXISTING, |
FILE_WRITE_ATTRIBUTES | FILE_FLAG_OVERLAPPED, |
NULL); |
@@ -157,6 +169,16 @@ |
} |
+static void CloseProcessPipes(HANDLE handles1[2], |
+ HANDLE handles2[2], |
+ HANDLE handles3[2], |
+ HANDLE handles4[2]) { |
+ CloseProcessPipe(handles1); |
+ CloseProcessPipe(handles2); |
+ CloseProcessPipe(handles3); |
+ CloseProcessPipe(handles4); |
+} |
+ |
static int SetOsErrorMessage(char* os_error_message, |
int os_error_message_len) { |
int error_code = GetLastError(); |
@@ -208,36 +230,34 @@ |
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); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
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); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
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); |
- CloseProcessPipe(stderr_handles); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
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)) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
- CloseProcessPipe(stdin_handles); |
- CloseProcessPipe(stdout_handles); |
- CloseProcessPipe(stderr_handles); |
- CloseProcessPipe(exit_handles); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
@@ -264,10 +284,8 @@ |
static const int kMaxCommandLineLength = 32768; |
if (command_line_length > kMaxCommandLineLength) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
- CloseProcessPipe(stdin_handles); |
- CloseProcessPipe(stdout_handles); |
- CloseProcessPipe(stderr_handles); |
- CloseProcessPipe(exit_handles); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |
@@ -303,10 +321,8 @@ |
if (result == 0) { |
int error_code = SetOsErrorMessage(os_error_message, os_error_message_len); |
- CloseProcessPipe(stdin_handles); |
- CloseProcessPipe(stdout_handles); |
- CloseProcessPipe(stderr_handles); |
- CloseProcessPipe(exit_handles); |
+ CloseProcessPipes( |
+ stdin_handles, stdout_handles, stderr_handles, exit_handles); |
return error_code; |
} |