2 * Copyright (c) 2019 Apple Inc. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "dnssd_xpc.h"
20 //======================================================================================================================
21 #pragma mark - XPC Dictionary Helper Declarations
25 _dnssd_xpc_dictionary_get_int32(xpc_object_t dict
, const char *key
, bool *out_valid
);
28 _dnssd_xpc_dictionary_get_int64(xpc_object_t dict
, const char *key
, bool *out_valid
);
31 _dnssd_xpc_dictionary_get_int64_limited(xpc_object_t dict
, const char *key
, int64_t min
, int64_t max
, bool *out_valid
);
34 _dnssd_xpc_dictionary_get_uint16(xpc_object_t dict
, const char *key
, bool *out_valid
);
37 _dnssd_xpc_dictionary_get_uint32(xpc_object_t dict
, const char *key
, bool *out_valid
);
40 _dnssd_xpc_dictionary_get_uint64(xpc_object_t dict
, const char *key
, bool *out_valid
);
43 _dnssd_xpc_dictionary_get_uint64_limited(xpc_object_t dict
, const char *key
, uint64_t min
, uint64_t max
,
47 _dnssd_xpc_dictionary_get_value(xpc_object_t dict
, const char *key
, xpc_type_t type
);
50 //======================================================================================================================
51 #pragma mark - Top-Level Message Dictionaries
54 #define DNSSD_XPC_MESSAGE_KEY_COMMAND "command"
55 #define DNSSD_XPC_MESSAGE_KEY_ERROR "error"
56 #define DNSSD_XPC_MESSAGE_KEY_ID "id"
57 #define DNSSD_XPC_MESSAGE_KEY_PARAMS "params"
58 #define DNSSD_XPC_MESSAGE_KEY_RESULTS "results"
60 //======================================================================================================================
63 dnssd_xpc_message_get_command(xpc_object_t msg
)
65 return xpc_dictionary_get_string(msg
, DNSSD_XPC_MESSAGE_KEY_COMMAND
);
68 //======================================================================================================================
71 dnssd_xpc_message_set_command(xpc_object_t msg
, const char *command
)
73 xpc_dictionary_set_string(msg
, DNSSD_XPC_MESSAGE_KEY_COMMAND
, command
);
76 //======================================================================================================================
79 dnssd_xpc_message_get_error(xpc_object_t msg
, bool *out_valid
)
81 return _dnssd_xpc_dictionary_get_int32(msg
, DNSSD_XPC_MESSAGE_KEY_ERROR
, out_valid
);
84 //======================================================================================================================
87 dnssd_xpc_message_set_error(xpc_object_t msg
, DNSServiceErrorType error
)
89 xpc_dictionary_set_int64(msg
, DNSSD_XPC_MESSAGE_KEY_ERROR
, error
);
92 //======================================================================================================================
95 dnssd_xpc_message_get_id(xpc_object_t msg
, bool *out_valid
)
97 return _dnssd_xpc_dictionary_get_uint64(msg
, DNSSD_XPC_MESSAGE_KEY_ID
, out_valid
);
100 //======================================================================================================================
103 dnssd_xpc_message_set_id(xpc_object_t msg
, uint64_t ident
)
105 xpc_dictionary_set_uint64(msg
, DNSSD_XPC_MESSAGE_KEY_ID
, ident
);
108 //======================================================================================================================
111 dnssd_xpc_message_get_parameters(xpc_object_t msg
)
113 return xpc_dictionary_get_dictionary(msg
, DNSSD_XPC_MESSAGE_KEY_PARAMS
);
116 //======================================================================================================================
119 dnssd_xpc_message_set_parameters(xpc_object_t msg
, xpc_object_t params
)
121 xpc_dictionary_set_value(msg
, DNSSD_XPC_MESSAGE_KEY_PARAMS
, params
);
124 //======================================================================================================================
127 dnssd_xpc_message_get_results(xpc_object_t msg
)
129 return xpc_dictionary_get_array(msg
, DNSSD_XPC_MESSAGE_KEY_RESULTS
);
132 //======================================================================================================================
135 dnssd_xpc_message_set_results(xpc_object_t msg
, xpc_object_t results
)
137 xpc_dictionary_set_value(msg
, DNSSD_XPC_MESSAGE_KEY_RESULTS
, results
);
141 //======================================================================================================================
142 #pragma mark - Parameter Dictionaries
145 #define DNSSD_XPC_PARAMETERS_KEY_DELEGATE_ID "delegate_id"
146 #define DNSSD_XPC_PARAMETERS_KEY_FLAGS "flags"
147 #define DNSSD_XPC_PARAMETERS_KEY_HOSTNAME "hostname"
148 #define DNSSD_XPC_PARAMETERS_KEY_INTERFACE_INDEX "interface_index"
149 #define DNSSD_XPC_PARAMETERS_KEY_NEED_AUTH_TAGS "need_auth_tags"
150 #define DNSSD_XPC_PARAMETERS_KEY_PROTOCOLS "protocols"
152 //======================================================================================================================
155 dnssd_xpc_parameters_get_delegate_pid(xpc_object_t params
, bool *out_valid
)
157 return (pid_t
)_dnssd_xpc_dictionary_get_int64(params
, DNSSD_XPC_PARAMETERS_KEY_DELEGATE_ID
, out_valid
);
160 //======================================================================================================================
163 dnssd_xpc_parameters_set_delegate_pid(xpc_object_t params
, pid_t pid
)
165 xpc_dictionary_set_int64(params
, DNSSD_XPC_PARAMETERS_KEY_DELEGATE_ID
, pid
);
168 //======================================================================================================================
171 dnssd_xpc_parameters_get_delegate_uuid(xpc_object_t params
)
173 return xpc_dictionary_get_uuid(params
, DNSSD_XPC_PARAMETERS_KEY_DELEGATE_ID
);
176 //======================================================================================================================
179 dnssd_xpc_parameters_set_delegate_uuid(xpc_object_t params
, uuid_t uuid
)
181 xpc_dictionary_set_uuid(params
, DNSSD_XPC_PARAMETERS_KEY_DELEGATE_ID
, uuid
);
184 //======================================================================================================================
187 dnssd_xpc_parameters_get_flags(xpc_object_t params
, bool *out_valid
)
189 return _dnssd_xpc_dictionary_get_uint32(params
, DNSSD_XPC_PARAMETERS_KEY_FLAGS
, out_valid
);
192 //======================================================================================================================
195 dnssd_xpc_parameters_set_flags(xpc_object_t params
, DNSServiceFlags flags
)
197 xpc_dictionary_set_uint64(params
, DNSSD_XPC_PARAMETERS_KEY_FLAGS
, flags
);
200 //======================================================================================================================
203 dnssd_xpc_parameters_get_hostname_object(xpc_object_t params
)
205 return _dnssd_xpc_dictionary_get_value(params
, DNSSD_XPC_PARAMETERS_KEY_HOSTNAME
, XPC_TYPE_STRING
);
208 //======================================================================================================================
211 dnssd_xpc_parameters_set_hostname(xpc_object_t params
, const char *hostname
)
213 xpc_dictionary_set_string(params
, DNSSD_XPC_PARAMETERS_KEY_HOSTNAME
, hostname
);
216 //======================================================================================================================
219 dnssd_xpc_parameters_get_interface_index(xpc_object_t params
, bool *out_valid
)
221 return _dnssd_xpc_dictionary_get_uint32(params
, DNSSD_XPC_PARAMETERS_KEY_INTERFACE_INDEX
, out_valid
);
224 //======================================================================================================================
227 dnssd_xpc_parameters_set_interface_index(xpc_object_t params
, uint32_t interface_index
)
229 xpc_dictionary_set_uint64(params
, DNSSD_XPC_PARAMETERS_KEY_INTERFACE_INDEX
, interface_index
);
232 //======================================================================================================================
235 dnssd_xpc_parameters_get_need_authentication_tags(xpc_object_t params
)
237 return xpc_dictionary_get_bool(params
, DNSSD_XPC_PARAMETERS_KEY_NEED_AUTH_TAGS
);
240 //======================================================================================================================
243 dnssd_xpc_parameters_set_need_authentication_tags(xpc_object_t params
, bool need_auth_tags
)
245 xpc_dictionary_set_bool(params
, DNSSD_XPC_PARAMETERS_KEY_NEED_AUTH_TAGS
, need_auth_tags
);
248 //======================================================================================================================
251 dnssd_xpc_parameters_get_protocols(xpc_object_t params
, bool *out_valid
)
253 return _dnssd_xpc_dictionary_get_uint32(params
, DNSSD_XPC_PARAMETERS_KEY_PROTOCOLS
, out_valid
);
256 //======================================================================================================================
259 dnssd_xpc_parameters_set_protocols(xpc_object_t params
, DNSServiceProtocol protocols
)
261 xpc_dictionary_set_uint64(params
, DNSSD_XPC_PARAMETERS_KEY_PROTOCOLS
, protocols
);
265 //======================================================================================================================
266 #pragma mark - Result Dictionaries
269 #define DNSSD_XPC_RESULT_KEY_AUTH_TAG "auth_tag"
270 #define DNSSD_XPC_RESULT_KEY_ERROR "error"
271 #define DNSSD_XPC_RESULT_KEY_FLAGS "flags"
272 #define DNSSD_XPC_RESULT_KEY_INTERFACE_INDEX "interface_index"
273 #define DNSSD_XPC_RESULT_KEY_RECORD_CLASS "rclass"
274 #define DNSSD_XPC_RESULT_KEY_RECORD_DATA "rdata"
275 #define DNSSD_XPC_RESULT_KEY_RECORD_NAME "rname"
276 #define DNSSD_XPC_RESULT_KEY_RECORD_TYPE "rtype"
278 //======================================================================================================================
281 dnssd_xpc_result_get_authentication_tag_object(xpc_object_t result
)
283 return _dnssd_xpc_dictionary_get_value(result
, DNSSD_XPC_RESULT_KEY_AUTH_TAG
, XPC_TYPE_DATA
);
286 //======================================================================================================================
289 dnssd_xpc_result_set_authentication_tag(xpc_object_t result
, const void *auth_tag_ptr
, size_t auth_tag_len
)
291 xpc_dictionary_set_data(result
, DNSSD_XPC_RESULT_KEY_AUTH_TAG
, auth_tag_ptr
, auth_tag_len
);
294 //======================================================================================================================
297 dnssd_xpc_result_get_error(xpc_object_t result
, bool *out_valid
)
299 return _dnssd_xpc_dictionary_get_int32(result
, DNSSD_XPC_RESULT_KEY_ERROR
, out_valid
);
302 //======================================================================================================================
305 dnssd_xpc_result_set_error(xpc_object_t result
, DNSServiceErrorType error
)
307 xpc_dictionary_set_int64(result
, DNSSD_XPC_RESULT_KEY_ERROR
, error
);
310 //======================================================================================================================
313 dnssd_xpc_result_get_flags(xpc_object_t result
, bool *out_valid
)
315 return _dnssd_xpc_dictionary_get_uint32(result
, DNSSD_XPC_RESULT_KEY_FLAGS
, out_valid
);
318 //======================================================================================================================
321 dnssd_xpc_result_set_flags(xpc_object_t result
, DNSServiceFlags flags
)
323 xpc_dictionary_set_uint64(result
, DNSSD_XPC_RESULT_KEY_FLAGS
, flags
);
326 //======================================================================================================================
329 dnssd_xpc_result_get_interface_index(xpc_object_t result
, bool *out_valid
)
331 return _dnssd_xpc_dictionary_get_uint32(result
, DNSSD_XPC_RESULT_KEY_INTERFACE_INDEX
, out_valid
);
334 //======================================================================================================================
337 dnssd_xpc_result_set_interface_index(xpc_object_t result
, uint32_t interface_index
)
339 xpc_dictionary_set_uint64(result
, DNSSD_XPC_RESULT_KEY_INTERFACE_INDEX
, interface_index
);
342 //======================================================================================================================
345 dnssd_xpc_result_get_record_class(xpc_object_t result
, bool *out_valid
)
347 return _dnssd_xpc_dictionary_get_uint16(result
, DNSSD_XPC_RESULT_KEY_RECORD_CLASS
, out_valid
);
350 //======================================================================================================================
353 dnssd_xpc_result_set_record_class(xpc_object_t result
, uint16_t class)
355 xpc_dictionary_set_uint64(result
, DNSSD_XPC_RESULT_KEY_RECORD_CLASS
, class);
358 //======================================================================================================================
361 dnssd_xpc_result_get_record_data_object(xpc_object_t result
)
363 return _dnssd_xpc_dictionary_get_value(result
, DNSSD_XPC_RESULT_KEY_RECORD_DATA
, XPC_TYPE_DATA
);
366 //======================================================================================================================
369 dnssd_xpc_result_set_record_data(xpc_object_t result
, const void *data_ptr
, size_t data_len
)
371 xpc_dictionary_set_data(result
, DNSSD_XPC_RESULT_KEY_RECORD_DATA
, data_ptr
, data_len
);
374 //======================================================================================================================
377 dnssd_xpc_result_get_record_name_object(xpc_object_t result
)
379 return _dnssd_xpc_dictionary_get_value(result
, DNSSD_XPC_RESULT_KEY_RECORD_NAME
, XPC_TYPE_STRING
);
382 //======================================================================================================================
385 dnssd_xpc_result_set_record_name(xpc_object_t result
, const char *name
)
387 xpc_dictionary_set_string(result
, DNSSD_XPC_RESULT_KEY_RECORD_NAME
, name
);
390 //======================================================================================================================
393 dnssd_xpc_result_get_record_type(xpc_object_t result
, bool *out_valid
)
395 return _dnssd_xpc_dictionary_get_uint16(result
, DNSSD_XPC_RESULT_KEY_RECORD_TYPE
, out_valid
);
398 //======================================================================================================================
401 dnssd_xpc_result_set_record_type(xpc_object_t result
, uint16_t type
)
403 xpc_dictionary_set_uint64(result
, DNSSD_XPC_RESULT_KEY_RECORD_TYPE
, type
);
407 //======================================================================================================================
408 #pragma mark - XPC Dictionary Helpers
412 _dnssd_xpc_dictionary_get_int32(xpc_object_t dict
, const char *key
, bool *out_valid
)
414 return (int32_t)_dnssd_xpc_dictionary_get_int64_limited(dict
, key
, INT32_MIN
, INT32_MAX
, out_valid
);
417 //======================================================================================================================
420 _dnssd_xpc_dictionary_get_int64(xpc_object_t dict
, const char *key
, bool *out_valid
)
422 return _dnssd_xpc_dictionary_get_int64_limited(dict
, key
, INT64_MIN
, INT64_MAX
, out_valid
);
425 //======================================================================================================================
428 _dnssd_xpc_dictionary_get_int64_limited(xpc_object_t dict
, const char *key
, int64_t min
, int64_t max
, bool *out_valid
)
433 xpc_object_t
const value
= _dnssd_xpc_dictionary_get_value(dict
, key
, XPC_TYPE_INT64
);
435 i64
= xpc_int64_get_value(value
);
436 if ((i64
>= min
) && (i64
<= max
)) {
452 //======================================================================================================================
455 _dnssd_xpc_dictionary_get_uint16(xpc_object_t dict
, const char *key
, bool *out_valid
)
457 return (uint16_t)_dnssd_xpc_dictionary_get_uint64_limited(dict
, key
, 0, UINT16_MAX
, out_valid
);
460 //======================================================================================================================
463 _dnssd_xpc_dictionary_get_uint32(xpc_object_t dict
, const char *key
, bool *out_valid
)
465 return (uint32_t)_dnssd_xpc_dictionary_get_uint64_limited(dict
, key
, 0, UINT32_MAX
, out_valid
);
468 //======================================================================================================================
471 _dnssd_xpc_dictionary_get_uint64(xpc_object_t dict
, const char *key
, bool *out_valid
)
473 return _dnssd_xpc_dictionary_get_uint64_limited(dict
, key
, 0, UINT64_MAX
, out_valid
);
476 //======================================================================================================================
479 _dnssd_xpc_dictionary_get_uint64_limited(xpc_object_t dict
, const char *key
, uint64_t min
, uint64_t max
,
485 xpc_object_t
const value
= _dnssd_xpc_dictionary_get_value(dict
, key
, XPC_TYPE_UINT64
);
487 u64
= xpc_uint64_get_value(value
);
488 if ((u64
>= min
) && (u64
<= max
)) {
504 //======================================================================================================================
507 _dnssd_xpc_dictionary_get_value(xpc_object_t dict
, const char *key
, xpc_type_t type
)
509 xpc_object_t value
= xpc_dictionary_get_value(dict
, key
);
510 return (value
&& (xpc_get_type(value
) == type
)) ? value
: NULL
;