Chromium Code Reviews| Index: util/test/multiprocess_exec_test_child.cc |
| diff --git a/util/test/multiprocess_exec_test_child.cc b/util/test/multiprocess_exec_test_child.cc |
| index e1a06122ed1779d9cf1d33b125505053c1e1979c..7e8525c67e5ef95c29a2e43d1eac1f25c390d256 100644 |
| --- a/util/test/multiprocess_exec_test_child.cc |
| +++ b/util/test/multiprocess_exec_test_child.cc |
| @@ -17,11 +17,19 @@ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/types.h> |
| -#include <unistd.h> |
| #include <algorithm> |
| +#include "build/build_config.h" |
| + |
| +#if defined(OS_POSIX) |
| +#include <unistd.h> |
| +#elif defined(OS_WIN) |
| +#include <windows.h> |
| +#endif |
| + |
| int main(int argc, char* argv[]) { |
| +#if defined(OS_POSIX) |
| // Make sure that there’s nothing open at any FD higher than 3. All FDs other |
| // than stdin, stdout, and stderr should have been closed prior to or at |
| // exec(). |
| @@ -47,5 +55,41 @@ int main(int argc, char* argv[]) { |
| abort(); |
| } |
| +#elif defined(OS_WIN) |
| + |
| + // Make sure there's nothing open other than stdin, stdout, and stderr. |
| + HANDLE handle_stdin = GetStdHandle(STD_INPUT_HANDLE); |
| + HANDLE handle_stdout = GetStdHandle(STD_OUTPUT_HANDLE); |
| + HANDLE handle_stderr = GetStdHandle(STD_ERROR_HANDLE); |
| + // Handles can theoretically go as high as 2^32-4, but in practice they're |
|
Mark Mentovai
2015/01/08 17:20:20
I thought Windows had an API to do this a little m
Mark Mentovai
2015/01/08 17:20:20
Blank line before the comment, to make it easier t
scottmg
2015/01/08 18:15:53
Sure, I actually used that at first based on https
|
| + // never that large, so we check only up to 2^16. |
| + for (uintptr_t handle_int = 4; handle_int <= 0xffff; handle_int += 4) { |
| + HANDLE handle = reinterpret_cast<HANDLE>(handle_int); |
| + if (handle == handle_stdin || handle == handle_stdout || |
| + handle == handle_stderr) |
| + continue; |
|
Mark Mentovai
2015/01/08 17:20:20
{} me (the condition takes up more than one line,
scottmg
2015/01/08 18:15:53
Removed.
|
| + if (CloseHandle(handle)) { |
|
Mark Mentovai
2015/01/08 17:20:20
Can CloseHandle() fail for a reason other than an
scottmg
2015/01/08 18:15:53
I don't know of any reason, but there are so many
|
| + abort(); |
| + } |
| + } |
| + |
| + // Read a byte from stdin, expecting it to be a specific value. |
| + char c; |
| + DWORD bytes_read; |
| + if (!ReadFile(handle_stdin, &c, 1, &bytes_read, nullptr) || bytes_read != 1 || |
| + c != 'z') { |
| + abort(); |
| + } |
| + |
| + // Write a byte to stdout. |
| + c = 'Z'; |
| + DWORD bytes_written; |
| + if (!WriteFile(handle_stdout, &c, 1, &bytes_written, nullptr) || |
| + bytes_written != 1) { |
| + abort(); |
| + } |
| + |
| +#endif // OS_POSIX |
| + |
| return 0; |
| } |