summaryrefslogtreecommitdiff
path: root/main/dns_core.c
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2015-04-01 16:27:48 +0000
committerJoshua Colp <jcolp@digium.com>2015-04-01 16:27:48 +0000
commit39824e3d013287d8860d620454d230278b0fba69 (patch)
treeff7380c85bde86fe7138f0b79cf4071594bedb18 /main/dns_core.c
parentda13d15425e2dfefaf1b656d8aa6462d967b77ad (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.c31
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);
}