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 */
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 */
};
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;
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;
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;
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")) {