[asterisk-commits] mmichelson: trunk r169791 - /trunk/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jan 21 15:53:56 CST 2009


Author: mmichelson
Date: Wed Jan 21 15:53:55 2009
New Revision: 169791

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=169791
Log:
Further fix some oddities in sip show users and sip show peers logic

ccesario on IRC pointed out that his sip peers were not displayed
properly when he would issue the command "sip show peers." The problem
was that the onlymatchonip field was used to determine if the endpoint
was a "peer" or "user." The tricky part is that a "friend" is supposed
to be treated as both a "user" and a "peer" but the logic would not allow
"friends" to show up as "peers" since onlymatchonip was set to FALSE
for friends.

I have modified the sip_peer structure to more explicitly keep track of
what type endpoint it is so that the various manager and CLI commands
will display the expected information

Reported by ccesario via IRC
Tested by ccesario


Modified:
    trunk/channels/chan_sip.c

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/trunk/channels/chan_sip.c?view=diff&rev=169791&r1=169790&r2=169791
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Wed Jan 21 15:53:55 2009
@@ -1802,6 +1802,11 @@
 	AST_LIST_ENTRY(sip_mailbox) entry;
 };
 
+enum sip_peer_type {
+	SIP_TYPE_PEER = (1 << 0),
+	SIP_TYPE_USER = (1 << 1),
+};
+
 /*! \brief Structure for SIP peer data, we place calls to peers if registered  or fixed IP address (host) 
 */
 /* XXX field 'name' must be first otherwise sip_addrcmp() will fail, as will astobj2 hashing of the structure */
@@ -1885,6 +1890,7 @@
 	int timer_t1;			/*!<  The maximum T1 value for the peer */
 	int timer_b;			/*!<  The maximum timer B (transaction timeouts) */
 	int deprecated_username; /*!< If it's a realtime peer, are they using the deprecated "username" instead of "defaultuser" */
+	enum sip_peer_type type; /*!< Distinguish between "user" and "peer" types. This is used solely for CLI and manager commands */
 };
 
 
@@ -13321,7 +13327,7 @@
 	user_iter = ao2_iterator_init(peers, 0);
 	while ((user = ao2_iterator_next(&user_iter))) {
 		ao2_lock(user);
-		if (user->onlymatchonip == TRUE) {
+		if (!(user->type & SIP_TYPE_USER)) {
 			ao2_unlock(user);
 			unref_peer(user, "sip show users");
 			continue;
@@ -13513,7 +13519,7 @@
 	while ((peer = ao2_t_iterator_next(&i, "iterate thru peers table"))) {	
 		ao2_lock(peer);
 
-		if (peer->onlymatchonip == FALSE) {
+		if (!(peer->type & SIP_TYPE_PEER)) {
 			ao2_unlock(peer);
 			unref_peer(peer, "unref peer because it's actually a user");
 			continue;
@@ -14392,7 +14398,7 @@
 	user_iter = ao2_iterator_init(peers, 0);
 	while ((user = ao2_iterator_next(&user_iter))) {
 		ao2_lock(user);
-		if (user->onlymatchonip == TRUE) {
+		if (!(user->type & SIP_TYPE_USER)) {
 			ao2_unlock(user);
 			unref_peer(user, "complete sip user");
 			continue;
@@ -22392,8 +22398,16 @@
 				ast_str_set(&fullcontact, 0, "%s", v->value);
 			}
 		} else if (!strcasecmp(v->name, "type")) {
-			if (!strcasecmp(v->value, "peer")) 
+			if (!strcasecmp(v->value, "peer")) {
 				peer->onlymatchonip = TRUE;		/* For realtime support, add type=peer in the table */
+				peer->type = SIP_TYPE_PEER;
+			} else if (!strcasecmp(v->value, "user")) {
+				peer->onlymatchonip = FALSE;
+				peer->type = SIP_TYPE_USER;
+			} else if (!strcasecmp(v->value, "friend")) {
+				peer->onlymatchonip = FALSE;
+				peer->type = SIP_TYPE_USER | SIP_TYPE_PEER;
+			}
 		} else if (!strcasecmp(v->name, "remotesecret")) {
 			ast_string_field_set(peer, remotesecret, v->value);
 		} else if (!strcasecmp(v->name, "secret")) {




More information about the asterisk-commits mailing list