mach_client_utilities.h [plain text]
#ifndef MACH_CLIENT_UTILITIES_H
#define MACH_CLIENT_UTILITIES_H
#include <mach/mach.h>
#include <mach/message.h>
#include <mach/boolean.h>
#include <servers/bootstrap.h>
#include <sys/param.h>
#include <Kerberos/LoginSessions.h>
#define kMachIPCMaxMsgSize 2048 + MAX_TRAILER_SIZE
#define kMachIPCTimeout 200
#if __cplusplus
extern "C" {
#endif
kern_return_t
mach_client_lookup_server (const char *inServiceNamePrefix,
mach_port_t *outServicePort);
kern_return_t
mach_client_lookup_and_launch_server (const char *inServiceNamePrefix,
const char *inBundleIdentifier,
const char *inPath,
const char *inServerBundleName,
mach_port_t *outServicePort);
boolean_t
mach_client_allow_server (security_token_t inToken);
#if __cplusplus
}
#endif
#if __cplusplus
class MachServerPort {
public:
MachServerPort (const char *inServiceNamePrefix,
const char *inBundleIdentifier,
const char *inPath,
const char *inServerBundleName) : mPort (MACH_PORT_NULL)
{
kern_return_t err;
err = mach_client_lookup_and_launch_server (inServiceNamePrefix,
inBundleIdentifier,
inPath,
inServerBundleName,
&mPort);
if (err != BOOTSTRAP_SUCCESS) {
if (mPort != MACH_PORT_NULL) {
mach_port_deallocate (mach_task_self(), mPort);
}
mPort = MACH_PORT_NULL;
}
}
MachServerPort (const char *inServiceNamePrefix) : mPort (MACH_PORT_NULL)
{
kern_return_t err;
err = mach_client_lookup_server (inServiceNamePrefix, &mPort);
if (err != BOOTSTRAP_SUCCESS) {
if (mPort != MACH_PORT_NULL) {
mach_port_deallocate (mach_task_self(), mPort);
}
mPort = MACH_PORT_NULL;
}
}
~MachServerPort ()
{
if (mPort != MACH_PORT_NULL)
mach_port_deallocate (mach_task_self(), mPort);
}
mach_port_t Get () const
{
return mPort;
}
private:
mach_port_t mPort;
};
#endif
#endif