blob: 2e9dc3e57f37f424934ac1a7f832763d1f2a80f1 [file] [log] [blame]
Luis Hector Chavez645501c2016-12-28 10:56:26 -08001// Copyright (c) 2012 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_CHANNEL_HANDLE_H_
6#define IPC_IPC_CHANNEL_HANDLE_H_
7
8#include <string>
9
10#include "build/build_config.h"
11#include "mojo/public/cpp/system/message_pipe.h"
12
Luis Hector Chavez21a249e2017-07-26 17:38:05 +000013#if defined(OS_POSIX)
Luis Hector Chavez645501c2016-12-28 10:56:26 -080014#include "base/file_descriptor_posix.h"
Luis Hector Chavez21a249e2017-07-26 17:38:05 +000015#elif defined(OS_WIN)
16#include <windows.h>
17#endif // defined (OS_WIN)
18
19// On Windows, any process can create an IPC channel and others can fetch
20// it by name. We pass around the channel names over IPC.
21// On Windows the initialization of ChannelHandle with an existing pipe
22// handle is provided for convenience.
23// NOTE: A ChannelHandle with a pipe handle Will NOT be marshalled over IPC.
24
25// On POSIX, we instead pass around handles to channel endpoints via IPC.
26// When it's time to IPC a new channel endpoint around, we send both the
27// channel name as well as a base::FileDescriptor, which is itself a special
28// type that knows how to copy a socket endpoint over IPC.
29//
30// In sum, this data structure can be used to pass channel information by name
31// in both Windows and Posix. When passing a handle to a channel over IPC,
32// use this data structure only for POSIX.
Luis Hector Chavez645501c2016-12-28 10:56:26 -080033
34namespace IPC {
35
36struct ChannelHandle {
Luis Hector Chavez21a249e2017-07-26 17:38:05 +000037 // Note that serialization for this object is defined in the ParamTraits
38 // template specialization in ipc_message_utils.h.
Luis Hector Chavez645501c2016-12-28 10:56:26 -080039 ChannelHandle() {}
Luis Hector Chavez21a249e2017-07-26 17:38:05 +000040 // The name that is passed in should be an absolute path for Posix.
41 // Otherwise there may be a problem in IPC communication between
42 // processes with different working directories.
43 ChannelHandle(const std::string& n) : name(n) {}
44 ChannelHandle(const char* n) : name(n) {}
45#if defined(OS_WIN)
46 explicit ChannelHandle(HANDLE h) : pipe(h) {}
47#elif defined(OS_POSIX)
48 ChannelHandle(const std::string& n, const base::FileDescriptor& s)
49 : name(n), socket(s) {}
50#endif // defined(OS_POSIX)
Luis Hector Chavez645501c2016-12-28 10:56:26 -080051 ChannelHandle(mojo::MessagePipeHandle h) : mojo_handle(h) {}
52
Luis Hector Chavez21a249e2017-07-26 17:38:05 +000053 std::string name;
54#if defined(OS_POSIX)
55 base::FileDescriptor socket;
56#elif defined(OS_WIN)
57 // A simple container to automatically initialize pipe handle
58 struct PipeHandle {
59 PipeHandle() : handle(NULL) {}
60 PipeHandle(HANDLE h) : handle(h) {}
61 HANDLE handle;
62 };
63 PipeHandle pipe;
64#endif // defined (OS_WIN)
Luis Hector Chavez645501c2016-12-28 10:56:26 -080065 mojo::MessagePipeHandle mojo_handle;
66};
Luis Hector Chavez645501c2016-12-28 10:56:26 -080067
68} // namespace IPC
69
70#endif // IPC_IPC_CHANNEL_HANDLE_H_