1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef IPC_IPC_PLATFORM_FILE_H_ 6 #define IPC_IPC_PLATFORM_FILE_H_ 7 8 #include "base/files/file.h" 9 #include "base/process/process.h" 10 #include "build/build_config.h" 11 #include "ipc/ipc_message_support_export.h" 12 13 #if defined(OS_POSIX) || defined(OS_FUCHSIA) 14 #include "base/file_descriptor_posix.h" 15 #endif 16 17 namespace IPC { 18 19 #if defined(OS_WIN) 20 class IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit { 21 public: 22 // Creates an invalid platform file. 23 PlatformFileForTransit(); 24 25 // Creates a platform file that takes unofficial ownership of |handle|. Note 26 // that ownership is not handled by a Scoped* class due to usage patterns of 27 // this class and its POSIX counterpart [base::FileDescriptor]. When this 28 // class is used as an input to an IPC message, the IPC subsystem will close 29 // |handle|. When this class is used as the output from an IPC message, the 30 // receiver is expected to take ownership of |handle|. 31 explicit PlatformFileForTransit(HANDLE handle); 32 33 // Comparison operators. 34 bool operator==(const PlatformFileForTransit& platform_file) const; 35 bool operator!=(const PlatformFileForTransit& platform_file) const; 36 37 HANDLE GetHandle() const; 38 bool IsValid() const; 39 40 private: 41 HANDLE handle_; 42 }; 43 #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 44 typedef base::FileDescriptor PlatformFileForTransit; 45 #endif 46 InvalidPlatformFileForTransit()47inline PlatformFileForTransit InvalidPlatformFileForTransit() { 48 #if defined(OS_WIN) 49 return PlatformFileForTransit(); 50 #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 51 return base::FileDescriptor(); 52 #endif 53 } 54 PlatformFileForTransitToPlatformFile(const PlatformFileForTransit & transit)55inline base::PlatformFile PlatformFileForTransitToPlatformFile( 56 const PlatformFileForTransit& transit) { 57 #if defined(OS_WIN) 58 return transit.GetHandle(); 59 #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 60 return transit.fd; 61 #endif 62 } 63 PlatformFileForTransitToFile(const PlatformFileForTransit & transit)64inline base::File PlatformFileForTransitToFile( 65 const PlatformFileForTransit& transit) { 66 #if defined(OS_WIN) 67 return base::File(transit.GetHandle()); 68 #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 69 return base::File(transit.fd); 70 #endif 71 } 72 73 // Creates a new handle that can be passed through IPC. The result must be 74 // passed to the IPC layer as part of a message, or else it will leak. 75 IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit 76 GetPlatformFileForTransit(base::PlatformFile file, bool close_source_handle); 77 78 // Creates a new handle that can be passed through IPC. The result must be 79 // passed to the IPC layer as part of a message, or else it will leak. 80 // Note that this function takes ownership of |file|. 81 IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit 82 TakePlatformFileForTransit(base::File file); 83 84 } // namespace IPC 85 86 #endif // IPC_IPC_PLATFORM_FILE_H_ 87