2 * Copyright (c) 2016 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
25 #include <dispatch/dispatch.h>
27 #include <security_utilities/unix++.h>
28 #include <security_utilities/logging.h>
30 #include "SecTranslocateInterface.hpp"
31 #include "SecTranslocateServer.hpp"
32 #include "SecTranslocateClient.hpp"
35 namespace SecTranslocate
{
39 Translocator
* getTranslocator(bool isServer
)
41 static dispatch_once_t initialized
;
42 static Translocator
* me
= NULL
;
43 static dispatch_queue_t q
;
44 __block exception_ptr
exception(0);
48 Syslog::critical("SecTranslocate: getTranslocator, asked for server but previously intialized as client");
49 UnixError::throwMe(EINVAL
);
52 dispatch_once(&initialized
, ^{
55 q
= dispatch_queue_create(isServer
?"com.apple.security.translocate":"com.apple.security.translocate-client", DISPATCH_QUEUE_SERIAL
);
58 Syslog::critical("SecTranslocate: getTranslocator, failed to create queue");
59 UnixError::throwMe(ENOMEM
);
64 me
= new TranslocatorServer(q
);
68 me
= new TranslocatorClient(q
);
73 Syslog::critical("SecTranslocate: error while creating Translocator");
74 exception
= current_exception();
82 rethrow_exception(exception
); //we already logged in this case.
86 Syslog::critical("SecTranslocate: Translocator initialization failed");
87 UnixError::throwMe(EINVAL
);
94 } //namespace SecTranslocate
95 } //namespace Security