getdns_extra.h
Go to the documentation of this file.
1 
8 /*
9  * Copyright (c) 2013, NLNet Labs, Verisign, Inc.
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions are met:
14  * * Redistributions of source code must retain the above copyright
15  * notice, this list of conditions and the following disclaimer.
16  * * Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in the
18  * documentation and/or other materials provided with the distribution.
19  * * Neither the names of the copyright holders nor the
20  * names of its contributors may be used to endorse or promote products
21  * derived from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY
27  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef _GETDNS_EXTRA_H_
36 #define _GETDNS_EXTRA_H_
37 
38 #include <getdns/getdns.h>
39 #include <sys/time.h>
40 #include <stdio.h>
41 #include <time.h>
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
59 #define GETDNS_RETURN_NEED_MORE_SPACE ((getdns_return_t) 399 )
60 #define GETDNS_RETURN_NEED_MORE_SPACE_TEXT "The buffer was too small"
61 
69 #define GETDNS_CONTEXT_CODE_TLS_AUTHENTICATION 618
70 #define GETDNS_CONTEXT_CODE_TLS_AUTHENTICATION_TEXT "Change related to getdns_context_set_tls_authentication"
71 #define GETDNS_CONTEXT_CODE_EDNS_CLIENT_SUBNET_PRIVATE 619
72 #define GETDNS_CONTEXT_CODE_EDNS_CLIENT_SUBNET_PRIVATE_TEXT "Change related to getdns_context_set_edns_client_subnet_private"
73 #define GETDNS_CONTEXT_CODE_TLS_QUERY_PADDING_BLOCKSIZE 620
74 #define GETDNS_CONTEXT_CODE_TLS_QUERY_PADDING_BLOCKSIZE_TEXT "Change related to getdns_context_set_tls_query_padding_blocksize"
75 #define GETDNS_CONTEXT_CODE_PUBKEY_PINSET 621
76 #define GETDNS_CONTEXT_CODE_PUBKEY_PINSET_TEXT "Change related to getdns_context_set_pubkey_pinset"
77 
85 #define GETDNS_VERSION "1.0.0b2"
86 #define GETDNS_NUMERIC_VERSION 0x00100200
87 #define GETDNS_API_VERSION "December 2015"
88 #define GETDNS_API_NUMERIC_VERSION 0x07df0c00
89 
93 /* an alias for REQUIRED */
94 #define GETDNS_AUTHENTICATION_HOSTNAME GETDNS_AUTHENTICATION_REQUIRED
95 
100 /* Authentication options used when doing TLS */
101 typedef enum getdns_tls_authentication_t {
105 
106 #define GETDNS_AUTHENTICATION_NONE_TEXT "See getdns_context_set_tls_authentication()"
107 #define GETDNS_AUTHENTICATION_REQUIRED_TEXT "See getdns_context_set_tls_authentication()"
108 
116 #define GETDNS_APPEND_NAME_TO_SINGLE_LABEL_FIRST ((getdns_append_name_t) 554 )
117 #define GETDNS_APPEND_NAME_TO_SINGLE_LABEL_FIRST_TEXT "See getdns_context_set_append_name()"
118 
132 #define GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN 544
133 #define GETDNS_TRANSPORT_TLS_ONLY_KEEP_CONNECTIONS_OPEN_TEXT "See getdns_context_set_dns_transport()"
134 #define GETDNS_TRANSPORT_TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN 545
135 #define GETDNS_TRANSPORT_TLS_FIRST_AND_FALL_BACK_TO_TCP_KEEP_CONNECTIONS_OPEN_TEXT "See getdns_context_set_dns_transport()"
136 
153 typedef void (*getdns_eventloop_callback)(void *userarg);
154 
155 /* context extension event data */
156 typedef struct getdns_eventloop_event {
157  void *userarg;
162  /* Pointer to the underlying event
163  * that the eventloop extension will create and free.
164  */
165  void *ev;
169 typedef struct getdns_eventloop {
172 
173 /* A prototype for a method having no arguments and not return value. */
174 typedef void (*getdns_eventloop_noargs)(getdns_eventloop *loop);
175 
176 /* Call the extension to schedule an event
177  *
178  * The getdns_eventloop_event must be provided by the caller with the callbacks
179  * and userarg therein already supplied (by the caller). This function will set
180  * the ev pointer (in the getdns_eventloop_event) to refer to the underlying
181  * (extension) event.
182  */
184  int fd, uint64_t timeout, getdns_eventloop_event *ev);
185 
186 /* Call the extension to clean a scheduled event */
190 typedef void (*getdns_eventloop_run_once)(getdns_eventloop *loop,int blocking);
192  /* Virtual Method Table */
193 struct getdns_eventloop_vmt {
194  getdns_eventloop_noargs cleanup;
195  getdns_eventloop_schedule schedule;
198  getdns_eventloop_run_once run_once;
199 };
200 
201 /* set an event loop extension on the context */
204  getdns_eventloop *eventloop);
205 
206 /* get the currently active (pluggable) eventloop from the context */
209  getdns_eventloop **eventloop);
210 
211 /* detach the eventloop from the context */
214 
215 /* Run the context's event loop until nothing more to do */
216 void
226 /* process async reqs */
249  void (*value) (getdns_context *, getdns_context_code_t, void *));
250 
251 /* Enable the return_dnssec_status extension on every request.
252  value is either GETDNS_EXTENSION_TRUE or GETDNS_EXTENSION_FALSE
253  returns GETDNS_RETURN_GOOD on success or GETDNS_RETURN_INVALID_PARAMETER
254  if context or value is invalid */
256  getdns_context *context, int enabled);
257 
258 /* tells underlying unbound to use background threads or fork */
260  int use_threads);
261 
265 
268 
281  getdns_resolution_t* value);
282 
286  size_t* namespace_count, getdns_namespace_t **namespaces);
287 
290  getdns_transport_t* value);
291 
294  size_t* transport_count, getdns_transport_list_t **transports);
295 
298  uint16_t* limit);
299 
301 getdns_context_get_timeout(getdns_context *context, uint64_t* timeout);
302 
304 getdns_context_get_idle_timeout(getdns_context *context, uint64_t* timeout);
305 
308  getdns_redirects_t* value);
309 
312  getdns_list **addresses);
313 
316  getdns_append_name_t* value);
317 
320 
323  getdns_list **value);
324 
327  uint32_t* value);
328 
331  getdns_list **upstream_list);
332 
335  uint16_t* value);
336 
339  uint8_t* value);
340 
342 getdns_context_get_edns_version(getdns_context *context, uint8_t* value);
343 
345 getdns_context_get_edns_do_bit(getdns_context *context, uint8_t* value);
346 
349 
352 
356 
371 getdns_context_get_update_callback(getdns_context *context, void **userarg,
372  void (**value) (getdns_context *, getdns_context_code_t, void *));
373 
374 /* Async support */
376  struct timeval* next_timeout);
386 const char *getdns_get_version(void);
387 uint32_t getdns_get_version_number(void);
388 const char *getdns_get_api_version(void);
389 uint32_t getdns_get_api_version_number(void);
390 
398 const char *getdns_get_errorstr_by_id(uint16_t err);
399 
400 /* dict util */
401 /* set a string as bindata */
403  char *name, const char *value);
404 
405 /* get a string from a dict. the result must be freed if valid */
407  char *name, char **result);
408 
439  getdns_list *support_records,
440  getdns_list *trust_anchors,
441  time_t validation_time, uint32_t skew);
442 
474  getdns_context* context,
475  const char* str);
476 
477 
492  const getdns_list* pinset,
493  getdns_list* errorlist);
494 
495 
506 int
507 getdns_pretty_snprint_dict(char *str, size_t size, const getdns_dict *dict);
508 
514 char *
515 getdns_pretty_print_list(const getdns_list *some_list);
516 
527 int
528 getdns_pretty_snprint_list(char *str, size_t size, const getdns_list *list);
529 
539 char *
540 getdns_print_json_dict(const getdns_dict *some_dict, int pretty);
541 
556 int
558  char *str, size_t size, const getdns_dict *dict, int pretty);
559 
569 char *
570 getdns_print_json_list(const getdns_list *some_list, int pretty);
571 
586 int
588  char *str, size_t size, const getdns_list *list, int pretty);
589 
590 
601  const getdns_dict *rr_dict, uint8_t **wire, size_t *wire_sz);
602 
618  const getdns_dict *rr_dict, uint8_t *wire, size_t *wire_sz);
619 
639  const getdns_dict *rr_dict, uint8_t **wire, int *wire_sz);
640 
641 
652  const uint8_t *wire, size_t wire_sz, getdns_dict **rr_dict);
653 
665  const uint8_t *wire, size_t *wire_sz, getdns_dict **rr_dict);
666 
681  const uint8_t **wire, size_t *wire_sz, getdns_dict **rr_dict);
682 
683 
693  const getdns_dict *rr_dict, char **str);
694 
710  const getdns_dict *rr_dict, char *str, size_t *str_len);
711 
731  const getdns_dict *rr_dict, char **str, int *str_len);
732 
733 
745  const char *str, getdns_dict **rr_dict,
746  const char *origin, uint32_t default_ttl);
747 
759  FILE *in, getdns_list **rr_list,
760  const char *origin, uint32_t default_ttl);
761 
772  const getdns_dict *msg_dict, uint8_t **wire, size_t *wire_sz);
773 
789  const getdns_dict *msg_dict, uint8_t *wire, size_t *wire_sz);
790 
810  const getdns_dict *msg_dict, uint8_t **wire, int *wire_sz);
811 
812 
823  const uint8_t *wire, size_t wire_sz, getdns_dict **msg_dict);
824 
836  const uint8_t *wire, size_t *wire_sz, getdns_dict **msg_dict);
837 
852  const uint8_t **wire, size_t *wire_sz, getdns_dict **msg_dict);
853 
854 
864  const getdns_dict *msg_dict, char **str);
865 
881  const getdns_dict *msg_dict, char *str, size_t *str_len);
882 
902  const getdns_dict *msg_dict, char **str, int *str_len);
911 /* WARNING! Function getdns_strerror is not in the API specification and
912  * is likely to be removed from future versions of our implementation, to be
913  * replaced by getdns_get_errorstr_by_id or something similar.
914  * Please use getdns_get_errorstr_by_id instead of getdns_strerror.
915  */
916 getdns_return_t getdns_strerror(getdns_return_t err, char *buf, size_t buflen);
925 #ifdef __cplusplus
926 }
927 #endif
928 
929 #endif
930 
getdns_return_t getdns_msg_dict2str(const getdns_dict *msg_dict, char **str)
getdns_return_t getdns_msg_dict2wire(const getdns_dict *msg_dict, uint8_t **wire, size_t *wire_sz)
getdns_resolution_t
Definition: getdns.h:142
getdns_return_t getdns_wire2rr_dict_scan(const uint8_t **wire, size_t *wire_sz, getdns_dict **rr_dict)
getdns_return_t getdns_context_get_dns_transport_list(getdns_context *context, size_t *transport_count, getdns_transport_list_t **transports)
getdns_redirects_t
Definition: getdns.h:157
getdns_return_t getdns_rr_dict2str_buf(const getdns_dict *rr_dict, char *str, size_t *str_len)
getdns_return_t getdns_pubkey_pinset_sanity_check(const getdns_list *pinset, getdns_list *errorlist)
getdns_return_t getdns_context_get_dns_root_servers(getdns_context *context, getdns_list **addresses)
getdns_tls_authentication_t
Definition: getdns_extra.h:98
int getdns_pretty_snprint_dict(char *str, size_t size, const getdns_dict *dict)
getdns_namespace_t
Definition: getdns.h:121
getdns_dict * getdns_pubkey_pin_create_from_string(getdns_context *context, const char *str)
const char * getdns_get_version(void)
getdns_return_t getdns_context_get_dnssec_allowed_skew(getdns_context *context, uint32_t *value)
getdns_return_t getdns_context_set_update_callback(getdns_context *context, void *userarg, void(*value)(getdns_context *, getdns_context_code_t, void *))
getdns_return_t getdns_wire2msg_dict_scan(const uint8_t **wire, size_t *wire_sz, getdns_dict **msg_dict)
getdns_return_t getdns_dict_util_set_string(getdns_dict *dict, char *name, const char *value)
getdns_return_t getdns_context_set_use_threads(getdns_context *context, int use_threads)
struct getdns_eventloop getdns_eventloop
getdns_return_t getdns_context_get_namespaces(getdns_context *context, size_t *namespace_count, getdns_namespace_t **namespaces)
getdns_return_t getdns_validate_dnssec2(getdns_list *to_validate, getdns_list *support_records, getdns_list *trust_anchors, time_t validation_time, uint32_t skew)
getdns_return_t getdns_context_get_update_callback(getdns_context *context, void **userarg, void(**value)(getdns_context *, getdns_context_code_t, void *))
char * getdns_print_json_dict(const getdns_dict *some_dict, int pretty)
uint32_t getdns_context_get_num_pending_requests(getdns_context *context, struct timeval *next_timeout)
char * getdns_pretty_print_list(const getdns_list *some_list)
void(* getdns_eventloop_run_once)(getdns_eventloop *loop, int blocking)
Definition: getdns_extra.h:183
getdns_return_t getdns_context_get_eventloop(getdns_context *context, getdns_eventloop **eventloop)
Public interfaces to getdns, include in your application to use getdns API.
getdns_return_t getdns_rr_dict2wire(const getdns_dict *rr_dict, uint8_t **wire, size_t *wire_sz)
getdns_return_t getdns_context_set_tls_authentication(getdns_context *context, getdns_tls_authentication_t value)
getdns_return_t getdns_wire2msg_dict(const uint8_t *wire, size_t wire_sz, getdns_dict **msg_dict)
getdns_return_t getdns_strerror(getdns_return_t err, char *buf, size_t buflen)
getdns_return_t getdns_context_get_append_name(getdns_context *context, getdns_append_name_t *value)
getdns_return_t getdns_wire2rr_dict(const uint8_t *wire, size_t wire_sz, getdns_dict **rr_dict)
char * getdns_print_json_list(const getdns_list *some_list, int pretty)
getdns_return_t(* getdns_eventloop_clear)(getdns_eventloop *loop, getdns_eventloop_event *ev)
Definition: getdns_extra.h:181
getdns_return_t getdns_context_get_edns_client_subnet_private(getdns_context *context, uint8_t *value)
const char * getdns_get_errorstr_by_id(uint16_t err)
getdns_return_t getdns_context_get_edns_do_bit(getdns_context *context, uint8_t *value)
getdns_transport_list_t
Definition: getdns.h:191
int getdns_snprint_json_dict(char *str, size_t size, const getdns_dict *dict, int pretty)
int getdns_pretty_snprint_list(char *str, size_t size, const getdns_list *list)
getdns_return_t getdns_context_set_eventloop(getdns_context *context, getdns_eventloop *eventloop)
getdns_return_t getdns_context_set_return_dnssec_status(getdns_context *context, int enabled)
getdns_return_t getdns_context_get_suffix(getdns_context *context, getdns_list **value)
getdns_return_t getdns_msg_dict2wire_scan(const getdns_dict *msg_dict, uint8_t **wire, int *wire_sz)
uint32_t getdns_get_api_version_number(void)
void getdns_context_run(getdns_context *context)
getdns_return_t getdns_context_get_idle_timeout(getdns_context *context, uint64_t *timeout)
struct getdns_list getdns_list
Definition: getdns.h:502
getdns_eventloop_callback read_cb
Definition: getdns_extra.h:151
getdns_return_t getdns_msg_dict2wire_buf(const getdns_dict *msg_dict, uint8_t *wire, size_t *wire_sz)
getdns_return_t getdns_context_detach_eventloop(getdns_context *context)
getdns_context_code_t
Definition: getdns.h:228
getdns_return_t getdns_context_get_resolution_type(getdns_context *context, getdns_resolution_t *value)
struct getdns_eventloop_event getdns_eventloop_event
getdns_return_t getdns_context_get_dnssec_trust_anchors(getdns_context *context, getdns_list **value)
getdns_return_t getdns_dict_util_get_string(getdns_dict *dict, char *name, char **result)
getdns_return_t getdns_context_set_tls_query_padding_blocksize(getdns_context *context, uint16_t value)
getdns_return_t getdns_str2rr_dict(const char *str, getdns_dict **rr_dict, const char *origin, uint32_t default_ttl)
struct getdns_context getdns_context
Definition: getdns.h:474
getdns_return_t getdns_context_get_timeout(getdns_context *context, uint64_t *timeout)
getdns_return_t(* getdns_eventloop_schedule)(getdns_eventloop *loop, int fd, uint64_t timeout, getdns_eventloop_event *ev)
Definition: getdns_extra.h:176
getdns_return_t getdns_rr_dict2str_scan(const getdns_dict *rr_dict, char **str, int *str_len)
getdns_append_name_t
Definition: getdns.h:208
getdns_return_t getdns_context_get_edns_version(getdns_context *context, uint8_t *value)
getdns_return_t getdns_context_get_tls_authentication(getdns_context *context, getdns_tls_authentication_t *value)
getdns_return_t
Definition: getdns.h:63
void(* getdns_eventloop_noargs)(getdns_eventloop *loop)
Definition: getdns_extra.h:167
getdns_return_t getdns_context_get_upstream_recursive_servers(getdns_context *context, getdns_list **upstream_list)
void(* getdns_eventloop_callback)(void *userarg)
Definition: getdns_extra.h:146
getdns_return_t getdns_msg_dict2str_scan(const getdns_dict *msg_dict, char **str, int *str_len)
getdns_return_t getdns_context_get_dns_transport(getdns_context *context, getdns_transport_t *value)
getdns_return_t getdns_rr_dict2str(const getdns_dict *rr_dict, char **str)
struct getdns_dict getdns_dict
Definition: getdns.h:495
getdns_return_t getdns_rr_dict2wire_buf(const getdns_dict *rr_dict, uint8_t *wire, size_t *wire_sz)
getdns_return_t getdns_rr_dict2wire_scan(const getdns_dict *rr_dict, uint8_t **wire, int *wire_sz)
getdns_return_t getdns_context_set_edns_client_subnet_private(getdns_context *context, uint8_t value)
getdns_return_t getdns_fp2rr_list(FILE *in, getdns_list **rr_list, const char *origin, uint32_t default_ttl)
getdns_return_t getdns_context_get_edns_maximum_udp_payload_size(getdns_context *context, uint16_t *value)
getdns_return_t getdns_context_get_tls_query_padding_blocksize(getdns_context *context, uint16_t *value)
const char * getdns_get_api_version(void)
getdns_return_t getdns_context_get_limit_outstanding_queries(getdns_context *context, uint16_t *limit)
uint32_t getdns_get_version_number(void)
int getdns_snprint_json_list(char *str, size_t size, const getdns_list *list, int pretty)
getdns_return_t getdns_context_process_async(getdns_context *context)
getdns_return_t getdns_msg_dict2str_buf(const getdns_dict *msg_dict, char *str, size_t *str_len)
getdns_transport_t
Definition: getdns.h:172
getdns_return_t getdns_wire2msg_dict_buf(const uint8_t *wire, size_t *wire_sz, getdns_dict **msg_dict)
getdns_eventloop_callback write_cb
Definition: getdns_extra.h:152
getdns_return_t getdns_wire2rr_dict_buf(const uint8_t *wire, size_t *wire_sz, getdns_dict **rr_dict)
getdns_eventloop_callback timeout_cb
Definition: getdns_extra.h:153
getdns_return_t getdns_context_get_edns_extended_rcode(getdns_context *context, uint8_t *value)
getdns_return_t getdns_context_get_follow_redirects(getdns_context *context, getdns_redirects_t *value)