1 // Copyright 2014 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 SANDBOX_MAC_MESSAGE_SERVER_H_ 6 #define SANDBOX_MAC_MESSAGE_SERVER_H_ 7 8 #include <mach/mach.h> 9 #include <unistd.h> 10 11 #include "sandbox/mac/xpc.h" 12 13 namespace sandbox { 14 15 // A message received by a MessageServer. Each concrete implementation of 16 // that interface will handle the fields of this union appropriately. 17 // Consumers should treat this as an opaque handle. 18 union IPCMessage { 19 mach_msg_header_t* mach; 20 xpc_object_t xpc; 21 }; 22 23 // A delegate interface for MessageServer that handles processing of 24 // incoming intercepted IPC messages. 25 class MessageDemuxer { 26 public: 27 // Handle a |request| message. The message is owned by the server. Use the 28 // server's methods to create and send a reply message. 29 virtual void DemuxMessage(IPCMessage request) = 0; 30 31 protected: ~MessageDemuxer()32 virtual ~MessageDemuxer() {} 33 }; 34 35 // An interaface for an IPC server that implements Mach messaging semantics. 36 // The concrete implementation may be powered by raw Mach messages, XPC, or 37 // some other technology. This interface is the abstraction on top of those 38 // that enables message interception. 39 class MessageServer { 40 public: ~MessageServer()41 virtual ~MessageServer() {} 42 43 // Initializes the class and starts running the message server. If this 44 // returns false, no other methods may be called on this class. 45 virtual bool Initialize() = 0; 46 47 // Given a received request message, returns the PID of the sending process. 48 virtual pid_t GetMessageSenderPID(IPCMessage request) = 0; 49 50 // Creates a reply message from a request message. The result is owned by 51 // the server. 52 virtual IPCMessage CreateReply(IPCMessage request) = 0; 53 54 // Sends a reply message. Returns true if the message was sent successfully. 55 virtual bool SendReply(IPCMessage reply) = 0; 56 57 // Forwards the original |request| to the |destination| for handling. 58 virtual void ForwardMessage(IPCMessage request, mach_port_t destination) = 0; 59 60 // Replies to the received |request| message by creating a reply and setting 61 // the specified |error_code| in a field that is interpreted by the 62 // underlying IPC system. 63 virtual void RejectMessage(IPCMessage request, int error_code) = 0; 64 65 // Returns the Mach port on which the MessageServer is listening. 66 virtual mach_port_t GetServerPort() const = 0; 67 }; 68 69 } // namespace sandbox 70 71 #endif // SANDBOX_MAC_MESSAGE_SERVER_H_ 72