SecTranslocateInterface.cpp [plain text]
#include <exception>
#include <dispatch/dispatch.h>
#include <security_utilities/unix++.h>
#include <security_utilities/logging.h>
#include "SecTranslocateInterface.hpp"
#include "SecTranslocateServer.hpp"
#include "SecTranslocateClient.hpp"
namespace Security {
namespace SecTranslocate {
using namespace std;
Translocator* getTranslocator(bool isServer)
{
static dispatch_once_t initialized;
static Translocator* me = NULL;
static dispatch_queue_t q;
__block exception_ptr exception(0);
if(isServer && me)
{
Syslog::critical("SecTranslocate: getTranslocator, asked for server but previously intialized as client");
UnixError::throwMe(EINVAL);
}
dispatch_once(&initialized, ^{
try
{
q = dispatch_queue_create(isServer?"com.apple.security.translocate":"com.apple.security.translocate-client", DISPATCH_QUEUE_SERIAL);
if(q == NULL)
{
Syslog::critical("SecTranslocate: getTranslocator, failed to create queue");
UnixError::throwMe(ENOMEM);
}
if(isServer)
{
me = new TranslocatorServer(q);
}
else
{
me = new TranslocatorClient(q);
}
}
catch (...)
{
Syslog::critical("SecTranslocate: error while creating Translocator");
exception = current_exception();
}
});
if (me == NULL)
{
if (exception)
{
rethrow_exception(exception); }
else
{
Syslog::critical("SecTranslocate: Translocator initialization failed");
UnixError::throwMe(EINVAL);
}
}
return me;
}
} }