@ -29680,7 +29680,8 @@ static int sip_devicestate(const char *data)
* or SIP / devicename / extension / IPorHost
* or SIP / username @ domain //IPorHost
* and there is an optional [ ! dnid ] argument you can append to alter the
* To : header .
* To : header . And after that , a [ ! [ fromuser ] [ @ fromdomain ] ] argument .
* Leave those blank to use the defaults .
* \ endverbatim
*/
static struct ast_channel * sip_request_call ( const char * type , struct ast_format_cap * cap , const struct ast_assigned_ids * assignedids , const struct ast_channel * requestor , const char * dest , int * cause )
@ -29752,11 +29753,49 @@ static struct ast_channel *sip_request_call(const char *type, struct ast_format_
/* Save the destination, the SIP dial string */
ast_copy_string ( tmp , dest , sizeof ( tmp ) ) ;
/* Find DNID and take it away */
/* Find optional DNID (SIP to-uri) and From-CLI (SIP from-uri)
* and strip it from the dial string :
* [ ! touser [ @ todomain ] [ ! [ fromuser ] [ @ fromdomain ] ] ]
* For historical reasons , the touser @ todomain is passed as dnid
* while fromuser @ fromdomain are split immediately . Passing a
* todomain without touser will create an invalid SIP message . */
dnid = strchr ( tmp , ' ! ' ) ;
if ( dnid ! = NULL ) {
char * fromuser_and_domain ;
* dnid + + = ' \0 ' ;
ast_string_field_set ( p , todnid , dnid ) ;
if ( ( fromuser_and_domain = strchr ( dnid , ' ! ' ) ) ) {
char * forward_compat ;
char * fromdomain ;
* fromuser_and_domain + + = ' \0 ' ;
/* Cut it at a trailing NUL or trailing '!' for
* forward compatibility with extra arguments
* in the future . */
if ( ( forward_compat = strchr ( fromuser_and_domain , ' ! ' ) ) ) {
/* Ignore the rest.. */
* forward_compat = ' \0 ' ;
}
if ( ( fromdomain = strchr ( fromuser_and_domain , ' @ ' ) ) ) {
* fromdomain + + = ' \0 ' ;
/* Set fromdomain. */
if ( ! ast_strlen_zero ( fromdomain ) ) {
ast_string_field_set ( p , fromdomain , fromdomain ) ;
}
}
/* Set fromuser. */
if ( ! ast_strlen_zero ( fromuser_and_domain ) ) {
ast_string_field_set ( p , fromuser , fromuser_and_domain ) ;
}
}
/* Set DNID (touser/todomain). */
if ( ! ast_strlen_zero ( dnid ) ) {
ast_string_field_set ( p , todnid , dnid ) ;
}
}
/* Divvy up the items separated by slashes */