@ -65,10 +65,11 @@ static int find_transport_state_in_use(void *obj, void *arg, int flags)
struct ast_sip_transport_state * transport_state = obj ;
pjsip_rx_data * rdata = arg ;
if ( transport_state & & ( ( transport_state - > transport = = rdata - > tp_info . transport ) | |
( transport_state - > factory & & ! pj_strcmp ( & transport_state - > factory - > addr_name . host , & rdata - > tp_info . transport - > local_name . host ) & &
transport_state - > factory - > addr_name . port = = rdata - > tp_info . transport - > local_name . port ) ) ) {
return CMP_MATCH | CMP_STOP ;
if ( transport_state - > transport = = rdata - > tp_info . transport
| | ( transport_state - > factory
& & ! pj_strcmp ( & transport_state - > factory - > addr_name . host , & rdata - > tp_info . transport - > local_name . host )
& & transport_state - > factory - > addr_name . port = = rdata - > tp_info . transport - > local_name . port ) ) {
return CMP_MATCH ;
}
return 0 ;
@ -81,36 +82,46 @@ static struct ast_sip_endpoint *find_endpoint(pjsip_rx_data *rdata, char *endpoi
char * domain_name )
{
struct ast_sip_endpoint * endpoint ;
RAII_VAR ( struct ast_sip_domain_alias * , alias , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ao2_container * , transport_states , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_sip_transport_state * , transport_state , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_sip_transport * , transport , NULL , ao2_cleanup ) ;
if ( ! ast_sip_get_disable_multi_domain ( ) ) {
struct ast_sip_domain_alias * alias ;
struct ao2_container * transport_states ;
struct ast_sip_transport_state * transport_state = NULL ;
struct ast_sip_transport * transport = NULL ;
char id [ DOMAIN_NAME_LEN + USERNAME_LEN + sizeof ( " @ " ) ] ;
/* Attempt to find the endpoint given the name and domain provided */
snprintf ( id , sizeof ( id ) , " %s@%s " , endpoint_name , domain_name ) ;
if ( ( endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ) ) {
endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ;
if ( endpoint ) {
return endpoint ;
}
/* See if an alias exists for the domain provided */
if ( ( alias = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " domain_alias " , domain_name ) ) ) {
alias = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " domain_alias " ,
domain_name ) ;
if ( alias ) {
snprintf ( id , sizeof ( id ) , " %s@%s " , endpoint_name , alias - > domain ) ;
if ( ( endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ) ) {
ao2_ref ( alias , - 1 ) ;
endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ;
if ( endpoint ) {
return endpoint ;
}
}
/* See if the transport this came in on has a provided domain */
if ( ( transport_states = ast_sip_get_transport_states ( ) )
& & ( transport_state = ao2_callback ( transport_states , 0 , find_transport_state_in_use , rdata ) )
& & ( transport = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " transport " , transport_state - > id ) )
& & ! ast_strlen_zero ( transport - > domain ) ) {
snprintf ( id , sizeof ( id ) , " anonymous@%s " , transport - > domain ) ;
if ( ( endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ) ) {
return endpoint ;
}
snprintf ( id , sizeof ( id ) , " %s@%s " , endpoint_name , transport - > domain ) ;
endpoint = ast_sorcery_retrieve_by_id ( ast_sip_get_sorcery ( ) , " endpoint " , id ) ;
}
ao2_cleanup ( transport ) ;
ao2_cleanup ( transport_state ) ;
ao2_cleanup ( transport_states ) ;
if ( endpoint ) {
return endpoint ;
}
}