Reverts rev 316218 as it breaks parsing the [general] section of sip.conf.

The functionality this patch attempts to achieve should already
be possible using [general](+) in the config file.

issue #17957



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@316798 65c4cc65-6c06-0410-ace0-fbb531ad65f3
10-digiumphones
David Vossel 15 years ago
parent 51fc64d13a
commit 1f96380da5

@ -108,11 +108,6 @@ FollowMe
compatability for a FollowMe call with certain dialplan apps, options, and compatability for a FollowMe call with certain dialplan apps, options, and
functions. functions.
SIP Changes
-----------
* Multiple [general] contexts are now permitted within sip.conf. They will be
merged at load time.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.6.2 to Asterisk 1.8 ---------------- --- Functionality changes from Asterisk 1.6.2 to Asterisk 1.8 ----------------
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

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

Loading…
Cancel
Save