summaryrefslogtreecommitdiff
path: root/main/dnsmgr.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-11-22 23:06:11 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-11-22 23:06:11 +0000
commit2b3e28f88c8e8cd0e21621344ae7705f352dc44e (patch)
tree7c5e171b00a804de54b6f4650d799fa068fa9c88 /main/dnsmgr.c
parentd777e15792ee1f61b1cb77929dda24872cdd7742 (diff)
Fix dnsmgr entries to ask for the same address family each time.
The dnsmgr refresh would always get the first address found regardless of the original address family requested. So if you asked for only IPv4 addresses originally, you might get an IPv6 address on refresh. * Saved the original address family requested by ast_dnsmgr_lookup() to be used when the address is refreshed. ........ Merged revisions 345976 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 345977 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@345978 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/dnsmgr.c')
-rw-r--r--main/dnsmgr.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/main/dnsmgr.c b/main/dnsmgr.c
index bd3ab78e3..d11cd99e3 100644
--- a/main/dnsmgr.c
+++ b/main/dnsmgr.c
@@ -54,6 +54,8 @@ struct ast_dnsmgr_entry {
struct ast_sockaddr *result;
/*! SRV record to lookup, if provided. Composed of service, protocol, and domain name: _Service._Proto.Name */
char *service;
+ /*! Address family to filter DNS responses. */
+ unsigned int family;
/*! Set to 1 if the entry changes */
unsigned int changed:1;
ast_mutex_t lock;
@@ -83,7 +85,7 @@ static struct refresh_info master_refresh_info = {
.verbose = 0,
};
-struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct ast_sockaddr *result, const char *service)
+struct ast_dnsmgr_entry *ast_dnsmgr_get_family(const char *name, struct ast_sockaddr *result, const char *service, unsigned int family)
{
struct ast_dnsmgr_entry *entry;
int total_size = sizeof(*entry) + strlen(name) + (service ? strlen(service) + 1 : 0);
@@ -99,6 +101,7 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct ast_sockaddr *r
entry->service = ((char *) entry) + sizeof(*entry) + strlen(name);
strcpy(entry->service, service);
}
+ entry->family = family;
AST_RWLIST_WRLOCK(&entry_list);
AST_RWLIST_INSERT_HEAD(&entry_list, entry, list);
@@ -107,6 +110,11 @@ struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct ast_sockaddr *r
return entry;
}
+struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct ast_sockaddr *result, const char *service)
+{
+ return ast_dnsmgr_get_family(name, result, service, 0);
+}
+
void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
{
if (!entry) {
@@ -124,6 +132,8 @@ void ast_dnsmgr_release(struct ast_dnsmgr_entry *entry)
int ast_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_dnsmgr_entry **dnsmgr, const char *service)
{
+ unsigned int family;
+
if (ast_strlen_zero(name) || !result || !dnsmgr) {
return -1;
}
@@ -132,6 +142,9 @@ int ast_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_
return 0;
}
+ /* Lookup address family filter. */
+ family = result->ss.ss_family;
+
/*
* If it's actually an IP address and not a name, there's no
* need for a managed lookup.
@@ -151,7 +164,7 @@ int ast_dnsmgr_lookup(const char *name, struct ast_sockaddr *result, struct ast_
}
ast_verb(3, "adding dns manager for '%s'\n", name);
- *dnsmgr = ast_dnsmgr_get(name, result, service);
+ *dnsmgr = ast_dnsmgr_get_family(name, result, service, family);
return !*dnsmgr;
}
@@ -169,6 +182,7 @@ static int dnsmgr_refresh(struct ast_dnsmgr_entry *entry, int verbose)
ast_verb(3, "refreshing '%s'\n", entry->name);
}
+ tmp.ss.ss_family = entry->family;
if (!ast_get_ip_or_srv(&tmp, entry->name, entry->service)) {
if (!ast_sockaddr_port(&tmp)) {
ast_sockaddr_set_port(&tmp, ast_sockaddr_port(entry->result));