blob: 6ee119bd5e58cbdec71132420b830b0d43c1342a [file] [log] [blame]
// Copyright 2014 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.
#ifndef SANDBOX_MAC_MESSAGE_SERVER_H_
#define SANDBOX_MAC_MESSAGE_SERVER_H_
#include <mach/mach.h>
#include <unistd.h>
#include "sandbox/mac/xpc.h"
namespace sandbox {
// A message received by a MessageServer. Each concrete implementation of
// that interface will handle the fields of this union appropriately.
// Consumers should treat this as an opaque handle.
union IPCMessage {
mach_msg_header_t* mach;
xpc_object_t xpc;
};
// A delegate interface for MessageServer that handles processing of
// incoming intercepted IPC messages.
class MessageDemuxer {
public:
// Handle a |request| message. The message is owned by the server. Use the
// server's methods to create and send a reply message.
virtual void DemuxMessage(IPCMessage request) = 0;
protected:
virtual ~MessageDemuxer() {}
};
// An interaface for an IPC server that implements Mach messaging semantics.
// The concrete implementation may be powered by raw Mach messages, XPC, or
// some other technology. This interface is the abstraction on top of those
// that enables message interception.
class MessageServer {
public:
virtual ~MessageServer() {}
// Initializes the class and starts running the message server. If this
// returns false, no other methods may be called on this class.
virtual bool Initialize() = 0;
// Blocks the calling thread while the server shuts down. This prevents
// the server from receiving new messages. After this method is called,
// no other methods may be called on this class.
virtual void Shutdown() = 0;
// Given a received request message, returns the PID of the sending process.
virtual pid_t GetMessageSenderPID(IPCMessage request) = 0;
// Creates a reply message from a request message. The result is owned by
// the server.
virtual IPCMessage CreateReply(IPCMessage request) = 0;
// Sends a reply message. Returns true if the message was sent successfully.
virtual bool SendReply(IPCMessage reply) = 0;
// Forwards the original |request| to the |destination| for handling.
virtual void ForwardMessage(IPCMessage request, mach_port_t destination) = 0;
// Replies to the received |request| message by creating a reply and setting
// the specified |error_code| in a field that is interpreted by the
// underlying IPC system.
virtual void RejectMessage(IPCMessage request, int error_code) = 0;
// Returns the Mach port on which the MessageServer is listening.
virtual mach_port_t GetServerPort() const = 0;
};
} // namespace sandbox
#endif // SANDBOX_MAC_MESSAGE_SERVER_H_