]> git.saurik.com Git - apple/mdnsresponder.git/blob - mDNSMacOSX/mdns_objects/mdns_xpc.c
mDNSResponder-1310.40.42.tar.gz
[apple/mdnsresponder.git] / mDNSMacOSX / mdns_objects / mdns_xpc.c
1
2 /*
3 * Copyright (c) 2020 Apple Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 #include "mdns_xpc.h"
19
20 #include <CoreFoundation/CFXPCBridge.h>
21 #include <CoreUtils/CoreUtils.h>
22
23 //======================================================================================================================
24 // MARK: - Public Functions
25
26 xpc_object_t
27 mdns_xpc_create_dictionary_from_plist_data(const uint8_t * const bytes, const size_t length, OSStatus * const out_error)
28 {
29 xpc_object_t dictionary = NULL;
30 CFPropertyListRef plist = NULL;
31 OSStatus err;
32 CFDataRef data = CFDataCreate(NULL, bytes, (CFIndex)length);
33 require_action_quiet(data, exit, err = kNoMemoryErr);
34
35 plist = CFPropertyListCreateWithData(NULL, data, kCFPropertyListImmutable, NULL, NULL);
36 ForgetCF(&data);
37 require_action_quiet(plist, exit, err = kFormatErr);
38 require_action_quiet(CFGetTypeID(plist) == CFDictionaryGetTypeID(), exit, err = kTypeErr);
39
40 dictionary = _CFXPCCreateXPCObjectFromCFObject(plist);
41 require_action_quiet(dictionary, exit, err = kUnknownErr);
42
43 err = kNoErr;
44
45 exit:
46 if (out_error) {
47 *out_error = err;
48 }
49 ForgetCF(&plist);
50 return dictionary;
51 }