1/* 2 * Copyright (c) 2004-2006, 2008, 2009, 2011-2013 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 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 11 * file. 12 * 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. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24#ifndef __DNSINFO_H__ 25#define __DNSINFO_H__ 26 27/* 28 * These routines provide access to the systems DNS configuration 29 */ 30 31#include <Availability.h> 32#include <sys/cdefs.h> 33#include <stdint.h> 34#include <sys/types.h> 35#include <sys/socket.h> 36#include <netinet/in.h> 37 38#define DNSINFO_VERSION 20130402 39 40#define DEFAULT_SEARCH_ORDER 200000 /* search order for the "default" resolver domain name */ 41 42#define DNS_PTR(type, name) \ 43 union { \ 44 type name; \ 45 uint64_t _ ## name ## _p; \ 46 } 47 48#define DNS_VAR(type, name) \ 49 type name 50 51 52#pragma pack(4) 53typedef struct { 54 struct in_addr address; 55 struct in_addr mask; 56} dns_sortaddr_t; 57#pragma pack() 58 59 60#pragma pack(4) 61typedef struct { 62 DNS_PTR(char *, domain); /* domain */ 63 DNS_VAR(int32_t, n_nameserver); /* # nameserver */ 64 DNS_PTR(struct sockaddr **, nameserver); 65 DNS_VAR(uint16_t, port); /* port (in host byte order) */ 66 DNS_VAR(int32_t, n_search); /* # search */ 67 DNS_PTR(char **, search); 68 DNS_VAR(int32_t, n_sortaddr); /* # sortaddr */ 69 DNS_PTR(dns_sortaddr_t **, sortaddr); 70 DNS_PTR(char *, options); /* options */ 71 DNS_VAR(uint32_t, timeout); /* timeout */ 72 DNS_VAR(uint32_t, search_order); /* search_order */ 73 DNS_VAR(uint32_t, if_index); 74 DNS_VAR(uint32_t, flags); 75 DNS_VAR(uint32_t, reach_flags); /* SCNetworkReachabilityFlags */ 76 DNS_VAR(uint32_t, service_identifier); 77 DNS_VAR(uint32_t, reserved[4]); 78} dns_resolver_t; 79#pragma pack() 80 81 82#define DNS_RESOLVER_FLAGS_SCOPED 1 /* configuration is for scoped questions */ 83#define DNS_RESOLVER_FLAGS_REQUEST_A_RECORDS 2 /* always requesting for A dns records in queries */ 84#define DNS_RESOLVER_FLAGS_REQUEST_AAAA_RECORDS 4 /* always requesting for AAAA dns records in queries */ 85#define DNS_RESOLVER_FLAGS_SERVICE_SPECIFIC 8 /* configuration is service-specific */ 86 87#define DNS_RESOLVER_FLAGS_REQUEST_ALL_RECORDS \ 88 (DNS_RESOLVER_FLAGS_REQUEST_A_RECORDS | DNS_RESOLVER_FLAGS_REQUEST_AAAA_RECORDS) 89 90#pragma pack(4) 91typedef struct { 92 DNS_VAR(int32_t, n_resolver); /* resolver configurations */ 93 DNS_PTR(dns_resolver_t **, resolver); 94 DNS_VAR(int32_t, n_scoped_resolver); /* "scoped" resolver configurations */ 95 DNS_PTR(dns_resolver_t **, scoped_resolver); 96 DNS_VAR(uint64_t, generation); 97 DNS_VAR(int32_t, n_service_specific_resolver); 98 DNS_PTR(dns_resolver_t **, service_specific_resolver); 99} dns_config_t; 100#pragma pack() 101 102 103__BEGIN_DECLS 104 105/* 106 * DNS configuration access APIs 107 */ 108const char * 109dns_configuration_notify_key () __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); 110 111dns_config_t * 112dns_configuration_copy () __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); 113 114void 115dns_configuration_free (dns_config_t *config) __OSX_AVAILABLE_STARTING(__MAC_10_4,__IPHONE_2_0); 116 117void 118_dns_configuration_ack (dns_config_t *config, 119 const char *bundle_id) __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0); 120 121__END_DECLS 122 123#endif /* __DNSINFO_H__ */ 124