summaryrefslogtreecommitdiff
path: root/main/dns_srv.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2015-04-09 14:58:02 +0000
committerMark Michelson <mmichelson@digium.com>2015-04-09 14:58:02 +0000
commitc08ebc6eeb4d68609d2b7ba3e7eb97e66a24da00 (patch)
treec878c52e2b28f776466183cfba4470966c94ff2f /main/dns_srv.c
parentea0098724efbd64a06b3103d19bb5f711f6f3cd7 (diff)
Reduce duplication of common DNS code.
The NAPTR and SRV branches were worked on independently and resulted in some code being duplicated in each. Since both have been merged into trunk now, this patch reduces the duplication by factoring out common code into its own source files. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@434490 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/dns_srv.c')
-rw-r--r--main/dns_srv.c35
1 files changed, 6 insertions, 29 deletions
diff --git a/main/dns_srv.c b/main/dns_srv.c
index 7895073de..a617ede4d 100644
--- a/main/dns_srv.c
+++ b/main/dns_srv.c
@@ -41,59 +41,36 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/dns_internal.h"
#include "asterisk/utils.h"
-struct ast_dns_record *ast_dns_srv_alloc(struct ast_dns_query *query, const char *data, const size_t size)
+struct ast_dns_record *dns_srv_alloc(struct ast_dns_query *query, const char *data, const size_t size)
{
uint16_t priority;
uint16_t weight;
uint16_t port;
const char *ptr;
- char *srv_offset;
- char *srv_search_base = (char *)query->result->answer;
- size_t remaining_size = query->result->answer_size;
const char *end_of_record;
struct ast_dns_srv_record *srv;
int host_size;
char host[NI_MAXHOST] = "";
- while (1) {
- srv_offset = memchr(srv_search_base, data[0], remaining_size);
-
- ast_assert(srv_offset != NULL);
- ast_assert(srv_search_base + remaining_size - srv_offset >= size);
-
- if (!memcmp(srv_offset, data, size)) {
- ptr = srv_offset;
- break;
- }
-
- remaining_size -= srv_offset - srv_search_base;
- srv_search_base = srv_offset + 1;
- }
-
+ ptr = dns_find_record(data, size, query->result->answer, query->result->answer_size);
ast_assert(ptr != NULL);
end_of_record = ptr + size;
/* PRIORITY */
- priority = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8);
- ptr += 2;
-
+ ptr += dns_parse_short((unsigned char *) ptr, &priority);
if (ptr >= end_of_record) {
return NULL;
}
/* WEIGHT */
- weight = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8);
- ptr += 2;
-
+ ptr += dns_parse_short((unsigned char *) ptr, &weight);
if (ptr >= end_of_record) {
return NULL;
}
/* PORT */
- port = ((unsigned char)(ptr[1]) << 0) | ((unsigned char)(ptr[0]) << 8);
- ptr += 2;
-
+ ptr += dns_parse_short((unsigned char *) ptr, &port);
if (ptr >= end_of_record) {
return NULL;
}
@@ -129,7 +106,7 @@ struct ast_dns_record *ast_dns_srv_alloc(struct ast_dns_query *query, const char
/* This implementation was taken from the existing srv.c which, after reading the RFC, implements it
* as it should.
*/
-void ast_dns_srv_sort(struct ast_dns_result *result)
+void dns_srv_sort(struct ast_dns_result *result)
{
struct ast_dns_record *current;
struct dns_records newlist = AST_LIST_HEAD_NOLOCK_INIT_VALUE;