jcivelli@chromium.org | 3bab103 | 2011-06-15 04:35:10 +0900 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 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 | |
rvargas@chromium.org | 9e469f6 | 2014-01-28 06:36:00 +0900 | [diff] [blame] | 8 | #include "base/files/file.h" |
rsesek@chromium.org | 1931971 | 2013-07-24 14:15:24 +0900 | [diff] [blame] | 9 | #include "base/process/process.h" |
avi | 42ebda4 | 2015-12-22 11:39:04 +0900 | [diff] [blame] | 10 | #include "build/build_config.h" |
Ken Rockot | b3a77c9 | 2017-09-14 13:23:41 +0900 | [diff] [blame] | 11 | #include "ipc/ipc_message_support_export.h" |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 12 | |
Fabrice de Gans-Riberi | b1ad1ab | 2018-05-08 05:02:09 +0900 | [diff] [blame] | 13 | #if defined(OS_POSIX) || defined(OS_FUCHSIA) |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 14 | #include "base/file_descriptor_posix.h" |
| 15 | #endif |
| 16 | |
| 17 | namespace IPC { |
| 18 | |
| 19 | #if defined(OS_WIN) |
Ken Rockot | b3a77c9 | 2017-09-14 13:23:41 +0900 | [diff] [blame] | 20 | class IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit { |
erikchen | 9a454c1 | 2017-04-29 11:24:36 +0900 | [diff] [blame] | 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 | }; |
Fabrice de Gans-Riberi | b1ad1ab | 2018-05-08 05:02:09 +0900 | [diff] [blame] | 43 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 44 | typedef base::FileDescriptor PlatformFileForTransit; |
| 45 | #endif |
| 46 | |
estade@chromium.org | d996345 | 2009-12-18 09:23:05 +0900 | [diff] [blame] | 47 | inline PlatformFileForTransit InvalidPlatformFileForTransit() { |
| 48 | #if defined(OS_WIN) |
erikchen | b23e3a4 | 2016-03-30 07:26:42 +0900 | [diff] [blame] | 49 | return PlatformFileForTransit(); |
Fabrice de Gans-Riberi | b1ad1ab | 2018-05-08 05:02:09 +0900 | [diff] [blame] | 50 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) |
estade@chromium.org | d996345 | 2009-12-18 09:23:05 +0900 | [diff] [blame] | 51 | return base::FileDescriptor(); |
| 52 | #endif |
| 53 | } |
| 54 | |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 55 | inline base::PlatformFile PlatformFileForTransitToPlatformFile( |
| 56 | const PlatformFileForTransit& transit) { |
| 57 | #if defined(OS_WIN) |
erikchen | b23e3a4 | 2016-03-30 07:26:42 +0900 | [diff] [blame] | 58 | return transit.GetHandle(); |
Fabrice de Gans-Riberi | b1ad1ab | 2018-05-08 05:02:09 +0900 | [diff] [blame] | 59 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 60 | return transit.fd; |
| 61 | #endif |
| 62 | } |
| 63 | |
rvargas@chromium.org | 5e1b33d | 2014-03-25 15:01:48 +0900 | [diff] [blame] | 64 | inline base::File PlatformFileForTransitToFile( |
| 65 | const PlatformFileForTransit& transit) { |
| 66 | #if defined(OS_WIN) |
erikchen | b23e3a4 | 2016-03-30 07:26:42 +0900 | [diff] [blame] | 67 | return base::File(transit.GetHandle()); |
Fabrice de Gans-Riberi | b1ad1ab | 2018-05-08 05:02:09 +0900 | [diff] [blame] | 68 | #elif defined(OS_POSIX) || defined(OS_FUCHSIA) |
rvargas@chromium.org | 5e1b33d | 2014-03-25 15:01:48 +0900 | [diff] [blame] | 69 | return base::File(transit.fd); |
| 70 | #endif |
| 71 | } |
| 72 | |
erikchen | 556548b | 2016-04-07 03:51:55 +0900 | [diff] [blame] | 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. |
Ken Rockot | b3a77c9 | 2017-09-14 13:23:41 +0900 | [diff] [blame] | 75 | IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit |
| 76 | GetPlatformFileForTransit(base::PlatformFile file, bool close_source_handle); |
jcivelli@chromium.org | 3bab103 | 2011-06-15 04:35:10 +0900 | [diff] [blame] | 77 | |
erikchen | 33f45fa | 2016-04-08 01:35:11 +0900 | [diff] [blame] | 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. |
rvargas@chromium.org | f40fe38 | 2014-03-06 05:13:49 +0900 | [diff] [blame] | 80 | // Note that this function takes ownership of |file|. |
Ken Rockot | b3a77c9 | 2017-09-14 13:23:41 +0900 | [diff] [blame] | 81 | IPC_MESSAGE_SUPPORT_EXPORT PlatformFileForTransit |
| 82 | TakePlatformFileForTransit(base::File file); |
rvargas@chromium.org | f40fe38 | 2014-03-06 05:13:49 +0900 | [diff] [blame] | 83 | |
estade@chromium.org | 3ac3206 | 2009-11-17 07:55:17 +0900 | [diff] [blame] | 84 | } // namespace IPC |
| 85 | |
| 86 | #endif // IPC_IPC_PLATFORM_FILE_H_ |