// Copyright 2019 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef BAZEL_SRC_MAIN_NATIVE_WINDOWS_PROCESS_H_ #define BAZEL_SRC_MAIN_NATIVE_WINDOWS_PROCESS_H_ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include #include #include #include "src/main/native/windows/util.h" namespace bazel { namespace windows { class WaitableProcess { public: // These are the possible return values from the WaitFor() method. enum { kWaitSuccess = 0, kWaitTimeout = 1, kWaitError = 2, }; WaitableProcess() : pid_(0), exit_code_(STILL_ACTIVE) {} bool Create(const std::wstring& argv0, const std::wstring& argv_rest, void* env, const std::wstring& wcwd, std::wstring* error); bool Create(const std::wstring& argv0, const std::wstring& argv_rest, void* env, const std::wstring& wcwd, HANDLE stdin_process, HANDLE stdout_process, HANDLE stderr_process, LARGE_INTEGER* opt_out_start_time, std::wstring* error); int WaitFor(int64_t timeout_msec, LARGE_INTEGER* opt_out_end_time, std::wstring* error); int GetExitCode(std::wstring* error); bool Terminate(std::wstring* error); DWORD GetPid() const { return pid_; } private: bool Create(const std::wstring& argv0, const std::wstring& argv_rest, void* env, const std::wstring& wcwd, HANDLE stdin_process, HANDLE stdout_process, HANDLE stderr_process, LARGE_INTEGER* opt_out_start_time, bool create_window, bool handle_signals, std::wstring* error); AutoHandle process_, job_, ioport_; DWORD pid_, exit_code_; }; // Escape a command line argument using Windows escaping syntax. // // This escaping lets us safely pass arguments to subprocesses created with // CreateProcessW. (The escaping rules are a bit complex, look at the function // implementation.) std::wstring WindowsEscapeArg(const std::wstring& arg); } // namespace windows } // namespace bazel #endif // BAZEL_SRC_MAIN_NATIVE_WINDOWS_PROCESS_H_