// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "mojo/core/platform_handle_utils.h" #include "build/build_config.h" #if defined(OS_FUCHSIA) #include #elif defined(OS_POSIX) #include "base/files/scoped_file.h" #elif defined(OS_WIN) #include "base/win/scoped_handle.h" #endif #if defined(OS_MACOSX) && !defined(OS_IOS) #include "base/mac/scoped_mach_port.h" #endif namespace mojo { namespace core { void ExtractPlatformHandlesFromSharedMemoryRegionHandle( base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle handle, PlatformHandle* extracted_handle, PlatformHandle* extracted_readonly_handle) { #if defined(OS_WIN) *extracted_handle = PlatformHandle(base::win::ScopedHandle(handle.Take())); #elif defined(OS_FUCHSIA) *extracted_handle = PlatformHandle(std::move(handle)); #elif defined(OS_MACOSX) && !defined(OS_IOS) // This is a Mach port. Same code as above and below, but separated for // clarity. *extracted_handle = PlatformHandle(std::move(handle)); #elif defined(OS_ANDROID) // This is a file descriptor. Same code as above, but separated for clarity. *extracted_handle = PlatformHandle(std::move(handle)); #else *extracted_handle = PlatformHandle(std::move(handle.fd)); *extracted_readonly_handle = PlatformHandle(std::move(handle.readonly_fd)); #endif } base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle CreateSharedMemoryRegionHandleFromPlatformHandles( PlatformHandle handle, PlatformHandle readonly_handle) { #if defined(OS_WIN) DCHECK(!readonly_handle.is_valid()); return handle.TakeHandle(); #elif defined(OS_FUCHSIA) DCHECK(!readonly_handle.is_valid()); return zx::vmo(handle.TakeHandle()); #elif defined(OS_MACOSX) && !defined(OS_IOS) DCHECK(!readonly_handle.is_valid()); return handle.TakeMachPort(); #elif defined(OS_ANDROID) DCHECK(!readonly_handle.is_valid()); return handle.TakeFD(); #else return base::subtle::ScopedFDPair(handle.TakeFD(), readonly_handle.TakeFD()); #endif } } // namespace core } // namespace mojo