lib: dns: Clean up allocated structure on error exit.
[sfrench/samba-autobuild/.git] / lib / addns / dns.h
1 /*
2   Linux DNS client library implementation
3
4   Copyright (C) 2006 Krishna Ganugapati <krishnag@centeris.com>
5   Copyright (C) 2006 Gerald Carter <jerry@samba.org>
6
7      ** NOTE! The following LGPL license applies to the libaddns
8      ** library. This does NOT imply that all of Samba is released
9      ** under the LGPL
10
11   This library is free software; you can redistribute it and/or
12   modify it under the terms of the GNU Lesser General Public
13   License as published by the Free Software Foundation; either
14   version 2.1 of the License, or (at your option) any later version.
15
16   This library is distributed in the hope that it will be useful,
17   but WITHOUT ANY WARRANTY; without even the implied warranty of
18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19   Lesser General Public License for more details.
20
21   You should have received a copy of the GNU Lesser General Public
22   License along with this library; if not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #ifndef _DNS_H
26 #define _DNS_H
27
28 #include "../replace/replace.h"
29 #include "system/network.h"
30 #include "system/kerberos.h"
31 #include "system/gssapi.h"
32
33 /* make sure we have included the correct config.h */
34 #ifndef NO_CONFIG_H /* for some tests */
35 #ifndef CONFIG_H_IS_FROM_SAMBA
36 #error "make sure you have removed all config.h files from standalone builds!"
37 #error "the included config.h isn't from samba!"
38 #endif
39 #endif /* NO_CONFIG_H */
40
41 #include <fcntl.h>
42 #include <time.h>
43 #include <netdb.h>
44
45 #include <talloc.h>
46
47 #include "dnserr.h"
48
49
50 #define DNS_TCP                 1
51 #define DNS_UDP                 2
52
53 #define DNS_OPCODE_UPDATE       1
54
55 /* DNS Class Types */
56
57 #define DNS_CLASS_IN            1
58 #define DNS_CLASS_ANY           255
59 #define DNS_CLASS_NONE          254
60
61 /* DNS RR Types */
62
63 #define DNS_RR_A                1
64
65 #define DNS_TCP_PORT            53
66 #define DNS_UDP_PORT            53
67
68 #define QTYPE_A         1
69 #define QTYPE_NS        2
70 #define QTYPE_MD        3
71 #define QTYPE_CNAME     5
72 #define QTYPE_SOA       6
73 #define QTYPE_AAAA      28
74 #define QTYPE_ANY       255
75 #define QTYPE_TKEY      249
76 #define QTYPE_TSIG      250
77
78 /*
79 MF              4 a mail forwarder (Obsolete - use MX)
80 CNAME           5 the canonical name for an alias
81 SOA             6 marks the start of a zone of authority
82 MB              7 a mailbox domain name (EXPERIMENTAL)
83 MG              8 a mail group member (EXPERIMENTAL)
84 MR              9 a mail rename domain name (EXPERIMENTAL)
85 NULL            10 a null RR (EXPERIMENTAL)
86 WKS             11 a well known service description
87 PTR             12 a domain name pointer
88 HINFO           13 host information
89 MINFO           14 mailbox or mail list information
90 MX              15 mail exchange
91 TXT             16 text strings
92 */
93
94 #define QR_QUERY         0x0000
95 #define QR_RESPONSE      0x0001
96
97 #define OPCODE_QUERY 0x00
98 #define OPCODE_IQUERY   0x01
99 #define OPCODE_STATUS   0x02
100
101 #define AA                      1
102
103 #define RECURSION_DESIRED       0x01
104
105 #define RCODE_NOERROR          0
106 #define RCODE_FORMATERROR      1
107 #define RCODE_SERVER_FAILURE   2
108 #define RCODE_NAME_ERROR       3
109 #define RCODE_NOTIMPLEMENTED   4
110 #define RCODE_REFUSED          5
111
112 #define SENDBUFFER_SIZE         65536
113 #define RECVBUFFER_SIZE         65536
114
115 /*
116  * TKEY Modes from rfc2930
117  */
118
119 #define DNS_TKEY_MODE_SERVER   1
120 #define DNS_TKEY_MODE_DH       2
121 #define DNS_TKEY_MODE_GSSAPI   3
122 #define DNS_TKEY_MODE_RESOLVER 4
123 #define DNS_TKEY_MODE_DELETE   5
124
125
126 #define DNS_ONE_DAY_IN_SECS     86400
127 #define DNS_TEN_HOURS_IN_SECS   36000
128
129 #define SOCKET_ERROR            -1
130 #define INVALID_SOCKET          -1
131
132 #define  DNS_NO_ERROR           0
133 #define  DNS_FORMAT_ERROR       1
134 #define  DNS_SERVER_FAILURE     2
135 #define  DNS_NAME_ERROR         3
136 #define  DNS_NOT_IMPLEMENTED    4
137 #define  DNS_REFUSED            5
138
139 typedef long HANDLE;
140
141 enum dns_ServerType { DNS_SRV_ANY, DNS_SRV_WIN2000, DNS_SRV_WIN2003 };
142
143 struct dns_domain_label {
144         struct dns_domain_label *next;
145         char *label;
146         size_t len;
147 };
148
149 struct dns_domain_name {
150         struct dns_domain_label *pLabelList;
151 };
152
153 struct dns_question {
154         struct dns_domain_name *name;
155         uint16_t q_type;
156         uint16_t q_class;
157 };
158
159 /*
160  * Before changing the definition of dns_zone, look
161  * dns_marshall_update_request(), we rely on this being the same as
162  * dns_question right now.
163  */
164
165 struct dns_zone {
166         struct dns_domain_name *name;
167         uint16_t z_type;
168         uint16_t z_class;
169 };
170
171 struct dns_rrec {
172         struct dns_domain_name *name;
173         uint16_t type;
174         uint16_t r_class;
175         uint32_t ttl;
176         uint16_t data_length;
177         uint8_t *data;
178 };
179
180 struct dns_tkey_record {
181         struct dns_domain_name *algorithm;
182         time_t inception;
183         time_t expiration;
184         uint16_t mode;
185         uint16_t error;
186         uint16_t key_length;
187         uint8_t *key;
188 };
189
190 struct dns_request {
191         uint16_t id;
192         uint16_t flags;
193         uint16_t num_questions;
194         uint16_t num_answers;
195         uint16_t num_auths;
196         uint16_t num_additionals;
197         struct dns_question **questions;
198         struct dns_rrec **answers;
199         struct dns_rrec **auths;
200         struct dns_rrec **additionals;
201 };
202
203 /*
204  * Before changing the definition of dns_update_request, look
205  * dns_marshall_update_request(), we rely on this being the same as
206  * dns_request right now.
207  */
208
209 struct dns_update_request {
210         uint16_t id;
211         uint16_t flags;
212         uint16_t num_zones;
213         uint16_t num_preqs;
214         uint16_t num_updates;
215         uint16_t num_additionals;
216         struct dns_zone **zones;
217         struct dns_rrec **preqs;
218         struct dns_rrec **updates;
219         struct dns_rrec **additionals;
220 };
221
222 struct dns_connection {
223         int32_t hType;
224         int s;
225         struct sockaddr_storage RecvAddr;
226 };
227
228 struct dns_buffer {
229         uint8_t *data;
230         size_t size;
231         size_t offset;
232         DNS_ERROR error;
233 };
234
235 /* from dnsutils.c */
236
237 DNS_ERROR dns_domain_name_from_string( TALLOC_CTX *mem_ctx,
238                                        const char *pszDomainName,
239                                        struct dns_domain_name **presult );
240 char *dns_generate_keyname( TALLOC_CTX *mem_ctx );
241
242 /* from dnsrecord.c */
243
244 DNS_ERROR dns_create_query( TALLOC_CTX *mem_ctx, const char *name,
245                             uint16_t q_type, uint16_t q_class,
246                             struct dns_request **preq );
247 DNS_ERROR dns_create_update( TALLOC_CTX *mem_ctx, const char *name,
248                              struct dns_update_request **preq );
249 DNS_ERROR dns_create_probe(TALLOC_CTX *mem_ctx, const char *zone,
250                            const char *host, int num_ips,
251                            const struct sockaddr_storage *sslist,
252                            struct dns_update_request **preq);
253 DNS_ERROR dns_create_rrec(TALLOC_CTX *mem_ctx, const char *name,
254                           uint16_t type, uint16_t r_class, uint32_t ttl,
255                           uint16_t data_length, uint8_t *data,
256                           struct dns_rrec **prec);
257 DNS_ERROR dns_add_rrec(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
258                        uint16_t *num_records, struct dns_rrec ***records);
259 DNS_ERROR dns_create_tkey_record(TALLOC_CTX *mem_ctx, const char *keyname,
260                                  const char *algorithm_name, time_t inception,
261                                  time_t expiration, uint16_t mode, uint16_t error,
262                                  uint16_t key_length, const uint8_t *key,
263                                  struct dns_rrec **prec);
264 DNS_ERROR dns_create_name_in_use_record(TALLOC_CTX *mem_ctx,
265                                         const char *name,
266                                         const struct sockaddr_storage *ip,
267                                         struct dns_rrec **prec);
268 DNS_ERROR dns_create_delete_record(TALLOC_CTX *mem_ctx, const char *name,
269                                    uint16_t type, uint16_t r_class,
270                                    struct dns_rrec **prec);
271 DNS_ERROR dns_create_name_not_in_use_record(TALLOC_CTX *mem_ctx,
272                                             const char *name, uint32_t type,
273                                             struct dns_rrec **prec);
274 DNS_ERROR dns_create_a_record(TALLOC_CTX *mem_ctx, const char *host,
275                               uint32_t ttl, const struct sockaddr_storage *pss,
276                               struct dns_rrec **prec);
277 DNS_ERROR dns_create_aaaa_record(TALLOC_CTX *mem_ctx, const char *host,
278                                  uint32_t ttl, const struct sockaddr_storage *pss,
279                                  struct dns_rrec **prec);
280 DNS_ERROR dns_unmarshall_tkey_record(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
281                                      struct dns_tkey_record **ptkey);
282 DNS_ERROR dns_create_tsig_record(TALLOC_CTX *mem_ctx, const char *keyname,
283                                  const char *algorithm_name,
284                                  time_t time_signed, uint16_t fudge,
285                                  uint16_t mac_length, const uint8_t *mac,
286                                  uint16_t original_id, uint16_t error,
287                                  struct dns_rrec **prec);
288 DNS_ERROR dns_add_rrec(TALLOC_CTX *mem_ctx, struct dns_rrec *rec,
289                        uint16_t *num_records, struct dns_rrec ***records);
290 DNS_ERROR dns_create_update_request(TALLOC_CTX *mem_ctx,
291                                     const char *domainname,
292                                     const char *hostname,
293                                     const struct sockaddr_storage *ip_addr,
294                                     size_t num_adds,
295                                     struct dns_update_request **preq);
296
297 /* from dnssock.c */
298
299 DNS_ERROR dns_open_connection( const char *nameserver, int32_t dwType,
300                     TALLOC_CTX *mem_ctx,
301                     struct dns_connection **conn );
302 DNS_ERROR dns_send(struct dns_connection *conn, const struct dns_buffer *buf);
303 DNS_ERROR dns_receive(TALLOC_CTX *mem_ctx, struct dns_connection *conn,
304                       struct dns_buffer **presult);
305 DNS_ERROR dns_transaction(TALLOC_CTX *mem_ctx, struct dns_connection *conn,
306                           const struct dns_request *req,
307                           struct dns_request **resp);
308 DNS_ERROR dns_update_transaction(TALLOC_CTX *mem_ctx,
309                                  struct dns_connection *conn,
310                                  struct dns_update_request *up_req,
311                                  struct dns_update_request **up_resp);
312
313 /* from dnsmarshall.c */
314
315 struct dns_buffer *dns_create_buffer(TALLOC_CTX *mem_ctx);
316 void dns_marshall_buffer(struct dns_buffer *buf, const uint8_t *data,
317                          size_t len);
318 void dns_marshall_uint16(struct dns_buffer *buf, uint16_t val);
319 void dns_marshall_uint32(struct dns_buffer *buf, uint32_t val);
320 void dns_unmarshall_buffer(struct dns_buffer *buf, uint8_t *data,
321                            size_t len);
322 void dns_unmarshall_uint16(struct dns_buffer *buf, uint16_t *val);
323 void dns_unmarshall_uint32(struct dns_buffer *buf, uint32_t *val);
324 void dns_unmarshall_domain_name(TALLOC_CTX *mem_ctx,
325                                 struct dns_buffer *buf,
326                                 struct dns_domain_name **pname);
327 void dns_marshall_domain_name(struct dns_buffer *buf,
328                               const struct dns_domain_name *name);
329 void dns_unmarshall_domain_name(TALLOC_CTX *mem_ctx,
330                                 struct dns_buffer *buf,
331                                 struct dns_domain_name **pname);
332 DNS_ERROR dns_marshall_request(TALLOC_CTX *mem_ctx,
333                                const struct dns_request *req,
334                                struct dns_buffer **pbuf);
335 DNS_ERROR dns_unmarshall_request(TALLOC_CTX *mem_ctx,
336                                  struct dns_buffer *buf,
337                                  struct dns_request **preq);
338 DNS_ERROR dns_marshall_update_request(TALLOC_CTX *mem_ctx,
339                                       struct dns_update_request *update,
340                                       struct dns_buffer **pbuf);
341 DNS_ERROR dns_unmarshall_update_request(TALLOC_CTX *mem_ctx,
342                                         struct dns_buffer *buf,
343                                         struct dns_update_request **pupreq);
344 struct dns_request *dns_update2request(struct dns_update_request *update);
345 struct dns_update_request *dns_request2update(struct dns_request *request);
346 uint16_t dns_response_code(uint16_t flags);
347 const char *dns_errstr(DNS_ERROR err);
348
349 /* from dnsgss.c */
350
351 #ifdef HAVE_GSSAPI
352
353 void display_status( const char *msg, OM_uint32 maj_stat, OM_uint32 min_stat ); 
354 DNS_ERROR dns_negotiate_sec_ctx( const char *target_realm,
355                                  const char *servername,
356                                  const char *keyname,
357                                  gss_ctx_id_t *gss_ctx,
358                                  enum dns_ServerType srv_type );
359 DNS_ERROR dns_sign_update(struct dns_update_request *req,
360                           gss_ctx_id_t gss_ctx,
361                           const char *keyname,
362                           const char *algorithmname,
363                           time_t time_signed, uint16_t fudge);
364
365 #endif  /* HAVE_GSSAPI */
366
367 #endif  /* _DNS_H */