[svn-commits] seanbright: branch seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_se...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Feb 28 10:05:04 CST 2012


Author: seanbright
Date: Tue Feb 28 10:04:59 2012
New Revision: 357260

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=357260
Log:
Update realtime_peer and realtime_user.

Modified:
    team/seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_sean_bright/channels/chan_iax2.c

Modified: team/seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_sean_bright/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/team/seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_sean_bright/channels/chan_iax2.c?view=diff&rev=357260&r1=357259&r2=357260
==============================================================================
--- team/seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_sean_bright/channels/chan_iax2.c (original)
+++ team/seanbright/the_ipv6ification_of_chan_iax2_by_the_coward_sean_bright/channels/chan_iax2.c Tue Feb 28 10:04:59 2012
@@ -975,8 +975,8 @@
 static AST_LIST_HEAD_STATIC(dpcache, iax2_dpcache);
 
 static void reg_source_db(struct iax2_peer *p);
-static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
-static struct iax2_user *realtime_user(const char *username, struct sockaddr_in *sin);
+static struct iax2_peer *realtime_peer(const char *peername, struct ast_sockaddr *addr);
+static struct iax2_user *realtime_user(const char *username, struct ast_sockaddr *addr);
 
 static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
 static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, uint64_t flags);
@@ -1817,15 +1817,13 @@
 	struct iax2_peer *peer = NULL;
 	int res = 0;
 	struct ao2_iterator i;
+	struct ast_sockaddr addr = AST_SOCKADDR_INIT_VALUE;
+
+	ast_sockaddr_from_sin(&addr, &sin);
 
 	i = ao2_iterator_init(peers, 0);
 	while ((peer = ao2_iterator_next(&i))) {
-		struct sockaddr_in peer_addr;
-
-		ast_sockaddr_to_sin(&peer->addr, &peer_addr);
-
-		if ((peer_addr.sin_addr.s_addr == sin.sin_addr.s_addr) &&
-		    (peer_addr.sin_port == sin.sin_port)) {
+		if (!ast_sockaddr_cmp(&peer->addr, &addr)) {
 			ast_copy_string(host, peer->name, len);
 			peer_unref(peer);
 			res = 1;
@@ -1836,7 +1834,7 @@
 	ao2_iterator_destroy(&i);
 
 	if (!peer) {
-		peer = realtime_peer(NULL, &sin);
+		peer = realtime_peer(NULL, &addr);
 		if (peer) {
 			ast_copy_string(host, peer->name, len);
 			peer_unref(peer);
@@ -2238,6 +2236,10 @@
 	int res = 1;  /* required by default */
 	int optional = 0;
 	enum calltoken_peer_enum calltoken_required = CALLTOKEN_DEFAULT;
+	struct ast_sockaddr addr = AST_SOCKADDR_INIT_VALUE;
+
+	ast_sockaddr_from_sin(&addr, sin);
+
 	/* There are only two cases in which calltoken validation is not required.
 	 * Case 1. sin falls within the list of address ranges specified in the calltoken optional table and
 	 *         the peer definition has not set the requirecalltoken option.
@@ -2253,11 +2255,11 @@
 	/* ----- Case 2 ----- */
 	if ((subclass == IAX_COMMAND_NEW) && (user = find_user(find))) {
 		calltoken_required = user->calltoken_required;
-	} else if ((subclass == IAX_COMMAND_NEW) && (user = realtime_user(find, sin))) {
+	} else if ((subclass == IAX_COMMAND_NEW) && (user = realtime_user(find, &addr))) {
 		calltoken_required = user->calltoken_required;
 	} else if ((subclass != IAX_COMMAND_NEW) && (peer = find_peer(find, 0))) {
 		calltoken_required = peer->calltoken_required;
-	} else if ((subclass != IAX_COMMAND_NEW) && (peer = realtime_peer(find, sin))) {
+	} else if ((subclass != IAX_COMMAND_NEW) && (peer = realtime_peer(find, &addr))) {
 		calltoken_required = peer->calltoken_required;
 	}
 
@@ -4317,7 +4319,7 @@
  * \note This function calls reg_source_db -> iax2_poke_peer -> find_callno,
  *       so do not call this with a pvt lock held.
  */
-static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin)
+static struct iax2_peer *realtime_peer(const char *peername, struct ast_sockaddr *addr)
 {
 	struct ast_variable *var = NULL;
 	struct ast_variable *tmp;
@@ -4327,12 +4329,10 @@
 
 	if (peername) {
 		var = ast_load_realtime("iaxpeers", "name", peername, "host", "dynamic", SENTINEL);
-		if (!var && sin)
-			var = ast_load_realtime("iaxpeers", "name", peername, "host", ast_inet_ntoa(sin->sin_addr), SENTINEL);
-	} else if (sin) {
-		char porta[25];
-		sprintf(porta, "%d", ntohs(sin->sin_port));
-		var = ast_load_realtime("iaxpeers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
+		if (!var && addr)
+			var = ast_load_realtime("iaxpeers", "name", peername, "host", ast_sockaddr_stringify_addr(addr), SENTINEL);
+	} else if (addr) {
+		var = ast_load_realtime("iaxpeers", "ipaddr", ast_sockaddr_stringify_addr(addr), "port", ast_sockaddr_stringify_port(addr), SENTINEL);
 		if (var) {
 			/* We'll need the peer name in order to build the structure! */
 			for (tmp = var; tmp; tmp = tmp->next) {
@@ -4349,12 +4349,20 @@
 		 * is because we only have the IP address and the host field might be
 		 * set as a name (and the reverse PTR might not match).
 		 */
-		if (var && sin) {
+		if (var && addr) {
 			for (tmp = var; tmp; tmp = tmp->next) {
 				if (!strcasecmp(tmp->name, "host")) {
-					struct ast_hostent ahp;
-					struct hostent *hp;
-					if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || (memcmp(hp->h_addr, &sin->sin_addr, sizeof(hp->h_addr)))) {
+					struct ast_sockaddr *addrs;
+					int num_addrs = 0, i = 0;
+					if ((num_addrs = ast_sockaddr_resolve(&addrs, tmp->value, 0, AST_AF_UNSPEC))) {
+						for (i = 0; i < num_addrs; i++) {
+							if (!ast_sockaddr_cmp_addr(addr, &addrs[i])) {
+								break;
+							}
+						}
+						ast_free(addrs);
+					}
+					if (i == num_addrs) {
 						/* No match */
 						ast_variables_destroy(var);
 						var = NULL;
@@ -4437,7 +4445,7 @@
 	return peer;
 }
 
-static struct iax2_user *realtime_user(const char *username, struct sockaddr_in *sin)
+static struct iax2_user *realtime_user(const char *username, struct ast_sockaddr *addr)
 {
 	struct ast_variable *var;
 	struct ast_variable *tmp;
@@ -4445,13 +4453,11 @@
 
 	var = ast_load_realtime("iaxusers", "name", username, "host", "dynamic", SENTINEL);
 	if (!var)
-		var = ast_load_realtime("iaxusers", "name", username, "host", ast_inet_ntoa(sin->sin_addr), SENTINEL);
-	if (!var && sin) {
-		char porta[6];
-		snprintf(porta, sizeof(porta), "%d", ntohs(sin->sin_port));
-		var = ast_load_realtime("iaxusers", "name", username, "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
+		var = ast_load_realtime("iaxusers", "name", username, "host", ast_sockaddr_stringify_addr(addr), SENTINEL);
+	if (!var && addr) {
+		var = ast_load_realtime("iaxusers", "name", username, "ipaddr", ast_sockaddr_stringify_addr(addr), "port", ast_sockaddr_stringify_port(addr), SENTINEL);
 		if (!var)
-			var = ast_load_realtime("iaxusers", "ipaddr", ast_inet_ntoa(sin->sin_addr), "port", porta, SENTINEL);
+			var = ast_load_realtime("iaxusers", "ipaddr", ast_sockaddr_stringify_addr(addr), "port", ast_sockaddr_stringify_port(addr), SENTINEL);
 	}
 	if (!var) { /* Last ditch effort */
 		var = ast_load_realtime("iaxusers", "name", username, SENTINEL);
@@ -4464,9 +4470,17 @@
 		if (var) {
 			for (tmp = var; tmp; tmp = tmp->next) {
 				if (!strcasecmp(tmp->name, "host")) {
-					struct ast_hostent ahp;
-					struct hostent *hp;
-					if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || (memcmp(hp->h_addr, &sin->sin_addr, sizeof(hp->h_addr)))) {
+					struct ast_sockaddr *addrs;
+					int num_addrs = 0, i = 0;
+					if ((num_addrs = ast_sockaddr_resolve(&addrs, tmp->value, 0, AST_AF_UNSPEC))) {
+						for (i = 0; i < num_addrs; i++) {
+							if (!ast_sockaddr_cmp_addr(addr, &addrs[i])) {
+								break;
+							}
+						}
+						ast_free(addrs);
+					}
+					if (i == num_addrs) {
 						/* No match */
 						ast_variables_destroy(var);
 						var = NULL;
@@ -7673,7 +7687,7 @@
 	ao2_iterator_destroy(&i);
 	user = best;
 	if (!user && !ast_strlen_zero(iaxs[callno]->username)) {
-		user = realtime_user(iaxs[callno]->username, sin);
+		user = realtime_user(iaxs[callno]->username, &addr);
 		if (user && !ast_strlen_zero(iaxs[callno]->context) &&			/* No context specified */
 		    !apply_context(user->contexts, iaxs[callno]->context)) {		/* Context is permitted */
 			user = user_unref(user);




More information about the svn-commits mailing list