@ -27228,505 +27228,512 @@ static int reload_config(enum channelreloadreason reason)
ast_clear_flag ( & global_flags [ 1 ] , SIP_PAGE2_IGNORESDPVERSION ) ;
ast_clear_flag ( & global_flags [ 1 ] , SIP_PAGE2_IGNORESDPVERSION ) ;
/* Read the [general] config section of sip.conf (or from realtime config) */
/* Read all [general] config sections of sip.conf (or from realtime config) */
for ( v = ast_variable_browse ( cfg , " general " ) ; v ; v = v - > next ) {
for ( cat = ast_category_browse ( cfg , " general " ) ; cat ; cat = ast_category_browse ( cfg , cat ) ) {
if ( handle_common_options ( & global_flags [ 0 ] , & dummy [ 0 ] , v ) ) {
if ( strcmp ( cat , " general " ) ) {
continue ;
}
if ( handle_t38_options ( & global_flags [ 0 ] , & dummy [ 0 ] , v , & global_t38_maxdatagram ) ) {
continue ;
}
/* handle jb conf */
if ( ! ast_jb_read_conf ( & global_jbconf , v - > name , v - > value ) ) {
continue ;
}
/* handle tls conf */
if ( ! ast_tls_read_conf ( & default_tls_cfg , & sip_tls_desc , v - > name , v - > value ) ) {
continue ;
continue ;
}
}
if ( ! strcasecmp ( v - > name , " context " ) ) {
for ( v = ast_variable_browse ( cfg , cat ) ; v ; v = v - > next ) {
ast_copy_string ( sip_cfg . default_context , v - > value , sizeof ( sip_cfg . default_context ) ) ;
if ( handle_common_options ( & global_flags [ 0 ] , & dummy [ 0 ] , v ) ) {
} else if ( ! strcasecmp ( v - > name , " subscribecontext " ) ) {
continue ;
ast_copy_string ( sip_cfg . default_subscribecontext , v - > value , sizeof ( sip_cfg . default_subscribecontext ) ) ;
} else if ( ! strcasecmp ( v - > name , " callcounter " ) ) {
global_callcounter = ast_true ( v - > value ) ? 1 : 0 ;
} else if ( ! strcasecmp ( v - > name , " allowguest " ) ) {
sip_cfg . allowguest = ast_true ( v - > value ) ? 1 : 0 ;
} else if ( ! strcasecmp ( v - > name , " realm " ) ) {
ast_copy_string ( sip_cfg . realm , v - > value , sizeof ( sip_cfg . realm ) ) ;
} else if ( ! strcasecmp ( v - > name , " domainsasrealm " ) ) {
sip_cfg . domainsasrealm = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " useragent " ) ) {
ast_copy_string ( global_useragent , v - > value , sizeof ( global_useragent ) ) ;
ast_debug ( 1 , " Setting SIP channel User-Agent Name to %s \n " , global_useragent ) ;
} else if ( ! strcasecmp ( v - > name , " sdpsession " ) ) {
ast_copy_string ( global_sdpsession , v - > value , sizeof ( global_sdpsession ) ) ;
} else if ( ! strcasecmp ( v - > name , " sdpowner " ) ) {
/* Field cannot contain spaces */
if ( ! strstr ( v - > value , " " ) ) {
ast_copy_string ( global_sdpowner , v - > value , sizeof ( global_sdpowner ) ) ;
} else {
ast_log ( LOG_WARNING , " '%s' must not contain spaces at line %d. Using default. \n " , v - > value , v - > lineno ) ;
}
} else if ( ! strcasecmp ( v - > name , " allowtransfer " ) ) {
sip_cfg . allowtransfer = ast_true ( v - > value ) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED ;
} else if ( ! strcasecmp ( v - > name , " rtcachefriends " ) ) {
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_RTCACHEFRIENDS ) ;
} else if ( ! strcasecmp ( v - > name , " rtsavesysname " ) ) {
sip_cfg . rtsave_sysname = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " rtupdate " ) ) {
sip_cfg . peer_rtupdate = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " ignoreregexpire " ) ) {
sip_cfg . ignore_regexpire = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " timert1 " ) ) {
/* Defaults to 500ms, but RFC 3261 states that it is recommended
* for the value to be set higher , though a lower value is only
* allowed on private networks unconnected to the Internet . */
global_t1 = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " timerb " ) ) {
int tmp = atoi ( v - > value ) ;
if ( tmp < 500 ) {
global_timer_b = global_t1 * 64 ;
ast_log ( LOG_WARNING , " Invalid value for timerb ('%s'). Setting to default ('%d'). \n " , v - > value , global_timer_b ) ;
}
timerb_set = 1 ;
} else if ( ! strcasecmp ( v - > name , " t1min " ) ) {
global_t1min = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " transport " ) & & ! ast_strlen_zero ( v - > value ) ) {
char * val = ast_strdupa ( v - > value ) ;
char * trans ;
while ( ( trans = strsep ( & val , " , " ) ) ) {
trans = ast_skip_blanks ( trans ) ;
if ( ! strncasecmp ( trans , " udp " , 3 ) ) {
default_transports | = SIP_TRANSPORT_UDP ;
} else if ( ! strncasecmp ( trans , " tcp " , 3 ) ) {
default_transports | = SIP_TRANSPORT_TCP ;
} else if ( ! strncasecmp ( trans , " tls " , 3 ) ) {
default_transports | = SIP_TRANSPORT_TLS ;
} else {
ast_log ( LOG_NOTICE , " '%s' is not a valid transport type. if no other is specified, udp will be used. \n " , trans ) ;
}
if ( default_primary_transport = = 0 ) {
default_primary_transport = default_transports ;
}
}
} else if ( ! strcasecmp ( v - > name , " tcpenable " ) ) {
if ( ! ast_false ( v - > value ) ) {
ast_debug ( 2 , " Enabling TCP socket for listening \n " ) ;
sip_cfg . tcp_enabled = TRUE ;
}
} else if ( ! strcasecmp ( v - > name , " tcpbindaddr " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR ,
& sip_tcp_desc . local_address ) ) {
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
v - > name , v - > value , v - > lineno , config ) ;
}
ast_debug ( 2 , " Setting TCP socket address to %s \n " ,
ast_sockaddr_stringify ( & sip_tcp_desc . local_address ) ) ;
} else if ( ! strcasecmp ( v - > name , " dynamic_exclude_static " ) | | ! strcasecmp ( v - > name , " dynamic_excludes_static " ) ) {
global_dynamic_exclude_static = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " contactpermit " ) | | ! strcasecmp ( v - > name , " contactdeny " ) ) {
int ha_error = 0 ;
sip_cfg . contact_ha = ast_append_ha ( v - > name + 7 , v - > value , sip_cfg . contact_ha , & ha_error ) ;
if ( ha_error ) {
ast_log ( LOG_ERROR , " Bad ACL entry in configuration line %d : %s \n " , v - > lineno , v - > value ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " rtautoclear " ) ) {
if ( handle_t38_options ( & global_flags [ 0 ] , & dummy [ 0 ] , v , & global_t38_maxdatagram ) ) {
int i = atoi ( v - > value ) ;
continue ;
if ( i > 0 ) {
sip_cfg . rtautoclear = i ;
} else {
i = 0 ;
}
}
ast_set2_flag ( & global_flags [ 1 ] , i | | ast_true ( v - > value ) , SIP_PAGE2_RTAUTOCLEAR ) ;
/* handle jb conf */
} else if ( ! strcasecmp ( v - > name , " usereqphone " ) ) {
if ( ! ast_jb_read_conf ( & global_jbconf , v - > name , v - > value ) ) {
ast_set2_flag ( & global_flags [ 0 ] , ast_true ( v - > value ) , SIP_USEREQPHONE ) ;
continue ;
} else if ( ! strcasecmp ( v - > name , " prematuremedia " ) ) {
global_prematuremediafilter = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " relaxdtmf " ) ) {
global_relaxdtmf = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " vmexten " ) ) {
ast_copy_string ( default_vmexten , v - > value , sizeof ( default_vmexten ) ) ;
} else if ( ! strcasecmp ( v - > name , " rtptimeout " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtptimeout ) ! = 1 ) | | ( global_rtptimeout < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP hold time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtptimeout = 0 ;
}
} else if ( ! strcasecmp ( v - > name , " rtpholdtimeout " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtpholdtimeout ) ! = 1 ) | | ( global_rtpholdtimeout < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP hold time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtpholdtimeout = 0 ;
}
} else if ( ! strcasecmp ( v - > name , " rtpkeepalive " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtpkeepalive ) ! = 1 ) | | ( global_rtpkeepalive < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP keepalive time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtpkeepalive = DEFAULT_RTPKEEPALIVE ;
}
} else if ( ! strcasecmp ( v - > name , " compactheaders " ) ) {
sip_cfg . compactheaders = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifymimetype " ) ) {
ast_copy_string ( default_notifymime , v - > value , sizeof ( default_notifymime ) ) ;
} else if ( ! strcasecmp ( v - > name , " directrtpsetup " ) ) {
sip_cfg . directrtpsetup = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifyringing " ) ) {
sip_cfg . notifyringing = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifyhold " ) ) {
sip_cfg . notifyhold = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifycid " ) ) {
if ( ! strcasecmp ( v - > value , " ignore-context " ) ) {
sip_cfg . notifycid = IGNORE_CONTEXT ;
} else {
sip_cfg . notifycid = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " alwaysauthreject " ) ) {
sip_cfg . alwaysauthreject = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " auth_options_requests " ) ) {
if ( ast_true ( v - > value ) ) {
sip_cfg . auth_options_requests = 1 ;
}
} else if ( ! strcasecmp ( v - > name , " mohinterpret " ) ) {
ast_copy_string ( default_mohinterpret , v - > value , sizeof ( default_mohinterpret ) ) ;
} else if ( ! strcasecmp ( v - > name , " mohsuggest " ) ) {
ast_copy_string ( default_mohsuggest , v - > value , sizeof ( default_mohsuggest ) ) ;
} else if ( ! strcasecmp ( v - > name , " language " ) ) {
ast_copy_string ( default_language , v - > value , sizeof ( default_language ) ) ;
} else if ( ! strcasecmp ( v - > name , " regcontext " ) ) {
ast_copy_string ( newcontexts , v - > value , sizeof ( newcontexts ) ) ;
stringp = newcontexts ;
/* Let's remove any contexts that are no longer defined in regcontext */
cleanup_stale_contexts ( stringp , oldregcontext ) ;
/* Create contexts if they don't exist already */
while ( ( context = strsep ( & stringp , " & " ) ) ) {
ast_copy_string ( used_context , context , sizeof ( used_context ) ) ;
ast_context_find_or_create ( NULL , NULL , context , " SIP " ) ;
}
ast_copy_string ( sip_cfg . regcontext , v - > value , sizeof ( sip_cfg . regcontext ) ) ;
} else if ( ! strcasecmp ( v - > name , " regextenonqualify " ) ) {
sip_cfg . regextenonqualify = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " callerid " ) ) {
ast_copy_string ( default_callerid , v - > value , sizeof ( default_callerid ) ) ;
} else if ( ! strcasecmp ( v - > name , " mwi_from " ) ) {
ast_copy_string ( default_mwi_from , v - > value , sizeof ( default_mwi_from ) ) ;
} else if ( ! strcasecmp ( v - > name , " fromdomain " ) ) {
char * fromdomainport ;
ast_copy_string ( default_fromdomain , v - > value , sizeof ( default_fromdomain ) ) ;
if ( ( fromdomainport = strchr ( default_fromdomain , ' : ' ) ) ) {
* fromdomainport + + = ' \0 ' ;
if ( ! ( default_fromdomainport = port_str2int ( fromdomainport , 0 ) ) ) {
ast_log ( LOG_NOTICE , " '%s' is not a valid port number for fromdomain. \n " , fromdomainport ) ;
}
} else {
default_fromdomainport = STANDARD_SIP_PORT ;
}
}
} else if ( ! strcasecmp ( v - > name , " outboundproxy " ) ) {
char * tok , * proxyname ;
if ( ast_strlen_zero ( v - > value ) ) {
/* handle tls conf */
ast_log ( LOG_WARNING , " no value given for outbound proxy on line %d of sip.conf. " , v - > lineno ) ;
if ( ! ast_tls_read_conf ( & default_tls_cfg , & sip_tls_desc , v - > name , v - > value ) ) {
continue ;
continue ;
}
}
tok = ast_skip_blanks ( strtok ( ast_strdupa ( v - > value ) , " , " ) ) ;
if ( ! strcasecmp ( v - > name , " context " ) ) {
ast_copy_string ( sip_cfg . default_context , v - > value , sizeof ( sip_cfg . default_context ) ) ;
} else if ( ! strcasecmp ( v - > name , " subscribecontext " ) ) {
ast_copy_string ( sip_cfg . default_subscribecontext , v - > value , sizeof ( sip_cfg . default_subscribecontext ) ) ;
} else if ( ! strcasecmp ( v - > name , " callcounter " ) ) {
global_callcounter = ast_true ( v - > value ) ? 1 : 0 ;
} else if ( ! strcasecmp ( v - > name , " allowguest " ) ) {
sip_cfg . allowguest = ast_true ( v - > value ) ? 1 : 0 ;
} else if ( ! strcasecmp ( v - > name , " realm " ) ) {
ast_copy_string ( sip_cfg . realm , v - > value , sizeof ( sip_cfg . realm ) ) ;
} else if ( ! strcasecmp ( v - > name , " domainsasrealm " ) ) {
sip_cfg . domainsasrealm = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " useragent " ) ) {
ast_copy_string ( global_useragent , v - > value , sizeof ( global_useragent ) ) ;
ast_debug ( 1 , " Setting SIP channel User-Agent Name to %s \n " , global_useragent ) ;
} else if ( ! strcasecmp ( v - > name , " sdpsession " ) ) {
ast_copy_string ( global_sdpsession , v - > value , sizeof ( global_sdpsession ) ) ;
} else if ( ! strcasecmp ( v - > name , " sdpowner " ) ) {
/* Field cannot contain spaces */
if ( ! strstr ( v - > value , " " ) ) {
ast_copy_string ( global_sdpowner , v - > value , sizeof ( global_sdpowner ) ) ;
} else {
ast_log ( LOG_WARNING , " '%s' must not contain spaces at line %d. Using default. \n " , v - > value , v - > lineno ) ;
}
} else if ( ! strcasecmp ( v - > name , " allowtransfer " ) ) {
sip_cfg . allowtransfer = ast_true ( v - > value ) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED ;
} else if ( ! strcasecmp ( v - > name , " rtcachefriends " ) ) {
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_RTCACHEFRIENDS ) ;
} else if ( ! strcasecmp ( v - > name , " rtsavesysname " ) ) {
sip_cfg . rtsave_sysname = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " rtupdate " ) ) {
sip_cfg . peer_rtupdate = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " ignoreregexpire " ) ) {
sip_cfg . ignore_regexpire = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " timert1 " ) ) {
/* Defaults to 500ms, but RFC 3261 states that it is recommended
* for the value to be set higher , though a lower value is only
* allowed on private networks unconnected to the Internet . */
global_t1 = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " timerb " ) ) {
int tmp = atoi ( v - > value ) ;
if ( tmp < 500 ) {
global_timer_b = global_t1 * 64 ;
ast_log ( LOG_WARNING , " Invalid value for timerb ('%s'). Setting to default ('%d'). \n " , v - > value , global_timer_b ) ;
}
timerb_set = 1 ;
} else if ( ! strcasecmp ( v - > name , " t1min " ) ) {
global_t1min = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " transport " ) & & ! ast_strlen_zero ( v - > value ) ) {
char * val = ast_strdupa ( v - > value ) ;
char * trans ;
sip_parse_host ( tok , v - > lineno , & proxyname ,
while ( ( trans = strsep ( & val , " , " ) ) ) {
& sip_cfg . outboundproxy . port ,
trans = ast_skip_blanks ( trans ) ;
& sip_cfg . outboundproxy . transport ) ;
if ( ( tok = strtok ( NULL , " , " ) ) ) {
if ( ! strncasecmp ( trans , " udp " , 3 ) ) {
sip_cfg . outboundproxy . force = ! strncasecmp ( ast_skip_blanks ( tok ) , " force " , 5 ) ;
default_transports | = SIP_TRANSPORT_UDP ;
} else {
} else if ( ! strncasecmp ( trans , " tcp " , 3 ) ) {
sip_cfg . outboundproxy . force = FALSE ;
default_transports | = SIP_TRANSPORT_TCP ;
}
} else if ( ! strncasecmp ( trans , " tls " , 3 ) ) {
default_transports | = SIP_TRANSPORT_TLS ;
} else {
ast_log ( LOG_NOTICE , " '%s' is not a valid transport type. if no other is specified, udp will be used. \n " , trans ) ;
}
if ( default_primary_transport = = 0 ) {
default_primary_transport = default_transports ;
}
}
} else if ( ! strcasecmp ( v - > name , " tcpenable " ) ) {
if ( ! ast_false ( v - > value ) ) {
ast_debug ( 2 , " Enabling TCP socket for listening \n " ) ;
sip_cfg . tcp_enabled = TRUE ;
}
} else if ( ! strcasecmp ( v - > name , " tcpbindaddr " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR ,
& sip_tcp_desc . local_address ) ) {
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
v - > name , v - > value , v - > lineno , config ) ;
}
ast_debug ( 2 , " Setting TCP socket address to %s \n " ,
ast_sockaddr_stringify ( & sip_tcp_desc . local_address ) ) ;
} else if ( ! strcasecmp ( v - > name , " dynamic_exclude_static " ) | | ! strcasecmp ( v - > name , " dynamic_excludes_static " ) ) {
global_dynamic_exclude_static = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " contactpermit " ) | | ! strcasecmp ( v - > name , " contactdeny " ) ) {
int ha_error = 0 ;
sip_cfg . contact_ha = ast_append_ha ( v - > name + 7 , v - > value , sip_cfg . contact_ha , & ha_error ) ;
if ( ha_error ) {
ast_log ( LOG_ERROR , " Bad ACL entry in configuration line %d : %s \n " , v - > lineno , v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " rtautoclear " ) ) {
int i = atoi ( v - > value ) ;
if ( i > 0 ) {
sip_cfg . rtautoclear = i ;
} else {
i = 0 ;
}
ast_set2_flag ( & global_flags [ 1 ] , i | | ast_true ( v - > value ) , SIP_PAGE2_RTAUTOCLEAR ) ;
} else if ( ! strcasecmp ( v - > name , " usereqphone " ) ) {
ast_set2_flag ( & global_flags [ 0 ] , ast_true ( v - > value ) , SIP_USEREQPHONE ) ;
} else if ( ! strcasecmp ( v - > name , " prematuremedia " ) ) {
global_prematuremediafilter = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " relaxdtmf " ) ) {
global_relaxdtmf = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " vmexten " ) ) {
ast_copy_string ( default_vmexten , v - > value , sizeof ( default_vmexten ) ) ;
} else if ( ! strcasecmp ( v - > name , " rtptimeout " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtptimeout ) ! = 1 ) | | ( global_rtptimeout < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP hold time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtptimeout = 0 ;
}
} else if ( ! strcasecmp ( v - > name , " rtpholdtimeout " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtpholdtimeout ) ! = 1 ) | | ( global_rtpholdtimeout < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP hold time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtpholdtimeout = 0 ;
}
} else if ( ! strcasecmp ( v - > name , " rtpkeepalive " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & global_rtpkeepalive ) ! = 1 ) | | ( global_rtpkeepalive < 0 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid RTP keepalive time at line %d. Using default. \n " , v - > value , v - > lineno ) ;
global_rtpkeepalive = DEFAULT_RTPKEEPALIVE ;
}
} else if ( ! strcasecmp ( v - > name , " compactheaders " ) ) {
sip_cfg . compactheaders = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifymimetype " ) ) {
ast_copy_string ( default_notifymime , v - > value , sizeof ( default_notifymime ) ) ;
} else if ( ! strcasecmp ( v - > name , " directrtpsetup " ) ) {
sip_cfg . directrtpsetup = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifyringing " ) ) {
sip_cfg . notifyringing = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifyhold " ) ) {
sip_cfg . notifyhold = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " notifycid " ) ) {
if ( ! strcasecmp ( v - > value , " ignore-context " ) ) {
sip_cfg . notifycid = IGNORE_CONTEXT ;
} else {
sip_cfg . notifycid = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " alwaysauthreject " ) ) {
sip_cfg . alwaysauthreject = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " auth_options_requests " ) ) {
if ( ast_true ( v - > value ) ) {
sip_cfg . auth_options_requests = 1 ;
}
} else if ( ! strcasecmp ( v - > name , " mohinterpret " ) ) {
ast_copy_string ( default_mohinterpret , v - > value , sizeof ( default_mohinterpret ) ) ;
} else if ( ! strcasecmp ( v - > name , " mohsuggest " ) ) {
ast_copy_string ( default_mohsuggest , v - > value , sizeof ( default_mohsuggest ) ) ;
} else if ( ! strcasecmp ( v - > name , " language " ) ) {
ast_copy_string ( default_language , v - > value , sizeof ( default_language ) ) ;
} else if ( ! strcasecmp ( v - > name , " regcontext " ) ) {
ast_copy_string ( newcontexts , v - > value , sizeof ( newcontexts ) ) ;
stringp = newcontexts ;
/* Let's remove any contexts that are no longer defined in regcontext */
cleanup_stale_contexts ( stringp , oldregcontext ) ;
/* Create contexts if they don't exist already */
while ( ( context = strsep ( & stringp , " & " ) ) ) {
ast_copy_string ( used_context , context , sizeof ( used_context ) ) ;
ast_context_find_or_create ( NULL , NULL , context , " SIP " ) ;
}
ast_copy_string ( sip_cfg . regcontext , v - > value , sizeof ( sip_cfg . regcontext ) ) ;
} else if ( ! strcasecmp ( v - > name , " regextenonqualify " ) ) {
sip_cfg . regextenonqualify = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " callerid " ) ) {
ast_copy_string ( default_callerid , v - > value , sizeof ( default_callerid ) ) ;
} else if ( ! strcasecmp ( v - > name , " mwi_from " ) ) {
ast_copy_string ( default_mwi_from , v - > value , sizeof ( default_mwi_from ) ) ;
} else if ( ! strcasecmp ( v - > name , " fromdomain " ) ) {
char * fromdomainport ;
ast_copy_string ( default_fromdomain , v - > value , sizeof ( default_fromdomain ) ) ;
if ( ( fromdomainport = strchr ( default_fromdomain , ' : ' ) ) ) {
* fromdomainport + + = ' \0 ' ;
if ( ! ( default_fromdomainport = port_str2int ( fromdomainport , 0 ) ) ) {
ast_log ( LOG_NOTICE , " '%s' is not a valid port number for fromdomain. \n " , fromdomainport ) ;
}
} else {
default_fromdomainport = STANDARD_SIP_PORT ;
}
} else if ( ! strcasecmp ( v - > name , " outboundproxy " ) ) {
char * tok , * proxyname ;
if ( ast_strlen_zero ( proxyname ) ) {
if ( ast_strlen_zero ( v - > value ) ) {
ast_log ( LOG_WARNING , " you must specify a name for the outboundproxy on line %d of sip.conf. " , v - > lineno ) ;
ast_log ( LOG_WARNING , " no value given for outbound proxy on line %d of sip.conf. " , v - > lineno ) ;
sip_cfg . outboundproxy . name [ 0 ] = ' \0 ' ;
continue ;
continue ;
}
}
ast_copy_string ( sip_cfg . outboundproxy . name , proxyname , sizeof ( sip_cfg . outboundproxy . name ) ) ;
tok = ast_skip_blanks ( strtok ( ast_strdupa ( v - > value ) , " , " ) ) ;
proxy_update ( & sip_cfg . outboundproxy ) ;
sip_parse_host ( tok , v - > lineno , & proxyname ,
} else if ( ! strcasecmp ( v - > name , " autocreatepeer " ) ) {
& sip_cfg . outboundproxy . port ,
sip_cfg . autocreatepeer = ast_true ( v - > value ) ;
& sip_cfg . outboundproxy . transport ) ;
} else if ( ! strcasecmp ( v - > name , " match_auth_username " ) ) {
global_match_auth_username = ast_true ( v - > value ) ;
if ( ( tok = strtok ( NULL , " , " ) ) ) {
} else if ( ! strcasecmp ( v - > name , " srvlookup " ) ) {
sip_cfg . outboundproxy . force = ! strncasecmp ( ast_skip_blanks ( tok ) , " force " , 5 ) ;
sip_cfg . srvlookup = ast_true ( v - > value ) ;
} else {
} else if ( ! strcasecmp ( v - > name , " pedantic " ) ) {
sip_cfg . outboundproxy . force = FALSE ;
sip_cfg . pedanticsipchecking = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " maxexpirey " ) | | ! strcasecmp ( v - > name , " maxexpiry " ) ) {
max_expiry = atoi ( v - > value ) ;
if ( ast_strlen_zero ( proxyname ) ) {
if ( max_expiry < 1 ) {
ast_log ( LOG_WARNING , " you must specify a name for the outboundproxy on line %d of sip.conf. " , v - > lineno ) ;
max_expiry = DEFAULT_MAX_EXPIRY ;
sip_cfg . outboundproxy . name [ 0 ] = ' \0 ' ;
}
continue ;
} else if ( ! strcasecmp ( v - > name , " minexpirey " ) | | ! strcasecmp ( v - > name , " minexpiry " ) ) {
}
min_expiry = atoi ( v - > value ) ;
if ( min_expiry < 1 ) {
ast_copy_string ( sip_cfg . outboundproxy . name , proxyname , sizeof ( sip_cfg . outboundproxy . name ) ) ;
min_expiry = DEFAULT_MIN_EXPIRY ;
}
proxy_update ( & sip_cfg . outboundproxy ) ;
} else if ( ! strcasecmp ( v - > name , " defaultexpiry " ) | | ! strcasecmp ( v - > name , " defaultexpirey " ) ) {
} else if ( ! strcasecmp ( v - > name , " autocreatepeer " ) ) {
default_expiry = atoi ( v - > value ) ;
sip_cfg . autocreatepeer = ast_true ( v - > value ) ;
if ( default_expiry < 1 ) {
} else if ( ! strcasecmp ( v - > name , " match_auth_username " ) ) {
default_expiry = DEFAULT_DEFAULT_EXPIRY ;
global_match_auth_username = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " srvlookup " ) ) {
} else if ( ! strcasecmp ( v - > name , " mwiexpiry " ) | | ! strcasecmp ( v - > name , " mwiexpirey " ) ) {
sip_cfg . srvlookup = ast_true ( v - > value ) ;
mwi_expiry = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " pedantic " ) ) {
if ( mwi_expiry < 1 ) {
sip_cfg . pedanticsipchecking = ast_true ( v - > value ) ;
mwi_expiry = DEFAULT_MWI_EXPIRY ;
} else if ( ! strcasecmp ( v - > name , " maxexpirey " ) | | ! strcasecmp ( v - > name , " maxexpiry " ) ) {
}
max_expiry = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " tcpauthtimeout " ) ) {
if ( max_expiry < 1 ) {
if ( ast_parse_arg ( v - > value , PARSE_INT32 | PARSE_DEFAULT | PARSE_IN_RANGE ,
max_expiry = DEFAULT_MAX_EXPIRY ;
& authtimeout , DEFAULT_AUTHTIMEOUT , 1 , INT_MAX ) ) {
}
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
} else if ( ! strcasecmp ( v - > name , " minexpirey " ) | | ! strcasecmp ( v - > name , " minexpiry " ) ) {
v - > name , v - > value , v - > lineno , config ) ;
min_expiry = atoi ( v - > value ) ;
}
if ( min_expiry < 1 ) {
} else if ( ! strcasecmp ( v - > name , " tcpauthlimit " ) ) {
min_expiry = DEFAULT_MIN_EXPIRY ;
if ( ast_parse_arg ( v - > value , PARSE_INT32 | PARSE_DEFAULT | PARSE_IN_RANGE ,
}
& authlimit , DEFAULT_AUTHLIMIT , 1 , INT_MAX ) ) {
} else if ( ! strcasecmp ( v - > name , " defaultexpiry " ) | | ! strcasecmp ( v - > name , " defaultexpirey " ) ) {
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
default_expiry = atoi ( v - > value ) ;
v - > name , v - > value , v - > lineno , config ) ;
if ( default_expiry < 1 ) {
}
default_expiry = DEFAULT_DEFAULT_EXPIRY ;
} else if ( ! strcasecmp ( v - > name , " sipdebug " ) ) {
}
if ( ast_true ( v - > value ) )
} else if ( ! strcasecmp ( v - > name , " mwiexpiry " ) | | ! strcasecmp ( v - > name , " mwiexpirey " ) ) {
sipdebug | = sip_debug_config ;
mwi_expiry = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " dumphistory " ) ) {
if ( mwi_expiry < 1 ) {
dumphistory = ast_true ( v - > value ) ;
mwi_expiry = DEFAULT_MWI_EXPIRY ;
} else if ( ! strcasecmp ( v - > name , " recordhistory " ) ) {
}
recordhistory = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " tcpauthtimeout " ) ) {
} else if ( ! strcasecmp ( v - > name , " registertimeout " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_INT32 | PARSE_DEFAULT | PARSE_IN_RANGE ,
global_reg_timeout = atoi ( v - > value ) ;
& authtimeout , DEFAULT_AUTHTIMEOUT , 1 , INT_MAX ) ) {
if ( global_reg_timeout < 1 ) {
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT ;
v - > name , v - > value , v - > lineno , config ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " registerattempts " ) ) {
} else if ( ! strcasecmp ( v - > name , " tcpauthlimit " ) ) {
global_regattempts_max = atoi ( v - > value ) ;
if ( ast_parse_arg ( v - > value , PARSE_INT32 | PARSE_DEFAULT | PARSE_IN_RANGE ,
} else if ( ! strcasecmp ( v - > name , " bindaddr " ) | | ! strcasecmp ( v - > name , " udpbindaddr " ) ) {
& authlimit , DEFAULT_AUTHLIMIT , 1 , INT_MAX ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & bindaddr ) ) {
ast_log ( LOG_WARNING , " Invalid %s '%s' at line %d of %s \n " ,
ast_log ( LOG_WARNING , " Invalid address: %s \n " , v - > value ) ;
v - > name , v - > value , v - > lineno , config ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " localnet " ) ) {
} else if ( ! strcasecmp ( v - > name , " sipdebug " ) ) {
struct ast_ha * na ;
if ( ast_true ( v - > value ) )
int ha_error = 0 ;
sipdebug | = sip_debug_config ;
} else if ( ! strcasecmp ( v - > name , " dumphistory " ) ) {
if ( ! ( na = ast_append_ha ( " d " , v - > value , localaddr , & ha_error ) ) ) {
dumphistory = ast_true ( v - > value ) ;
ast_log ( LOG_WARNING , " Invalid localnet value: %s \n " , v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " recordhistory " ) ) {
} else {
recordhistory = ast_true ( v - > value ) ;
localaddr = na ;
} else if ( ! strcasecmp ( v - > name , " registertimeout " ) ) {
}
global_reg_timeout = atoi ( v - > value ) ;
if ( ha_error ) {
if ( global_reg_timeout < 1 ) {
ast_log ( LOG_ERROR , " Bad localnet configuration value line %d : %s \n " , v - > lineno , v - > value ) ;
global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT ;
}
}
} else if ( ! strcasecmp ( v - > name , " media_address " ) ) {
} else if ( ! strcasecmp ( v - > name , " registerattempts " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & media_address ) )
global_regattempts_max = atoi ( v - > value ) ;
ast_log ( LOG_WARNING , " Invalid address for media_address keyword: %s \n " , v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " bindaddr " ) | | ! strcasecmp ( v - > name , " udpbindaddr " ) ) {
} else if ( ! strcasecmp ( v - > name , " externaddr " ) | | ! strcasecmp ( v - > name , " externip " ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & bindaddr ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & externaddr ) ) {
ast_log ( LOG_WARNING , " Invalid address: %s \n " , v - > value ) ;
ast_log ( LOG_WARNING ,
}
" Invalid address for externaddr keyword: %s \n " ,
} else if ( ! strcasecmp ( v - > name , " localnet " ) ) {
v - > value ) ;
struct ast_ha * na ;
}
int ha_error = 0 ;
externexpire = 0 ;
} else if ( ! strcasecmp ( v - > name , " externhost " ) ) {
if ( ! ( na = ast_append_ha ( " d " , v - > value , localaddr , & ha_error ) ) ) {
ast_copy_string ( externhost , v - > value , sizeof ( externhost ) ) ;
ast_log ( LOG_WARNING , " Invalid localnet value: %s \n " , v - > value ) ;
if ( ast_sockaddr_resolve_first ( & externaddr , externhost , 0 ) ) {
} else {
ast_log ( LOG_WARNING , " Invalid address for externhost keyword: %s \n " , externhost ) ;
localaddr = na ;
}
}
externexpire = time ( NULL ) ;
if ( ha_error ) {
} else if ( ! strcasecmp ( v - > name , " externrefresh " ) ) {
ast_log ( LOG_ERROR , " Bad localnet configuration value line %d : %s \n " , v - > lineno , v - > value ) ;
if ( sscanf ( v - > value , " %30d " , & externrefresh ) ! = 1 ) {
}
ast_log ( LOG_WARNING , " Invalid externrefresh value '%s', must be an integer >0 at line %d \n " , v - > value , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " media_address " ) ) {
externrefresh = 10 ;
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & media_address ) )
}
ast_log ( LOG_WARNING , " Invalid address for media_address keyword: %s \n " , v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " externtcpport " ) ) {
} else if ( ! strcasecmp ( v - > name , " externaddr " ) | | ! strcasecmp ( v - > name , " externip " ) ) {
if ( ! ( externtcpport = port_str2int ( v - > value , 0 ) ) ) {
if ( ast_parse_arg ( v - > value , PARSE_ADDR , & externaddr ) ) {
ast_log ( LOG_WARNING , " Invalid externtcpport value, must be a positive integer between 1 and 65535 at line %d \n " , v - > lineno ) ;
ast_log ( LOG_WARNING ,
externtcpport = 0 ;
" Invalid address for externaddr keyword: %s \n " ,
}
v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " externtlsport " ) ) {
}
if ( ! ( externtlsport = port_str2int ( v - > value , STANDARD_TLS_PORT ) ) ) {
externexpire = 0 ;
ast_log ( LOG_WARNING , " Invalid externtlsport value, must be a positive integer between 1 and 65535 at line %d \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " externhost " ) ) {
}
ast_copy_string ( externhost , v - > value , sizeof ( externhost ) ) ;
} else if ( ! strcasecmp ( v - > name , " allow " ) ) {
if ( ast_sockaddr_resolve_first ( & externaddr , externhost , 0 ) ) {
int error = ast_parse_allow_disallow ( & default_prefs , sip_cfg . caps , v - > value , TRUE ) ;
ast_log ( LOG_WARNING , " Invalid address for externhost keyword: %s \n " , externhost ) ;
if ( error ) {
}
ast_log ( LOG_WARNING , " Codec configuration errors found in line %d : %s = %s \n " , v - > lineno , v - > name , v - > value ) ;
externexpire = time ( NULL ) ;
}
} else if ( ! strcasecmp ( v - > name , " externrefresh " ) ) {
} else if ( ! strcasecmp ( v - > name , " disallow " ) ) {
if ( sscanf ( v - > value , " %30d " , & externrefresh ) ! = 1 ) {
int error = ast_parse_allow_disallow ( & default_prefs , sip_cfg . caps , v - > value , FALSE ) ;
ast_log ( LOG_WARNING , " Invalid externrefresh value '%s', must be an integer >0 at line %d \n " , v - > value , v - > lineno ) ;
if ( error ) {
externrefresh = 10 ;
ast_log ( LOG_WARNING , " Codec configuration errors found in line %d : %s = %s \n " , v - > lineno , v - > name , v - > value ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " externtcpport " ) ) {
} else if ( ! strcasecmp ( v - > name , " preferred_codec_only " ) ) {
if ( ! ( externtcpport = port_str2int ( v - > value , 0 ) ) ) {
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_PREFERRED_CODEC ) ;
ast_log ( LOG_WARNING , " Invalid externtcpport value, must be a positive integer between 1 and 65535 at line %d \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " autoframing " ) ) {
externtcpport = 0 ;
global_autoframing = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " allowexternaldomains " ) ) {
} else if ( ! strcasecmp ( v - > name , " externtlsport " ) ) {
sip_cfg . allow_external_domains = ast_true ( v - > value ) ;
if ( ! ( externtlsport = port_str2int ( v - > value , STANDARD_TLS_PORT ) ) ) {
} else if ( ! strcasecmp ( v - > name , " autodomain " ) ) {
ast_log ( LOG_WARNING , " Invalid externtlsport value, must be a positive integer between 1 and 65535 at line %d \n " , v - > lineno ) ;
auto_sip_domains = ast_true ( v - > value ) ;
}
} else if ( ! strcasecmp ( v - > name , " domain " ) ) {
} else if ( ! strcasecmp ( v - > name , " allow " ) ) {
char * domain = ast_strdupa ( v - > value ) ;
int error = ast_parse_allow_disallow ( & default_prefs , sip_cfg . caps , v - > value , TRUE ) ;
char * cntx = strchr ( domain , ' , ' ) ;
if ( error ) {
ast_log ( LOG_WARNING , " Codec configuration errors found in line %d : %s = %s \n " , v - > lineno , v - > name , v - > value ) ;
if ( cntx ) {
}
* cntx + + = ' \0 ' ;
} else if ( ! strcasecmp ( v - > name , " disallow " ) ) {
}
int error = ast_parse_allow_disallow ( & default_prefs , sip_cfg . caps , v - > value , FALSE ) ;
if ( error ) {
if ( ast_strlen_zero ( cntx ) ) {
ast_log ( LOG_WARNING , " Codec configuration errors found in line %d : %s = %s \n " , v - > lineno , v - > name , v - > value ) ;
ast_debug ( 1 , " No context specified at line %d for domain '%s' \n " , v - > lineno , domain ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " preferred_codec_only " ) ) {
if ( ast_strlen_zero ( domain ) ) {
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_PREFERRED_CODEC ) ;
ast_log ( LOG_WARNING , " Empty domain specified at line %d \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " autoframing " ) ) {
} else {
global_autoframing = ast_true ( v - > value ) ;
add_sip_domain ( ast_strip ( domain ) , SIP_DOMAIN_CONFIG , cntx ? ast_strip ( cntx ) : " " ) ;
} else if ( ! strcasecmp ( v - > name , " allowexternaldomains " ) ) {
}
sip_cfg . allow_external_domains = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " register " ) ) {
} else if ( ! strcasecmp ( v - > name , " autodomain " ) ) {
if ( sip_register ( v - > value , v - > lineno ) = = 0 ) {
auto_sip_domains = ast_true ( v - > value ) ;
registry_count + + ;
} else if ( ! strcasecmp ( v - > name , " domain " ) ) {
}
char * domain = ast_strdupa ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " mwi " ) ) {
char * cntx = strchr ( domain , ' , ' ) ;
sip_subscribe_mwi ( v - > value , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos_sip " ) ) {
if ( cntx ) {
if ( ast_str2tos ( v - > value , & global_tos_sip ) ) {
* cntx + + = ' \0 ' ;
ast_log ( LOG_WARNING , " Invalid tos_sip value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " tos_audio " ) ) {
if ( ast_strlen_zero ( cntx ) ) {
if ( ast_str2tos ( v - > value , & global_tos_audio ) ) {
ast_debug ( 1 , " No context specified at line %d for domain '%s' \n " , v - > lineno , domain ) ;
ast_log ( LOG_WARNING , " Invalid tos_audio value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
}
}
if ( ast_strlen_zero ( domain ) ) {
} else if ( ! strcasecmp ( v - > name , " tos_video " ) ) {
ast_log ( LOG_WARNING , " Empty domain specified at line %d \n " , v - > lineno ) ;
if ( ast_str2tos ( v - > value , & global_tos_video ) ) {
} else {
ast_log ( LOG_WARNING , " Invalid tos_video value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
add_sip_domain ( ast_strip ( domain ) , SIP_DOMAIN_CONFIG , cntx ? ast_strip ( cntx ) : " " ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " tos_text " ) ) {
} else if ( ! strcasecmp ( v - > name , " register " ) ) {
if ( ast_str2tos ( v - > value , & global_tos_text ) ) {
if ( sip_register ( v - > value , v - > lineno ) = = 0 ) {
ast_log ( LOG_WARNING , " Invalid tos_text value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
registry_count + + ;
}
}
} else if ( ! strcasecmp ( v - > name , " cos_sip " ) ) {
} else if ( ! strcasecmp ( v - > name , " mwi " ) ) {
if ( ast_str2cos ( v - > value , & global_cos_sip ) ) {
sip_subscribe_mwi ( v - > value , v - > lineno ) ;
ast_log ( LOG_WARNING , " Invalid cos_sip value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos_sip " ) ) {
}
if ( ast_str2tos ( v - > value , & global_tos_sip ) ) {
} else if ( ! strcasecmp ( v - > name , " cos_audio " ) ) {
ast_log ( LOG_WARNING , " Invalid tos_sip value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
if ( ast_str2cos ( v - > value , & global_cos_audio ) ) {
}
ast_log ( LOG_WARNING , " Invalid cos_audio value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos_audio " ) ) {
}
if ( ast_str2tos ( v - > value , & global_tos_audio ) ) {
} else if ( ! strcasecmp ( v - > name , " cos_video " ) ) {
ast_log ( LOG_WARNING , " Invalid tos_audio value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
if ( ast_str2cos ( v - > value , & global_cos_video ) ) {
}
ast_log ( LOG_WARNING , " Invalid cos_video value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos_video " ) ) {
}
if ( ast_str2tos ( v - > value , & global_tos_video ) ) {
} else if ( ! strcasecmp ( v - > name , " cos_text " ) ) {
ast_log ( LOG_WARNING , " Invalid tos_video value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
if ( ast_str2cos ( v - > value , & global_cos_text ) ) {
}
ast_log ( LOG_WARNING , " Invalid cos_text value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " tos_text " ) ) {
}
if ( ast_str2tos ( v - > value , & global_tos_text ) ) {
} else if ( ! strcasecmp ( v - > name , " bindport " ) ) {
ast_log ( LOG_WARNING , " Invalid tos_text value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
if ( sscanf ( v - > value , " %5d " , & bindport ) ! = 1 ) {
}
ast_log ( LOG_WARNING , " Invalid port number '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else if ( ! strcasecmp ( v - > name , " cos_sip " ) ) {
}
if ( ast_str2cos ( v - > value , & global_cos_sip ) ) {
} else if ( ! strcasecmp ( v - > name , " qualify " ) ) {
ast_log ( LOG_WARNING , " Invalid cos_sip value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
if ( ! strcasecmp ( v - > value , " no " ) ) {
}
default_qualify = 0 ;
} else if ( ! strcasecmp ( v - > name , " cos_audio " ) ) {
} else if ( ! strcasecmp ( v - > value , " yes " ) ) {
if ( ast_str2cos ( v - > value , & global_cos_audio ) ) {
default_qualify = DEFAULT_MAXMS ;
ast_log ( LOG_WARNING , " Invalid cos_audio value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( sscanf ( v - > value , " %30d " , & default_qualify ) ! = 1 ) {
}
ast_log ( LOG_WARNING , " Qualification default should be 'yes', 'no', or a number of milliseconds at line %d of sip.conf \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " cos_video " ) ) {
default_qualify = 0 ;
if ( ast_str2cos ( v - > value , & global_cos_video ) ) {
}
ast_log ( LOG_WARNING , " Invalid cos_video value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else if ( ! strcasecmp ( v - > name , " qualifyfreq " ) ) {
}
int i ;
} else if ( ! strcasecmp ( v - > name , " cos_text " ) ) {
if ( sscanf ( v - > value , " %30d " , & i ) = = 1 ) {
if ( ast_str2cos ( v - > value , & global_cos_text ) ) {
global_qualifyfreq = i * 1000 ;
ast_log ( LOG_WARNING , " Invalid cos_text value at line %d, refer to QoS documentation \n " , v - > lineno ) ;
} else {
}
ast_log ( LOG_WARNING , " Invalid qualifyfreq number '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else if ( ! strcasecmp ( v - > name , " bindport " ) ) {
global_qualifyfreq = DEFAULT_QUALIFYFREQ ;
if ( sscanf ( v - > value , " %5d " , & bindport ) ! = 1 ) {
}
ast_log ( LOG_WARNING , " Invalid port number '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else if ( ! strcasecmp ( v - > name , " callevents " ) ) {
}
sip_cfg . callevents = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " qualify " ) ) {
} else if ( ! strcasecmp ( v - > name , " authfailureevents " ) ) {
if ( ! strcasecmp ( v - > value , " no " ) ) {
global_authfailureevents = ast_true ( v - > value ) ;
default_qualify = 0 ;
} else if ( ! strcasecmp ( v - > name , " maxcallbitrate " ) ) {
} else if ( ! strcasecmp ( v - > value , " yes " ) ) {
default_maxcallbitrate = atoi ( v - > value ) ;
default_qualify = DEFAULT_MAXMS ;
if ( default_maxcallbitrate < 0 ) {
} else if ( sscanf ( v - > value , " %30d " , & default_qualify ) ! = 1 ) {
default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE ;
ast_log ( LOG_WARNING , " Qualification default should be 'yes', 'no', or a number of milliseconds at line %d of sip.conf \n " , v - > lineno ) ;
}
default_qualify = 0 ;
} else if ( ! strcasecmp ( v - > name , " matchexternaddrlocally " ) | | ! strcasecmp ( v - > name , " matchexterniplocally " ) ) {
}
sip_cfg . matchexternaddrlocally = ast_true ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " qualifyfreq " ) ) {
} else if ( ! strcasecmp ( v - > name , " session-timers " ) ) {
int i ;
int i = ( int ) str2stmode ( v - > value ) ;
if ( sscanf ( v - > value , " %30d " , & i ) = = 1 ) {
if ( i < 0 ) {
global_qualifyfreq = i * 1000 ;
ast_log ( LOG_WARNING , " Invalid session-timers '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else {
global_st_mode = SESSION_TIMER_MODE_ACCEPT ;
ast_log ( LOG_WARNING , " Invalid qualifyfreq number '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else {
global_qualifyfreq = DEFAULT_QUALIFYFREQ ;
global_st_mode = i ;
}
}
} else if ( ! strcasecmp ( v - > name , " callevents " ) ) {
} else if ( ! strcasecmp ( v - > name , " session-expires " ) ) {
sip_cfg . callevents = ast_true ( v - > value ) ;
if ( sscanf ( v - > value , " %30d " , & global_max_se ) ! = 1 ) {
} else if ( ! strcasecmp ( v - > name , " authfailureevents " ) ) {
ast_log ( LOG_WARNING , " Invalid session-expires '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
global_authfailureevents = ast_true ( v - > value ) ;
global_max_se = DEFAULT_MAX_SE ;
} else if ( ! strcasecmp ( v - > name , " maxcallbitrate " ) ) {
}
default_maxcallbitrate = atoi ( v - > value ) ;
} else if ( ! strcasecmp ( v - > name , " session-minse " ) ) {
if ( default_maxcallbitrate < 0 ) {
if ( sscanf ( v - > value , " %30d " , & global_min_se ) ! = 1 ) {
default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE ;
ast_log ( LOG_WARNING , " Invalid session-minse '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
}
global_min_se = DEFAULT_MIN_SE ;
} else if ( ! strcasecmp ( v - > name , " matchexternaddrlocally " ) | | ! strcasecmp ( v - > name , " matchexterniplocally " ) ) {
}
sip_cfg . matchexternaddrlocally = ast_true ( v - > value ) ;
if ( global_min_se < 90 ) {
} else if ( ! strcasecmp ( v - > name , " session-timers " ) ) {
ast_log ( LOG_WARNING , " session-minse '%s' at line %d of %s is not allowed to be < 90 secs \n " , v - > value , v - > lineno , config ) ;
int i = ( int ) str2stmode ( v - > value ) ;
global_min_se = DEFAULT_MIN_SE ;
if ( i < 0 ) {
}
ast_log ( LOG_WARNING , " Invalid session-timers '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else if ( ! strcasecmp ( v - > name , " session-refresher " ) ) {
global_st_mode = SESSION_TIMER_MODE_ACCEPT ;
int i = ( int ) str2strefresher ( v - > value ) ;
} else {
if ( i < 0 ) {
global_st_mode = i ;
ast_log ( LOG_WARNING , " Invalid session-refresher '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
}
global_st_refresher = SESSION_TIMER_REFRESHER_UAS ;
} else if ( ! strcasecmp ( v - > name , " session-expires " ) ) {
} else {
if ( sscanf ( v - > value , " %30d " , & global_max_se ) ! = 1 ) {
global_st_refresher = i ;
ast_log ( LOG_WARNING , " Invalid session-expires '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
}
global_max_se = DEFAULT_MAX_SE ;
} else if ( ! strcasecmp ( v - > name , " qualifygap " ) ) {
}
if ( sscanf ( v - > value , " %30d " , & global_qualify_gap ) ! = 1 ) {
} else if ( ! strcasecmp ( v - > name , " session-minse " ) ) {
ast_log ( LOG_WARNING , " Invalid qualifygap '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
if ( sscanf ( v - > value , " %30d " , & global_min_se ) ! = 1 ) {
global_qualify_gap = DEFAULT_QUALIFY_GAP ;
ast_log ( LOG_WARNING , " Invalid session-minse '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
}
global_min_se = DEFAULT_MIN_SE ;
} else if ( ! strcasecmp ( v - > name , " qualifypeers " ) ) {
}
if ( sscanf ( v - > value , " %30d " , & global_qualify_peers ) ! = 1 ) {
if ( global_min_se < 90 ) {
ast_log ( LOG_WARNING , " Invalid pokepeers '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
ast_log ( LOG_WARNING , " session-minse '%s' at line %d of %s is not allowed to be < 90 secs \n " , v - > value , v - > lineno , config ) ;
global_qualify_peers = DEFAULT_QUALIFY_PEERS ;
global_min_se = DEFAULT_MIN_SE ;
}
}
} else if ( ! strcasecmp ( v - > name , " disallowed_methods " ) ) {
} else if ( ! strcasecmp ( v - > name , " session-refresher " ) ) {
char * disallow = ast_strdupa ( v - > value ) ;
int i = ( int ) str2strefresher ( v - > value ) ;
mark_parsed_methods ( & sip_cfg . disallowed_methods , disallow ) ;
if ( i < 0 ) {
} else if ( ! strcasecmp ( v - > name , " shrinkcallerid " ) ) {
ast_log ( LOG_WARNING , " Invalid session-refresher '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
if ( ast_true ( v - > value ) ) {
global_st_refresher = SESSION_TIMER_REFRESHER_UAS ;
global_shrinkcallerid = 1 ;
} else {
} else if ( ast_false ( v - > value ) ) {
global_st_refresher = i ;
global_shrinkcallerid = 0 ;
}
} else {
} else if ( ! strcasecmp ( v - > name , " qualifygap " ) ) {
ast_log ( LOG_WARNING , " shrinkcallerid value %s is not valid at line %d. \n " , v - > value , v - > lineno ) ;
if ( sscanf ( v - > value , " %30d " , & global_qualify_gap ) ! = 1 ) {
}
ast_log ( LOG_WARNING , " Invalid qualifygap '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
} else if ( ! strcasecmp ( v - > name , " use_q850_reason " ) ) {
global_qualify_gap = DEFAULT_QUALIFY_GAP ;
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_Q850_REASON ) ;
}
} else if ( ! strcasecmp ( v - > name , " maxforwards " ) ) {
} else if ( ! strcasecmp ( v - > name , " qualifypeers " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & sip_cfg . default_max_forwards ) ! = 1 ) | | ( sip_cfg . default_max_forwards < 1 ) ) {
if ( sscanf ( v - > value , " %30d " , & global_qualify_peers ) ! = 1 ) {
ast_log ( LOG_WARNING , " '%s' is not a valid maxforwards value at line %d. Using default. \n " , v - > value , v - > lineno ) ;
ast_log ( LOG_WARNING , " Invalid pokepeers '%s' at line %d of %s \n " , v - > value , v - > lineno , config ) ;
sip_cfg . default_max_forwards = DEFAULT_MAX_FORWARDS ;
global_qualify_peers = DEFAULT_QUALIFY_PEERS ;
}
}
} else if ( ! strcasecmp ( v - > name , " subscribe_network_change_event " ) ) {
} else if ( ! strcasecmp ( v - > name , " disallowed_methods " ) ) {
if ( ast_true ( v - > value ) ) {
char * disallow = ast_strdupa ( v - > value ) ;
subscribe_network_change = 1 ;
mark_parsed_methods ( & sip_cfg . disallowed_methods , disallow ) ;
} else if ( ast_false ( v - > value ) ) {
} else if ( ! strcasecmp ( v - > name , " shrinkcallerid " ) ) {
subscribe_network_change = 0 ;
if ( ast_true ( v - > value ) ) {
} else {
global_shrinkcallerid = 1 ;
ast_log ( LOG_WARNING , " subscribe_network_change_event value %s is not valid at line %d. \n " , v - > value , v - > lineno ) ;
} else if ( ast_false ( v - > value ) ) {
global_shrinkcallerid = 0 ;
} else {
ast_log ( LOG_WARNING , " shrinkcallerid value %s is not valid at line %d. \n " , v - > value , v - > lineno ) ;
}
} else if ( ! strcasecmp ( v - > name , " use_q850_reason " ) ) {
ast_set2_flag ( & global_flags [ 1 ] , ast_true ( v - > value ) , SIP_PAGE2_Q850_REASON ) ;
} else if ( ! strcasecmp ( v - > name , " maxforwards " ) ) {
if ( ( sscanf ( v - > value , " %30d " , & sip_cfg . default_max_forwards ) ! = 1 ) | | ( sip_cfg . default_max_forwards < 1 ) ) {
ast_log ( LOG_WARNING , " '%s' is not a valid maxforwards value at line %d. Using default. \n " , v - > value , v - > lineno ) ;
sip_cfg . default_max_forwards = DEFAULT_MAX_FORWARDS ;
}
} else if ( ! strcasecmp ( v - > name , " subscribe_network_change_event " ) ) {
if ( ast_true ( v - > value ) ) {
subscribe_network_change = 1 ;
} else if ( ast_false ( v - > value ) ) {
subscribe_network_change = 0 ;
} else {
ast_log ( LOG_WARNING , " subscribe_network_change_event value %s is not valid at line %d. \n " , v - > value , v - > lineno ) ;
}
} else if ( ! strcasecmp ( v - > name , " snom_aoc_enabled " ) ) {
ast_set2_flag ( & global_flags [ 2 ] , ast_true ( v - > value ) , SIP_PAGE3_SNOM_AOC ) ;
} else if ( ! strcasecmp ( v - > name , " parkinglot " ) ) {
ast_copy_string ( default_parkinglot , v - > value , sizeof ( default_parkinglot ) ) ;
}
}
} else if ( ! strcasecmp ( v - > name , " snom_aoc_enabled " ) ) {
ast_set2_flag ( & global_flags [ 2 ] , ast_true ( v - > value ) , SIP_PAGE3_SNOM_AOC ) ;
} else if ( ! strcasecmp ( v - > name , " parkinglot " ) ) {
ast_copy_string ( default_parkinglot , v - > value , sizeof ( default_parkinglot ) ) ;
}
}
}
} /* for (...ast_category_browse(cfg, "general")...) */
if ( subscribe_network_change ) {
if ( subscribe_network_change ) {
network_change_event_subscribe ( ) ;
network_change_event_subscribe ( ) ;