Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 259745) +++ channels/chan_sip.c (working copy) @@ -2513,7 +2513,7 @@ static void update_peer(struct sip_peer *p, int expire); static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config); static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername); -static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin, int devstate_only); +static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *sin, int devstate_only, int which_objects); static char *sip_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a); /*--- Internal UA client handling (outbound registrations) */ @@ -4735,7 +4735,7 @@ * This returns a pointer to a peer and because we use build_peer, we can rest * assured that the refcount is bumped. */ -static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_in *sin, int devstate_only) +static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_in *sin, int devstate_only, int which_objects) { struct sip_peer *peer; struct ast_variable *var = NULL; @@ -4855,12 +4855,10 @@ } for (tmp = var; tmp; tmp = tmp->next) { - /* If this is type=user, then skip this object. */ - if (!strcasecmp(tmp->name, "type") && - !strcasecmp(tmp->value, "user")) { - if(peerlist) + if (!strcasecmp(tmp->name, "type") && (!strcasecmp(tmp->value, "peer") && which_objects == FINDUSERS)) { + if(peerlist) { ast_config_destroy(peerlist); - else { + } else { ast_variables_destroy(var); ast_variables_destroy(varregs); } @@ -4868,6 +4866,7 @@ } else if (!newpeername && !strcasecmp(tmp->name, "name")) { newpeername = tmp->value; } + } if (!newpeername) { /* Did not find peer in realtime */ @@ -4985,7 +4984,23 @@ } if (!p && (realtime || devstate_only)) { - p = realtime_peer(peer, sin, devstate_only); + p = realtime_peer(peer, sin, devstate_only, which_objects); + if (p) { + switch (which_objects) { + case FINDUSERS: + if (!(p->type & SIP_TYPE_USER)) { + return 0; + } + break; + case FINDPEERS: + if (!(p->type & SIP_TYPE_PEER)) { + return 0; + } + break; + case FINDALLDEVICES: + break; + } + } } return p;