[svn-commits] file: branch group/dns r432477 - in /team/group/dns: include/asterisk/ main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Mar 4 17:04:43 CST 2015


Author: file
Date: Wed Mar  4 17:04:41 2015
New Revision: 432477

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432477
Log:
Implement ast_dns_resolver_set_result and ast_dns_resolver_add_record.

Modified:
    team/group/dns/include/asterisk/dns_internal.h
    team/group/dns/main/dns_core.c

Modified: team/group/dns/include/asterisk/dns_internal.h
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/include/asterisk/dns_internal.h?view=diff&rev=432477&r1=432476&r2=432477
==============================================================================
--- team/group/dns/include/asterisk/dns_internal.h (original)
+++ team/group/dns/include/asterisk/dns_internal.h Wed Mar  4 17:04:41 2015
@@ -31,12 +31,12 @@
 	int rr_class;
 	/*! \brief Time-to-live of the record */
 	int ttl;
-	/*! \brief The raw DNS record */
-	char *data;
 	/*! \brief The size of the raw DNS record */
 	size_t data_len;
 	/*! \brief Linked list information */
 	AST_LIST_ENTRY(ast_dns_record) list;
+	/*! \brief The raw DNS record */
+	char data[0];
 };
 
 /*! \brief An SRV record */
@@ -79,10 +79,10 @@
 	unsigned int secure;
 	/*! \brief Whether the result is bogus */
 	unsigned int bogus;
-	/*! \brief The canonical name */
-	const char *canonical;
 	/*! \brief Records returned */
 	AST_LIST_HEAD_NOLOCK(, ast_dns_record) records;
+	/*! \brief The canonical name */
+	char canonical[0];
 };
 
 /*! \brief A DNS query */

Modified: team/group/dns/main/dns_core.c
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_core.c?view=diff&rev=432477&r1=432476&r2=432477
==============================================================================
--- team/group/dns/main/dns_core.c (original)
+++ team/group/dns/main/dns_core.c Wed Mar  4 17:04:41 2015
@@ -101,6 +101,7 @@
 
 void ast_dns_result_free(struct ast_dns_result *result)
 {
+	ao2_cleanup(result);
 }
 
 int ast_dns_record_get_rr_type(const struct ast_dns_record *record)
@@ -333,6 +334,17 @@
 	return query->resolver_data;
 }
 
+/*! \brief Destructor for DNS result */
+static void dns_result_destroy(void *obj)
+{
+	struct ast_dns_result *result = obj;
+	struct ast_dns_record *record;
+
+	while ((record = AST_LIST_REMOVE_HEAD(&result->records, list))) {
+		ast_free(record);
+	}
+}
+
 int ast_dns_resolver_set_result(struct ast_dns_query *query, unsigned int nxdomain, unsigned int secure, unsigned int bogus,
 	const char *canonical)
 {
@@ -340,17 +352,41 @@
 		ast_dns_result_free(query->result);
 	}
 
-	query->result = NULL;
+	query->result = ao2_alloc_options(sizeof(*query->result) + strlen(canonical) + 1, dns_result_destroy, AO2_ALLOC_OPT_LOCK_NOLOCK);
+	if (!query->result) {
+		return -1;
+	}
+
+	query->result->nxdomain = nxdomain;
+	query->result->secure = secure;
+	query->result->bogus = bogus;
+	strcpy(query->result->canonical, canonical); /* SAFE */
+
 	return 0;
 }
 
 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;
+
 	if (!query->result) {
 		return -1;
 	}
 
-	return -1;
+	record = ast_calloc(1, sizeof(*record) + size);
+	if (!record) {
+		return -1;
+	}
+
+	record->rr_type = rr_type;
+	record->rr_class = rr_class;
+	record->ttl = ttl;
+	memcpy(record->data, data, size);
+	record->data_len = size;
+
+	AST_LIST_INSERT_TAIL(&query->result->records, record, list);
+
+	return 0;
 }
 
 void ast_dns_resolver_completed(const struct ast_dns_query *query)




More information about the svn-commits mailing list