summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2009-01-21 21:53:55 +0000
committerMark Michelson <mmichelson@digium.com>2009-01-21 21:53:55 +0000
commit28dc82ea4eaf4a46de121f46ff665107d08b611d (patch)
treeb39909399a1f60cadb58f5cb7f9d3c3e6aed59d3 /channels
parent02094f7fb947efc8ea235cc622e644a524773d14 (diff)
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 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@169791 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_sip.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 23a150da2..7b3c2d8be 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -1802,6 +1802,11 @@ struct sip_mailbox {
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 @@ struct sip_peer {
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 @@ static char *sip_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
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 @@ static char *_sip_show_peers(int fd, int *total, struct mansession *s, const str
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 @@ static char *complete_sip_user(const char *word, int state)
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 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
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")) {