diff --git a/mfbt/UniquePtrExtensions.cpp b/mfbt/UniquePtrExtensions.cpp index 229c9421960d..3b509fb9e0ab 100644 --- a/mfbt/UniquePtrExtensions.cpp +++ b/mfbt/UniquePtrExtensions.cpp @@ -32,4 +32,25 @@ void FileHandleDeleter::operator()(FileHandleHelper aHelper) { } } // namespace detail + +#ifndef __wasm__ +UniqueFileHandle DuplicateFileHandle(detail::FileHandleType aFile) { +# ifdef XP_WIN + if (aFile != INVALID_HANDLE_VALUE && aFile != NULL) { + HANDLE handle; + HANDLE currentProcess = ::GetCurrentProcess(); + if (::DuplicateHandle(currentProcess, aFile, currentProcess, &handle, 0, + false, DUPLICATE_SAME_ACCESS)) { + return UniqueFileHandle{handle}; + } + } +# else + if (aFile != -1) { + return UniqueFileHandle{dup(aFile)}; + } +# endif + return nullptr; +} +#endif + } // namespace mozilla diff --git a/mfbt/UniquePtrExtensions.h b/mfbt/UniquePtrExtensions.h index 2679440e501e..c93f76a00871 100644 --- a/mfbt/UniquePtrExtensions.h +++ b/mfbt/UniquePtrExtensions.h @@ -220,6 +220,14 @@ using UniqueFreePtr = UniquePtr>; using UniqueFileHandle = UniquePtr; +#ifndef __wasm__ +// WASI does not have `dup` +MFBT_API UniqueFileHandle DuplicateFileHandle(detail::FileHandleType aFile); +inline UniqueFileHandle DuplicateFileHandle(const UniqueFileHandle& aFile) { + return DuplicateFileHandle(aFile.get()); +} +#endif + #if defined(XP_DARWIN) && !defined(RUST_BINDGEN) // A RAII class for a Mach port that names a send right. using UniqueMachSendRight =