| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/devtools/devtools_pipe/devtools_pipe.h" |
| |
| #include "build/build_config.h" |
| #include "content/public/browser/devtools_agent_host.h" |
| |
| #if BUILDFLAG(IS_WIN) |
| #include <io.h> |
| #include <stddef.h> |
| #include <stdlib.h> |
| #include "base/win/windows_types.h" |
| #else |
| #include <errno.h> |
| #include <fcntl.h> |
| #endif |
| |
| namespace devtools_pipe { |
| |
| namespace { |
| |
| #if BUILDFLAG(IS_WIN) |
| // A class to temporarily override invalid parameters handler called when the |
| // CRT detects an invalid argument on Windows. |
| class ScopedInvalidParameterHandlerOverride { |
| public: |
| ScopedInvalidParameterHandlerOverride() |
| : prev_invalid_parameter_handler_( |
| _set_thread_local_invalid_parameter_handler( |
| InvalidParameterHandler)) {} |
| |
| ScopedInvalidParameterHandlerOverride( |
| const ScopedInvalidParameterHandlerOverride&) = delete; |
| ScopedInvalidParameterHandlerOverride& operator=( |
| const ScopedInvalidParameterHandlerOverride&) = delete; |
| |
| ~ScopedInvalidParameterHandlerOverride() { |
| _set_thread_local_invalid_parameter_handler( |
| prev_invalid_parameter_handler_); |
| } |
| |
| private: |
| // A do nothing invalid parameter handler that causes CRT routine to return |
| // error to the caller. |
| static void InvalidParameterHandler(const wchar_t* expression, |
| const wchar_t* function, |
| const wchar_t* file, |
| unsigned int line, |
| uintptr_t reserved) {} |
| |
| const _invalid_parameter_handler prev_invalid_parameter_handler_; |
| }; |
| |
| #endif // #if BUILDFLAG(IS_WIN) |
| |
| } // namespace |
| |
| bool AreFileDescriptorsOpen() { |
| #if BUILDFLAG(IS_WIN) |
| ScopedInvalidParameterHandlerOverride invalid_parameter_handler_override; |
| return reinterpret_cast<HANDLE>(_get_osfhandle( |
| content::DevToolsAgentHost::kReadFD)) != INVALID_HANDLE_VALUE && |
| reinterpret_cast<HANDLE>(_get_osfhandle( |
| content::DevToolsAgentHost::kWriteFD)) != INVALID_HANDLE_VALUE; |
| #else |
| return fcntl(content::DevToolsAgentHost::kReadFD, F_GETFL) != -1 && |
| fcntl(content::DevToolsAgentHost::kWriteFD, F_GETFL) != -1; |
| #endif |
| } |
| |
| } // namespace devtools_pipe |