diff options
author | Joshua Colp <jcolp@digium.com> | 2015-04-01 16:27:48 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2015-04-01 16:27:48 +0000 |
commit | 39824e3d013287d8860d620454d230278b0fba69 (patch) | |
tree | ff7380c85bde86fe7138f0b79cf4071594bedb18 /main/dns_core.c | |
parent | da13d15425e2dfefaf1b656d8aa6462d967b77ad (diff) |
dns: Add support for SRV record parsing and sorting.
This change adds support for parsing SRV records and consuming their values
in an easy fashion. It also adds automatic sorting of SRV records according
to RFC 2782.
Tests have also been included which cover parsing, sorting, and off-nominal
cases where the record is corrupted.
ASTERISK-24931 #close
Reported by: Joshua Colp
Review: https://reviewboard.asterisk.org/r/4528/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@433889 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/dns_core.c')
-rw-r--r-- | main/dns_core.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/main/dns_core.c b/main/dns_core.c index 394eaa514..4fd80193e 100644 --- a/main/dns_core.c +++ b/main/dns_core.c @@ -43,6 +43,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/dns_resolver.h" #include "asterisk/dns_internal.h" +#include <netinet/in.h> #include <arpa/nameser.h> AST_RWLIST_HEAD_STATIC(resolvers, ast_dns_resolver); @@ -159,7 +160,7 @@ int ast_dns_record_get_ttl(const struct ast_dns_record *record) const char *ast_dns_record_get_data(const struct ast_dns_record *record) { - return record->data; + return record->data_ptr; } const struct ast_dns_record *ast_dns_record_get_next(const struct ast_dns_record *record) @@ -406,10 +407,25 @@ int ast_dns_resolver_set_result(struct ast_dns_query *query, unsigned int secure buf_ptr += strlen(canonical) + 1; memcpy(buf_ptr, answer, answer_size); /* SAFE */ query->result->answer = buf_ptr; + query->result->answer_size = answer_size; return 0; } +static struct ast_dns_record *generic_record_alloc(struct ast_dns_query *query, const char *data, const size_t size) +{ + struct ast_dns_record *record; + + record = ast_calloc(1, sizeof(*record) + size); + if (!record) { + return NULL; + } + + record->data_ptr = record->data; + + return record; +} + int ast_dns_resolver_add_record(struct ast_dns_query *query, int rr_type, int rr_class, int ttl, const char *data, const size_t size) { struct ast_dns_record *record; @@ -444,7 +460,12 @@ int ast_dns_resolver_add_record(struct ast_dns_query *query, int rr_type, int rr return -1; } - record = ast_calloc(1, sizeof(*record) + size); + if (rr_type == ns_t_srv) { + record = ast_dns_srv_alloc(query, data, size); + } else { + record = generic_record_alloc(query, data, size); + } + if (!record) { return -1; } @@ -452,8 +473,8 @@ int ast_dns_resolver_add_record(struct ast_dns_query *query, int rr_type, int rr record->rr_type = rr_type; record->rr_class = rr_class; record->ttl = ttl; - memcpy(record->data, data, size); record->data_len = size; + memcpy(record->data_ptr, data, size); AST_LIST_INSERT_TAIL(&query->result->records, record, list); @@ -462,6 +483,10 @@ int ast_dns_resolver_add_record(struct ast_dns_query *query, int rr_type, int rr void ast_dns_resolver_completed(struct ast_dns_query *query) { + if (ast_dns_query_get_rr_type(query) == ns_t_srv) { + ast_dns_srv_sort(query->result); + } + query->callback(query); } |