@ -2896,12 +2896,13 @@ struct create_addr_info {
char mohsuggest [ MAX_MUSICCLASS ] ;
} ;
static int create_addr ( const char * peername , struct sockaddr_in * sin , struct create_addr_info * cai )
static int create_addr ( const char * peername , struct ast_channel * c , struct sockaddr_in * sin , struct create_addr_info * cai )
{
struct ast_hostent ahp ;
struct hostent * hp ;
struct iax2_peer * peer ;
int res = - 1 ;
struct ast_codec_pref ourprefs ;
ast_clear_flag ( cai , IAX_SENDANI | IAX_TRUNK ) ;
cai - > sockfd = defaultsockfd ;
@ -2916,7 +2917,11 @@ static int create_addr(const char *peername, struct sockaddr_in *sin, struct cre
memcpy ( & sin - > sin_addr , hp - > h_addr , sizeof ( sin - > sin_addr ) ) ;
sin - > sin_port = htons ( IAX_DEFAULT_PORTNO ) ;
/* use global iax prefs for unknown peer/user */
ast_codec_pref_convert ( & prefs , cai - > prefs , sizeof ( cai - > prefs ) , 1 ) ;
/* But move the calling channel's native codec to the top of the preference list */
memcpy ( & ourprefs , & prefs , sizeof ( ourprefs ) ) ;
if ( c )
ast_codec_pref_prepend ( & ourprefs , c - > nativeformats , 1 ) ;
ast_codec_pref_convert ( & ourprefs , cai - > prefs , sizeof ( cai - > prefs ) , 1 ) ;
return 0 ;
} else {
ast_log ( LOG_WARNING , " No such host: %s \n " , peername ) ;
@ -2940,7 +2945,13 @@ static int create_addr(const char *peername, struct sockaddr_in *sin, struct cre
cai - > encmethods = peer - > encmethods ;
cai - > sockfd = peer - > sockfd ;
cai - > adsi = peer - > adsi ;
ast_codec_pref_convert ( & peer - > prefs , cai - > prefs , sizeof ( cai - > prefs ) , 1 ) ;
memcpy ( & ourprefs , & peer - > prefs , sizeof ( ourprefs ) ) ;
/* Move the calling channel's native codec to the top of the preference list */
if ( c ) {
ast_log ( LOG_DEBUG , " prepending %x to prefs \n " , c - > nativeformats ) ;
ast_codec_pref_prepend ( & ourprefs , c - > nativeformats , 1 ) ;
}
ast_codec_pref_convert ( & ourprefs , cai - > prefs , sizeof ( cai - > prefs ) , 1 ) ;
ast_copy_string ( cai - > context , peer - > context , sizeof ( cai - > context ) ) ;
ast_copy_string ( cai - > peercontext , peer - > peercontext , sizeof ( cai - > peercontext ) ) ;
ast_copy_string ( cai - > username , peer - > username , sizeof ( cai - > username ) ) ;
@ -3115,7 +3126,7 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
if ( ! pds . exten )
pds . exten = defaultrdest ;
if ( create_addr ( pds . peer , & sin , & cai ) ) {
if ( create_addr ( pds . peer , c , & sin , & cai ) ) {
ast_log ( LOG_WARNING , " No address associated with '%s' \n " , pds . peer ) ;
return - 1 ;
}
@ -8499,7 +8510,7 @@ static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const
if ( end ) {
memcpy ( & sin , end , sizeof ( sin ) ) ;
cai . sockfd = sockfd ;
} else if ( create_addr ( dest , & sin , & cai ) )
} else if ( create_addr ( dest , NULL , & sin , & cai ) )
return - 1 ;
/* Build the rest of the message */
@ -8722,7 +8733,7 @@ static struct ast_channel *iax2_request(const char *type, int format, void *data
/* Populate our address from the given */
if ( create_addr ( pds . peer , & sin , & cai ) ) {
if ( create_addr ( pds . peer , NULL , & sin , & cai ) ) {
* cause = AST_CAUSE_UNREGISTERED ;
return NULL ;
}
@ -10037,7 +10048,7 @@ static int cache_get_callno_locked(const char *data)
parse_dial_string ( tmpstr , & pds ) ;
/* Populate our address from the given */
if ( create_addr ( pds . peer , & sin , & cai ) )
if ( create_addr ( pds . peer , NULL , & sin , & cai ) )
return - 1 ;
if ( option_debug )