[asterisk-commits] file: branch group/dns r432887 - in /team/group/dns: include/asterisk/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Mar 13 10:34:26 CDT 2015
Author: file
Date: Fri Mar 13 10:34:23 2015
New Revision: 432887
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432887
Log:
Incorporate review feedback.
1. Split higher level concepts out into their own files
2. Improve documentation detailing behavior
3. Fix overflow bug with high TTL
4. Fix bug where a record TTL of 0 could override non-zero
Added:
team/group/dns/main/dns_naptr.c (with props)
team/group/dns/main/dns_recurring.c (with props)
team/group/dns/main/dns_srv.c (with props)
team/group/dns/main/dns_tlsa.c (with props)
Modified:
team/group/dns/include/asterisk/dns_core.h
team/group/dns/include/asterisk/dns_internal.h
team/group/dns/include/asterisk/dns_recurring.h
team/group/dns/main/dns_core.c
Modified: team/group/dns/include/asterisk/dns_core.h
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/include/asterisk/dns_core.h?view=diff&rev=432887&r1=432886&r2=432887
==============================================================================
--- team/group/dns/include/asterisk/dns_core.h (original)
+++ team/group/dns/include/asterisk/dns_core.h Fri Mar 13 10:34:23 2015
@@ -126,6 +126,18 @@
*/
const struct ast_dns_record *ast_dns_result_get_records(const struct ast_dns_result *result);
+
+/*!
+ * \brief Retrieve the lowest TTL from a result
+ *
+ * \param result The DNS result
+ *
+ * \return the lowest TTL
+ *
+ * \note If no records exist this function will return a TTL of 0
+ */
+int ast_dns_result_get_lowest_ttl(const struct ast_dns_result *result);
+
/*!
* \brief Free the DNS result information
*
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=432887&r1=432886&r2=432887
==============================================================================
--- team/group/dns/include/asterisk/dns_internal.h (original)
+++ team/group/dns/include/asterisk/dns_internal.h Fri Mar 13 10:34:23 2015
@@ -125,3 +125,12 @@
/*! \brief The name of what is being resolved */
char name[0];
};
+
+struct ast_sched_context;
+
+/*!
+ * \brief Retrieve the DNS scheduler context
+ *
+ * \return scheduler context
+ */
+struct ast_sched_context *ast_dns_get_sched(void);
Modified: team/group/dns/include/asterisk/dns_recurring.h
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/include/asterisk/dns_recurring.h?view=diff&rev=432887&r1=432886&r2=432887
==============================================================================
--- team/group/dns/include/asterisk/dns_recurring.h (original)
+++ team/group/dns/include/asterisk/dns_recurring.h Fri Mar 13 10:34:23 2015
@@ -45,9 +45,15 @@
*
* \note The user data passed in to this function must be ao2 allocated
*
- * \note This query will continue to happen according to the lowest TTL unless cancelled using ast_dns_resolve_cancel
+ * \note This query will continue to happen according to the lowest TTL unless cancelled using ast_dns_resolve_recurring_cancel
*
* \note It is NOT possible for the callback to be invoked concurrently for the query multiple times
+ *
+ * \note The query will occur when the TTL expires, not before. This means that there is a period of time where the previous
+ * information can be considered stale.
+ *
+ * \note If the TTL is determined to be 0 (the record specifies 0, or no records exist) this will cease doing a recurring query.
+ * It is the responsibility of the caller to resume querying at an interval they determine.
*/
struct ast_dns_query_recurring *ast_dns_resolve_recurring(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data);
@@ -56,8 +62,8 @@
*
* \param query The DNS query returned from ast_dns_resolve_recurring
*
- * \retval 0 success
- * \retval -1 failure
+ * \retval 0 success - any active query has been cancelled and the query will no longer occur
+ * \retval -1 failure - an active query was in progress and could not be cancelled
*
* \note If successfully cancelled the callback will not be invoked
*/
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=432887&r1=432886&r2=432887
==============================================================================
--- team/group/dns/main/dns_core.c (original)
+++ team/group/dns/main/dns_core.c Fri Mar 13 10:34:23 2015
@@ -37,7 +37,6 @@
#include "asterisk/strings.h"
#include "asterisk/sched.h"
#include "asterisk/dns_core.h"
-#include "asterisk/dns_naptr.h"
#include "asterisk/dns_srv.h"
#include "asterisk/dns_tlsa.h"
#include "asterisk/dns_recurring.h"
@@ -50,6 +49,11 @@
static struct ast_sched_context *sched;
+struct ast_sched_context *ast_dns_get_sched(void)
+{
+ return sched;
+}
+
const char *ast_dns_query_get_name(const struct ast_dns_query *query)
{
return query->name;
@@ -98,6 +102,24 @@
const struct ast_dns_record *ast_dns_result_get_records(const struct ast_dns_result *result)
{
return AST_LIST_FIRST(&result->records);
+}
+
+int ast_dns_result_get_lowest_ttl(const struct ast_dns_result *result)
+{
+ int ttl = 0;
+ const struct ast_dns_record *record;
+
+ if (ast_dns_result_get_rcode(result) == ns_r_nxdomain) {
+ return 0;
+ }
+
+ for (record = ast_dns_result_get_records(result); record; record = ast_dns_record_get_next(record)) {
+ if (!ttl || (ast_dns_record_get_ttl(record) && (ast_dns_record_get_ttl(record) < ttl))) {
+ ttl = ast_dns_record_get_ttl(record);
+ }
+ }
+
+ return ttl;
}
void ast_dns_result_free(struct ast_dns_result *result)
@@ -297,76 +319,6 @@
return *result ? 0 : -1;
}
-const char *ast_dns_naptr_get_flags(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
-const char *ast_dns_naptr_get_service(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
-const char *ast_dns_naptr_get_regexp(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
-const char *ast_dns_naptr_get_replacement(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
-unsigned short ast_dns_naptr_get_order(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned short ast_dns_naptr_get_preference(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-const char *ast_dns_srv_get_host(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
-unsigned short ast_dns_srv_get_priority(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned short ast_dns_srv_get_weight(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned short ast_dns_srv_get_port(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned int ast_dns_tlsa_get_usage(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned int ast_dns_tlsa_get_selector(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-unsigned int ast_dns_tlsa_get_matching_type(const struct ast_dns_record *record)
-{
- return 0;
-}
-
-const char *ast_dns_tlsa_get_association_data(const struct ast_dns_record *record)
-{
- return NULL;
-}
-
int ast_dns_resolver_set_data(struct ast_dns_query *query, void *data)
{
if (query->resolver_data) {
@@ -479,130 +431,6 @@
void ast_dns_resolver_completed(struct ast_dns_query *query)
{
query->callback(query);
-}
-
-/*! \brief Destructor for a DNS query */
-static void dns_query_recurring_destroy(void *data)
-{
- struct ast_dns_query_recurring *recurring = data;
-
- ao2_cleanup(recurring->user_data);
-}
-
-/*! \brief Determine the TTL to use when scheduling recurring resolution */
-static int dns_query_recurring_get_ttl(const struct ast_dns_query *query)
-{
- int ttl = 0;
- const struct ast_dns_result *result = ast_dns_query_get_result(query);
- const struct ast_dns_record *record;
-
- if (ast_dns_result_get_rcode(result) == ns_r_nxdomain) {
- return 0;
- }
-
- for (record = ast_dns_result_get_records(result); record; record = ast_dns_record_get_next(record)) {
- if (!ttl || (ast_dns_record_get_ttl(record) < ttl)) {
- ttl = ast_dns_record_get_ttl(record);
- }
- }
-
- return ttl;
-}
-
-static void dns_query_recurring_resolution_callback(const struct ast_dns_query *query);
-
-/*! \brief Scheduled recurring query callback */
-static int dns_query_recurring_scheduled_callback(const void *data)
-{
- struct ast_dns_query_recurring *recurring = (struct ast_dns_query_recurring *)data;
-
- ao2_lock(recurring);
- recurring->timer = -1;
- if (!recurring->cancelled) {
- recurring->query = ast_dns_resolve_async(recurring->name, recurring->rr_type, recurring->rr_class, dns_query_recurring_resolution_callback,
- recurring);
- }
- ao2_unlock(recurring);
-
- ao2_ref(recurring, -1);
-
- return 0;
-}
-
-/*! \brief Query resolution callback */
-static void dns_query_recurring_resolution_callback(const struct ast_dns_query *query)
-{
- struct ast_dns_query_recurring *recurring = ast_dns_query_get_data(query);
-
- /* Replace the user data so the actual callback sees what it provided */
- ((struct ast_dns_query*)query)->user_data = ao2_bump(recurring->user_data);
- recurring->callback(query);
-
- ao2_lock(recurring);
- /* So.. if something has not externally cancelled this we can reschedule based on the TTL */
- if (!recurring->cancelled) {
- int ttl = dns_query_recurring_get_ttl(query);
-
- if (ttl) {
- recurring->timer = ast_sched_add(sched, ttl * 1000, dns_query_recurring_scheduled_callback, ao2_bump(recurring));
- if (recurring->timer < 0) {
- ao2_ref(recurring, -1);
- }
- }
- }
-
- ao2_replace(recurring->query, NULL);
- ao2_unlock(recurring);
-
- /* Since we stole the reference from the query we need to drop it ourselves */
- ao2_ref(recurring, -1);
-}
-
-struct ast_dns_query_recurring *ast_dns_resolve_recurring(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data)
-{
- struct ast_dns_query_recurring *recurring;
-
- if (ast_strlen_zero(name) || !callback) {
- return NULL;
- }
-
- recurring = ao2_alloc(sizeof(*recurring) + strlen(name) + 1, dns_query_recurring_destroy);
- if (!recurring) {
- return NULL;
- }
-
- recurring->callback = callback;
- recurring->user_data = ao2_bump(data);
- recurring->timer = -1;
- recurring->rr_type = rr_type;
- recurring->rr_class = rr_class;
- strcpy(recurring->name, name); /* SAFE */
-
- /* The scheduler callback expects a reference, so bump it up */
- recurring->query = ast_dns_resolve_async(name, rr_type, rr_class, dns_query_recurring_resolution_callback, recurring);
- if (!recurring->query) {
- ao2_ref(recurring, -1);
- return NULL;
- }
-
- return recurring;
-}
-
-int ast_dns_resolve_recurring_cancel(struct ast_dns_query_recurring *recurring)
-{
- ao2_lock(recurring);
-
- recurring->cancelled = 1;
- AST_SCHED_DEL_UNREF(sched, recurring->timer, ao2_ref(recurring, -1));
-
- if (recurring->query) {
- ast_dns_resolve_cancel(recurring->query);
- ao2_replace(recurring->query, NULL);
- }
-
- ao2_unlock(recurring);
-
- return 0;
}
static void dns_shutdown(void)
Added: team/group/dns/main/dns_naptr.c
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_naptr.c?view=auto&rev=432887
==============================================================================
--- team/group/dns/main/dns_naptr.c (added)
+++ team/group/dns/main/dns_naptr.c Fri Mar 13 10:34:23 2015
@@ -1,0 +1,65 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2015, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief DNS NAPTR Record Support
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/dns_core.h"
+#include "asterisk/dns_naptr.h"
+
+const char *ast_dns_naptr_get_flags(const struct ast_dns_record *record)
+{
+ return NULL;
+}
+
+const char *ast_dns_naptr_get_service(const struct ast_dns_record *record)
+{
+ return NULL;
+}
+
+const char *ast_dns_naptr_get_regexp(const struct ast_dns_record *record)
+{
+ return NULL;
+}
+
+const char *ast_dns_naptr_get_replacement(const struct ast_dns_record *record)
+{
+ return NULL;
+}
+
+unsigned short ast_dns_naptr_get_order(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+unsigned short ast_dns_naptr_get_preference(const struct ast_dns_record *record)
+{
+ return 0;
+}
Propchange: team/group/dns/main/dns_naptr.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/group/dns/main/dns_naptr.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/group/dns/main/dns_naptr.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/group/dns/main/dns_recurring.c
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_recurring.c?view=auto&rev=432887
==============================================================================
--- team/group/dns/main/dns_recurring.c (added)
+++ team/group/dns/main/dns_recurring.c Fri Mar 13 10:34:23 2015
@@ -1,0 +1,149 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2015, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief DNS Recurring Query Support
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/astobj2.h"
+#include "asterisk/linkedlists.h"
+#include "asterisk/sched.h"
+#include "asterisk/strings.h"
+#include "asterisk/dns_core.h"
+#include "asterisk/dns_recurring.h"
+#include "asterisk/dns_internal.h"
+
+#include <arpa/nameser.h>
+
+/*! \brief Destructor for a DNS query */
+static void dns_query_recurring_destroy(void *data)
+{
+ struct ast_dns_query_recurring *recurring = data;
+
+ ao2_cleanup(recurring->user_data);
+}
+
+static void dns_query_recurring_resolution_callback(const struct ast_dns_query *query);
+
+/*! \brief Scheduled recurring query callback */
+static int dns_query_recurring_scheduled_callback(const void *data)
+{
+ struct ast_dns_query_recurring *recurring = (struct ast_dns_query_recurring *)data;
+
+ ao2_lock(recurring);
+ recurring->timer = -1;
+ if (!recurring->cancelled) {
+ recurring->query = ast_dns_resolve_async(recurring->name, recurring->rr_type, recurring->rr_class, dns_query_recurring_resolution_callback,
+ recurring);
+ }
+ ao2_unlock(recurring);
+
+ ao2_ref(recurring, -1);
+
+ return 0;
+}
+
+/*! \brief Query resolution callback */
+static void dns_query_recurring_resolution_callback(const struct ast_dns_query *query)
+{
+ struct ast_dns_query_recurring *recurring = ast_dns_query_get_data(query);
+
+ /* Replace the user data so the actual callback sees what it provided */
+ ((struct ast_dns_query*)query)->user_data = ao2_bump(recurring->user_data);
+ recurring->callback(query);
+
+ ao2_lock(recurring);
+ /* So.. if something has not externally cancelled this we can reschedule based on the TTL */
+ if (!recurring->cancelled) {
+ const struct ast_dns_result *result = ast_dns_query_get_result(query);
+ int ttl = MIN(ast_dns_result_get_lowest_ttl(result), INT_MAX / 1000);
+
+ if (ttl) {
+ recurring->timer = ast_sched_add(ast_dns_get_sched(), ttl * 1000, dns_query_recurring_scheduled_callback, ao2_bump(recurring));
+ if (recurring->timer < 0) {
+ ao2_ref(recurring, -1);
+ }
+ }
+ }
+
+ ao2_replace(recurring->query, NULL);
+ ao2_unlock(recurring);
+
+ /* Since we stole the reference from the query we need to drop it ourselves */
+ ao2_ref(recurring, -1);
+}
+
+struct ast_dns_query_recurring *ast_dns_resolve_recurring(const char *name, int rr_type, int rr_class, ast_dns_resolve_callback callback, void *data)
+{
+ struct ast_dns_query_recurring *recurring;
+
+ if (ast_strlen_zero(name) || !callback || !ast_dns_get_sched()) {
+ return NULL;
+ }
+
+ recurring = ao2_alloc(sizeof(*recurring) + strlen(name) + 1, dns_query_recurring_destroy);
+ if (!recurring) {
+ return NULL;
+ }
+
+ recurring->callback = callback;
+ recurring->user_data = ao2_bump(data);
+ recurring->timer = -1;
+ recurring->rr_type = rr_type;
+ recurring->rr_class = rr_class;
+ strcpy(recurring->name, name); /* SAFE */
+
+ /* The resolution callback expects a reference, so bump it up */
+ recurring->query = ast_dns_resolve_async(name, rr_type, rr_class, dns_query_recurring_resolution_callback, ao2_bump(recurring));
+ if (!recurring->query) {
+ ao2_ref(recurring, -1);
+ return NULL;
+ }
+
+ return recurring;
+}
+
+int ast_dns_resolve_recurring_cancel(struct ast_dns_query_recurring *recurring)
+{
+ int res = 0;
+
+ ao2_lock(recurring);
+
+ recurring->cancelled = 1;
+ AST_SCHED_DEL_UNREF(ast_dns_get_sched(), recurring->timer, ao2_ref(recurring, -1));
+
+ if (recurring->query) {
+ res = ast_dns_resolve_cancel(recurring->query);
+ ao2_replace(recurring->query, NULL);
+ }
+
+ ao2_unlock(recurring);
+
+ return res;
+}
Propchange: team/group/dns/main/dns_recurring.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/group/dns/main/dns_recurring.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/group/dns/main/dns_recurring.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/group/dns/main/dns_srv.c
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_srv.c?view=auto&rev=432887
==============================================================================
--- team/group/dns/main/dns_srv.c (added)
+++ team/group/dns/main/dns_srv.c Fri Mar 13 10:34:23 2015
@@ -1,0 +1,55 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2015, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief DNS SRV Record Support
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/dns_core.h"
+#include "asterisk/dns_srv.h"
+
+const char *ast_dns_srv_get_host(const struct ast_dns_record *record)
+{
+ return NULL;
+}
+
+unsigned short ast_dns_srv_get_priority(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+unsigned short ast_dns_srv_get_weight(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+unsigned short ast_dns_srv_get_port(const struct ast_dns_record *record)
+{
+ return 0;
+}
Propchange: team/group/dns/main/dns_srv.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/group/dns/main/dns_srv.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/group/dns/main/dns_srv.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: team/group/dns/main/dns_tlsa.c
URL: http://svnview.digium.com/svn/asterisk/team/group/dns/main/dns_tlsa.c?view=auto&rev=432887
==============================================================================
--- team/group/dns/main/dns_tlsa.c (added)
+++ team/group/dns/main/dns_tlsa.c Fri Mar 13 10:34:23 2015
@@ -1,0 +1,55 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2015, Digium, Inc.
+ *
+ * Joshua Colp <jcolp at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief DNS TLSA Record Support
+ *
+ * \author Joshua Colp <jcolp at digium.com>
+ */
+
+/*** MODULEINFO
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/dns_core.h"
+#include "asterisk/dns_tlsa.h"
+
+unsigned int ast_dns_tlsa_get_usage(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+unsigned int ast_dns_tlsa_get_selector(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+unsigned int ast_dns_tlsa_get_matching_type(const struct ast_dns_record *record)
+{
+ return 0;
+}
+
+const char *ast_dns_tlsa_get_association_data(const struct ast_dns_record *record)
+{
+ return NULL;
+}
Propchange: team/group/dns/main/dns_tlsa.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: team/group/dns/main/dns_tlsa.c
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: team/group/dns/main/dns_tlsa.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
More information about the asterisk-commits
mailing list