[asterisk-commits] jpeeler: branch jpeeler/sip-dnsmgr r111499 - in /team/jpeeler/sip-dnsmgr: inc...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Mar 27 17:09:41 CDT 2008


Author: jpeeler
Date: Thu Mar 27 17:09:41 2008
New Revision: 111499

URL: http://svn.digium.com/view/asterisk?view=rev&rev=111499
Log:
dnsmgr refreshes for hosts with dns srv records working, need to clean the code up a bit though

Modified:
    team/jpeeler/sip-dnsmgr/include/asterisk/dnsmgr.h
    team/jpeeler/sip-dnsmgr/main/dnsmgr.c

Modified: team/jpeeler/sip-dnsmgr/include/asterisk/dnsmgr.h
URL: http://svn.digium.com/view/asterisk/team/jpeeler/sip-dnsmgr/include/asterisk/dnsmgr.h?view=diff&rev=111499&r1=111498&r2=111499
==============================================================================
--- team/jpeeler/sip-dnsmgr/include/asterisk/dnsmgr.h (original)
+++ team/jpeeler/sip-dnsmgr/include/asterisk/dnsmgr.h Thu Mar 27 17:09:41 2008
@@ -53,7 +53,7 @@
  */
 struct ast_dnsmgr_entry *ast_dnsmgr_get(const char *name, struct in_addr *result);
 
-struct ast_dnsmgr_entry *ast_dnsmgr_get_srv(const char *name, struct in_addr *result, unsigned short *portno);
+struct ast_dnsmgr_entry *ast_dnsmgr_get_srv(const char *name, struct in_addr *result, unsigned short *portno, const char *service);
 
 
 /*!

Modified: team/jpeeler/sip-dnsmgr/main/dnsmgr.c
URL: http://svn.digium.com/view/asterisk/team/jpeeler/sip-dnsmgr/main/dnsmgr.c?view=diff&rev=111499&r1=111498&r2=111499
==============================================================================
--- team/jpeeler/sip-dnsmgr/main/dnsmgr.c (original)
+++ team/jpeeler/sip-dnsmgr/main/dnsmgr.c Thu Mar 27 17:09:41 2008
@@ -50,6 +50,8 @@
 	struct in_addr last;
 	unsigned short result_portno;
 	unsigned short last_portno;
+	char service[MAXHOSTNAMELEN];
+	int dnssrv:1;
 	/*! Set to 1 if the entry changes */
 	int changed:1;
 	ast_mutex_t lock;
@@ -90,6 +92,7 @@
 	ast_mutex_init(&entry->lock);
 	strcpy(entry->name, name);
 	memcpy(&entry->last, result, sizeof(entry->last));
+	entry->dnssrv = 0;
 
 	AST_RWLIST_WRLOCK(&entry_list);
 	AST_RWLIST_INSERT_HEAD(&entry_list, entry, list);
@@ -99,7 +102,7 @@
 }
 
 
-struct ast_dnsmgr_entry *ast_dnsmgr_get_srv(const char *name, struct in_addr *result, unsigned short *portno)
+struct ast_dnsmgr_entry *ast_dnsmgr_get_srv(const char *name, struct in_addr *result, unsigned short *portno, const char *service)
 {
 	struct ast_dnsmgr_entry *entry;
 
@@ -110,8 +113,10 @@
 	entry->result_portno = *portno;
 	ast_mutex_init(&entry->lock);
 	strcpy(entry->name, name);
+	strcpy(entry->service, service);
 	memcpy(&entry->last, result, sizeof(entry->last));
 	entry->last_portno = *portno;
+	entry->dnssrv = 1;
 
 	AST_RWLIST_WRLOCK(&entry_list);
 	AST_RWLIST_INSERT_HEAD(&entry_list, entry, list);
@@ -201,7 +206,9 @@
 		ast_log(LOG_DEBUG, "name=%s realhostname=%s result_portno=%d hp->h_addr=%s\n", name, realhostname, *result_portno, hp->h_addr);
 	}
 
-	memcpy(result_addr, hp->h_addr, sizeof(result_addr));
+	if (hp) {
+		memcpy(result_addr, hp->h_addr, sizeof(result_addr));
+	}
 
 
 	/* if dnsmgr is not enabled don't bother adding an entry */
@@ -209,7 +216,7 @@
 		return 0;
 	
 	ast_verb(3, "adding dns manager for '%s'\n", name);
-	*dnsmgr = ast_dnsmgr_get_srv(name, result_addr, result_portno);
+	*dnsmgr = ast_dnsmgr_get_srv(name, result_addr, result_portno, service);
 	return !*dnsmgr;
 }
 
@@ -225,12 +232,35 @@
 	char iabuf2[INET_ADDRSTRLEN];
 	struct in_addr tmp;
 	int changed = 0;
+	char realhostname[MAXHOSTNAMELEN];
+	int real_portno;
         
 	ast_mutex_lock(&entry->lock);
 	if (verbose)
 		ast_verb(3, "refreshing '%s'\n", entry->name);
 
-	if ((hp = ast_gethostbyname(entry->name, &ahp))) {
+	if (entry->dnssrv) {
+		int srv_ret;
+		srv_ret = ast_get_srv(NULL, realhostname, sizeof(realhostname), &real_portno, entry->service);
+
+		if (srv_ret > 0) {
+			if ((hp = ast_gethostbyname(realhostname, &ahp))) {
+				memcpy(&tmp, hp->h_addr, sizeof(tmp));
+				if (tmp.s_addr != entry->last.s_addr) {
+					ast_copy_string(iabuf, ast_inet_ntoa(entry->last), sizeof(iabuf));
+					ast_copy_string(iabuf2, ast_inet_ntoa(tmp), sizeof(iabuf2));
+					ast_log(LOG_NOTICE, "host '%s' changed from %s to %s\n", 
+						entry->name, iabuf, iabuf2);
+
+					memcpy(entry->result, hp->h_addr, sizeof(entry->result));
+					memcpy(&entry->last, hp->h_addr, sizeof(entry->last));
+					entry->result_portno = htons((unsigned int)real_portno);
+					entry->last_portno = htons((unsigned int)real_portno);
+					changed = entry->changed = 1;
+				}
+			}
+		}
+	} else if ((hp = ast_gethostbyname(entry->name, &ahp))) {
 		/* check to see if it has changed, do callback if requested (where de callback is defined ????) */
 		memcpy(&tmp, hp->h_addr, sizeof(tmp));
 		if (tmp.s_addr != entry->last.s_addr) {




More information about the asterisk-commits mailing list