]> git.saurik.com Git - apple/libresolv.git/blob - dns_util.h
libresolv-65.tar.gz
[apple/libresolv.git] / dns_util.h
1 /*
2 * Copyright (c) 2003-2006 Apple Computer, 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 __DNS_UTIL_H__
25 #define __DNS_UTIL_H__
26
27 #include <sys/cdefs.h>
28 #include <sys/types.h>
29 #include <sys/socket.h>
30 #include <sys/time.h>
31 #include <netinet/in.h>
32 #include <arpa/inet.h>
33 #include <dns.h>
34
35 /*
36 * Status returned in a dns_reply_t
37 */
38 #define DNS_STATUS_OK 0
39 #define DNS_STATUS_BAD_HANDLE 1
40 #define DNS_STATUS_MALFORMED_QUERY 2
41 #define DNS_STATUS_TIMEOUT 3
42 #define DNS_STATUS_SEND_FAILED 4
43 #define DNS_STATUS_RECEIVE_FAILED 5
44 #define DNS_STATUS_CONNECTION_FAILED 6
45 #define DNS_STATUS_WRONG_SERVER 7
46 #define DNS_STATUS_WRONG_XID 8
47 #define DNS_STATUS_WRONG_QUESTION 9
48
49 /*
50 * dns_print_reply mask
51 */
52 #define DNS_PRINT_XID 0x0001
53 #define DNS_PRINT_QR 0x0002
54 #define DNS_PRINT_OPCODE 0x0004
55 #define DNS_PRINT_AA 0x0008
56 #define DNS_PRINT_TC 0x0010
57 #define DNS_PRINT_RD 0x0020
58 #define DNS_PRINT_RA 0x0040
59 #define DNS_PRINT_PR 0x0080
60 #define DNS_PRINT_RCODE 0x0100
61 #define DNS_PRINT_QUESTION 0x0200
62 #define DNS_PRINT_ANSWER 0x0400
63 #define DNS_PRINT_AUTHORITY 0x0800
64 #define DNS_PRINT_ADDITIONAL 0x1000
65 #define DNS_PRINT_SERVER 0x2000
66
67 /*
68 * DNS query / reply header
69 */
70 typedef struct {
71 uint16_t xid;
72 uint16_t flags;
73 uint16_t qdcount;
74 uint16_t ancount;
75 uint16_t nscount;
76 uint16_t arcount;
77 } dns_header_t;
78
79 /*
80 * DNS query
81 */
82 typedef struct
83 {
84 char *name;
85 uint16_t dnstype;
86 uint16_t dnsclass;
87 } dns_question_t;
88
89 /*
90 * Resource Record types
91 * dns_parse_packet() creates resourse records of these types.
92 */
93 typedef struct
94 {
95 uint16_t length;
96 char *data;
97 } dns_raw_resource_record_t;
98
99 typedef struct
100 {
101 struct in_addr addr;
102 } dns_address_record_t;
103
104 typedef struct
105 {
106 struct in6_addr addr;
107 } dns_in6_address_record_t;
108
109 typedef struct
110 {
111 char *name;
112 } dns_domain_name_record_t;
113
114 typedef struct
115 {
116 char *mname;
117 char *rname;
118 uint32_t serial;
119 uint32_t refresh;
120 uint32_t retry;
121 uint32_t expire;
122 uint32_t minimum;
123 } dns_SOA_record_t;
124
125 typedef struct
126 {
127 char *cpu;
128 char *os;
129 } dns_HINFO_record_t;
130
131 typedef struct
132 {
133 char *rmailbx;
134 char *emailbx;
135 } dns_MINFO_record_t;
136
137 typedef struct
138 {
139 uint16_t preference;
140 char *name;
141 } dns_MX_record_t;
142
143 typedef struct
144 {
145 uint32_t string_count;
146 char **strings;
147 } dns_TXT_record_t;
148
149 typedef struct
150 {
151 struct in_addr addr;
152 uint8_t protocol;
153 uint32_t maplength;
154 uint8_t *map;
155 } dns_WKS_record_t;
156
157 typedef struct
158 {
159 char *mailbox;
160 char *txtdname;
161 } dns_RP_record_t;
162
163 typedef struct
164 {
165 uint32_t subtype;
166 char *hostname;
167 } dns_AFSDB_record_t;
168
169 typedef struct
170 {
171 char *psdn_address;
172 } dns_X25_record_t;
173
174 typedef struct
175 {
176 char *isdn_address;
177 char *subaddress;
178 } dns_ISDN_record_t;
179
180 typedef struct
181 {
182 uint16_t preference;
183 char * intermediate;
184 } dns_RT_record_t;
185
186 typedef struct
187 {
188 uint8_t version;
189 uint8_t size;
190 uint8_t horizontal_precision;
191 uint8_t vertical_precision;
192 uint32_t latitude;
193 uint32_t longitude;
194 uint32_t altitude;
195 } dns_LOC_record_t;
196
197 typedef struct
198 {
199 uint16_t priority;
200 uint16_t weight;
201 uint16_t port;
202 char *target;
203 } dns_SRV_record_t;
204
205 /*
206 * DNS Resource Record
207 *
208 * Data contained in unsupported or obsolete Resource Record types
209 * may be accessed via DNSNULL as a dns_raw_resource_record_t.
210 */
211 typedef struct
212 {
213 char *name;
214 uint16_t dnstype;
215 uint16_t dnsclass;
216 uint32_t ttl;
217 union
218 {
219 dns_address_record_t *A;
220 dns_domain_name_record_t *NS;
221 dns_domain_name_record_t *MD; /* Obsolete */
222 dns_domain_name_record_t *MF; /* Obsolete */
223 dns_domain_name_record_t *CNAME;
224 dns_SOA_record_t *SOA;
225 dns_domain_name_record_t *MB;
226 dns_domain_name_record_t *MG;
227 dns_domain_name_record_t *MR;
228 dns_raw_resource_record_t *DNSNULL;
229 dns_WKS_record_t *WKS;
230 dns_domain_name_record_t *PTR;
231 dns_HINFO_record_t *HINFO;
232 dns_MINFO_record_t *MINFO;
233 dns_MX_record_t *MX;
234 dns_TXT_record_t *TXT;
235 dns_RP_record_t *RP;
236 dns_AFSDB_record_t *AFSDB;
237 dns_X25_record_t *X25;
238 dns_ISDN_record_t *ISDN;
239 dns_RT_record_t *RT;
240 dns_in6_address_record_t *AAAA;
241 dns_LOC_record_t *LOC;
242 dns_SRV_record_t *SRV;
243 } data;
244 } dns_resource_record_t;
245
246 /*
247 * A parsed DNS record. Returned by dns_parse_packet() and dns_lookup().
248 * The contents may be printed using dns_print_reply().
249 */
250 typedef struct
251 {
252 uint32_t status;
253 struct sockaddr *server;
254 dns_header_t *header;
255 dns_question_t **question;
256 dns_resource_record_t **answer;
257 dns_resource_record_t **authority;
258 dns_resource_record_t **additional;
259 } dns_reply_t;
260
261
262 __BEGIN_DECLS
263
264 /*
265 * High-level lookup performs a search (using dns_search), parses the
266 * reply and returns a dns_reply_t structure.
267 *
268 * The DNS handle contains an internal buffer used for fetching replies.
269 * The buffer is reused for each query, and is released with the DNS client
270 * handle when dns_free() is called. The default buffer size is 1024 bytes.
271 * The size may be changed with dns_set_buffer_size.
272 *
273 * Note that in a multithreaded application, each thread using this API must
274 * open a separate handle.
275 */
276 extern dns_reply_t *dns_lookup(dns_handle_t dns, const char *name, uint32_t dnsclass, uint32_t dnstype);
277
278 /*
279 * Get / Set the size of the internal receive buffer used by dns_lookup()
280 */
281 extern uint32_t dns_get_buffer_size(dns_handle_t d);
282 extern void dns_set_buffer_size(dns_handle_t d, uint32_t len);
283
284 /*
285 * Parse a reply packet into a reply structure.
286 */
287 extern dns_reply_t *dns_parse_packet(const char *buf, uint32_t len);
288
289 /*
290 * Free a reply structure.
291 */
292 extern void dns_free_reply(dns_reply_t *r);
293
294 /*
295 * Parse a query packet into a question structure.
296 */
297 extern dns_question_t *dns_parse_question(const char *buf, uint32_t len);
298
299 /*
300 * Free a question structure.
301 */
302 extern void dns_free_question(dns_question_t *q);
303
304 /*
305 * Parse a resource record into a structure.
306 */
307 extern dns_resource_record_t *dns_parse_resource_record(const char *buf, uint32_t len);
308
309 /*
310 * Free a resource record structure.
311 */
312 extern void dns_free_resource_record(dns_resource_record_t *rr);
313
314 /*
315 * String / number representation of a DNS class
316 * dns_class_number returns 0 if the string is recognized,
317 * non-zero if the class string is unknown.
318 */
319 extern const char *dns_class_string(uint16_t dnsclass);
320 extern int32_t dns_class_number(const char *c, uint16_t *n);
321
322 /*
323 * String / number representation of a DNS type
324 * dns_type_number returns 0 if the string is recognized,
325 * non-zero if the class string is unknown.
326 */
327 extern const char *dns_type_string(uint16_t dnstype);
328 extern int32_t dns_type_number(const char *t, uint16_t *n);
329
330 /*
331 * Print a dns handle.
332 */
333 extern void dns_print_handle(dns_handle_t d, FILE *f);
334
335 /*
336 * Print the contents of a question structure.
337 */
338 extern void dns_print_question(const dns_question_t *q, FILE *f);
339
340 /*
341 * Print the contents of a resource record structure.
342 */
343 extern void dns_print_resource_record(const dns_resource_record_t *r, FILE *f);
344
345 /*
346 * Print the contents of a reply structure.
347 */
348 extern void dns_print_reply(const dns_reply_t *r, FILE *f, uint16_t mask);
349
350 __END_DECLS
351
352 #endif /* __DNS_UTIL_H__ */