[svn-commits] russell: branch russell/messaging r316706 - in /team/russell/messaging: ./ ad...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed May 4 10:28:34 CDT 2011


Author: russell
Date: Wed May  4 10:28:27 2011
New Revision: 316706

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=316706
Log:
resolve, reset automerge

Modified:
    team/russell/messaging/   (props changed)
    team/russell/messaging/CHANGES
    team/russell/messaging/addons/cdr_mysql.c
    team/russell/messaging/addons/res_config_mysql.c
    team/russell/messaging/apps/app_chanspy.c
    team/russell/messaging/apps/app_meetme.c
    team/russell/messaging/autoconf/ast_check_pwlib.m4
    team/russell/messaging/channels/chan_sip.c
    team/russell/messaging/channels/chan_skinny.c
    team/russell/messaging/configure
    team/russell/messaging/main/manager.c

Propchange: team/russell/messaging/
------------------------------------------------------------------------------
    automerge = *

Propchange: team/russell/messaging/
------------------------------------------------------------------------------
--- automerge-email (original)
+++ automerge-email Wed May  4 10:28:27 2011
@@ -1,1 +1,1 @@
-russell at digium.com
+russell at digium.com,twilson at digium.com

Propchange: team/russell/messaging/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Propchange: team/russell/messaging/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed May  4 10:28:27 2011
@@ -1,1 +1,1 @@
-/trunk:1-316421
+/trunk:1-316664

Modified: team/russell/messaging/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/CHANGES?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/CHANGES (original)
+++ team/russell/messaging/CHANGES Wed May  4 10:28:27 2011
@@ -120,6 +120,11 @@
    channels involved with the FollowMe thread.  Use this option to improve
    compatability for a FollowMe call with certain dialplan apps, options, and
    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 ----------------

Modified: team/russell/messaging/addons/cdr_mysql.c
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/addons/cdr_mysql.c?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/addons/cdr_mysql.c (original)
+++ team/russell/messaging/addons/cdr_mysql.c Wed May  4 10:28:27 2011
@@ -325,7 +325,7 @@
 				ast_str_make_space(&escape, (valsz = strlen(value)) * 2 + 1);
 				mysql_real_escape_string(&mysql, ast_str_buffer(escape), value, valsz);
 
-				ast_str_append(&sql1, 0, "%s", entry->name);
+				ast_str_append(&sql1, 0, "`%s`", entry->name);
 				ast_str_append(&sql2, 0, "'%s'", ast_str_buffer(escape));
 			}
 		}

Modified: team/russell/messaging/addons/res_config_mysql.c
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/addons/res_config_mysql.c?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/addons/res_config_mysql.c (original)
+++ team/russell/messaging/addons/res_config_mysql.c Wed May  4 10:28:27 2011
@@ -608,7 +608,7 @@
 	   If there is only 1 set, then we have our query. Otherwise, loop thru the list and concat */
 
 	ESCAPE_STRING(buf, newval);
-	ast_str_set(&sql, 0, "UPDATE %s SET %s = '%s'", tablename, newparam, ast_str_buffer(buf));
+	ast_str_set(&sql, 0, "UPDATE %s SET `%s` = '%s'", tablename, newparam, ast_str_buffer(buf));
 
 	/* If the column length isn't long enough, give a chance to lengthen it. */
 	if (strncmp(column->type, "char", 4) == 0 || strncmp(column->type, "varchar", 7) == 0) {
@@ -625,7 +625,7 @@
 		}
 
 		ESCAPE_STRING(buf, newval);
-		ast_str_append(&sql, 0, ", %s = '%s'", newparam, ast_str_buffer(buf));
+		ast_str_append(&sql, 0, ", `%s` = '%s'", newparam, ast_str_buffer(buf));
 
 		/* If the column length isn't long enough, give a chance to lengthen it. */
 		if (strncmp(column->type, "char", 4) == 0 || strncmp(column->type, "varchar", 7) == 0) {
@@ -635,7 +635,7 @@
 	va_end(ap);
 
 	ESCAPE_STRING(buf, lookup);
-	ast_str_append(&sql, 0, " WHERE %s = '%s'", keyfield, ast_str_buffer(buf));
+	ast_str_append(&sql, 0, " WHERE `%s` = '%s'", keyfield, ast_str_buffer(buf));
 
 	ast_debug(1, "MySQL RealTime: Update SQL: %s\n", ast_str_buffer(sql));
 
@@ -719,7 +719,7 @@
 			return -1;
 		}
 		ESCAPE_STRING(buf, newval);
-		ast_str_append(&where, 0, "%s %s='%s'", first ? "" : " AND", newparam, ast_str_buffer(buf));
+		ast_str_append(&where, 0, "%s `%s` = '%s'", first ? "" : " AND", newparam, ast_str_buffer(buf));
 		first = 0;
 
 		/* If the column length isn't long enough, give a chance to lengthen it. */
@@ -744,7 +744,7 @@
 		}
 
 		ESCAPE_STRING(buf, newval);
-		ast_str_append(&sql, 0, "%s %s = '%s'", first ? "" : ",", newparam, ast_str_buffer(buf));
+		ast_str_append(&sql, 0, "%s `%s` = '%s'", first ? "" : ",", newparam, ast_str_buffer(buf));
 		first = 0;
 
 		/* If the column length isn't long enough, give a chance to lengthen it. */
@@ -816,7 +816,7 @@
 	/* Create the first part of the query using the first parameter/value pairs we just extracted
 		If there is only 1 set, then we have our query. Otherwise, loop thru the list and concat */
 	ESCAPE_STRING(buf, newval);
-	ast_str_set(&sql, 0, "INSERT INTO %s (%s", table, newparam);
+	ast_str_set(&sql, 0, "INSERT INTO %s (`%s`", table, newparam);
 	ast_str_set(&sql2, 0, ") VALUES ('%s'", ast_str_buffer(buf));
 
 	internal_require(database, table, newparam, RQ_CHAR, ast_str_strlen(buf), SENTINEL);
@@ -828,7 +828,7 @@
 			ast_str_reset(buf);
 		}
 		if (internal_require(database, table, newparam, RQ_CHAR, ast_str_strlen(buf), SENTINEL) == 0) {
-			ast_str_append(&sql, 0, ", %s", newparam);
+			ast_str_append(&sql, 0, ", `%s`", newparam);
 			ast_str_append(&sql2, 0, ", '%s'", ast_str_buffer(buf));
 		}
 	}
@@ -894,11 +894,11 @@
 	/* Create the first part of the query using the first parameter/value pairs we just extracted
 	   If there is only 1 set, then we have our query. Otherwise, loop thru the list and concat */
 	ESCAPE_STRING(buf, lookup);
-	ast_str_set(&sql, 0, "DELETE FROM %s WHERE %s = '%s'", table, keyfield, ast_str_buffer(buf));
+	ast_str_set(&sql, 0, "DELETE FROM %s WHERE `%s` = '%s'", table, keyfield, ast_str_buffer(buf));
 	while ((newparam = va_arg(ap, const char *))) {
 		newval = va_arg(ap, const char *);
 		ESCAPE_STRING(buf, newval);
-		ast_str_append(&sql, 0, " AND %s = '%s'", newparam, ast_str_buffer(buf));
+		ast_str_append(&sql, 0, " AND `%s` = '%s'", newparam, ast_str_buffer(buf));
 	}
 	va_end(ap);
 
@@ -1074,7 +1074,7 @@
 			res = -1;
 			break;
 		}
-		ast_str_set(&sql, 0, "ALTER TABLE %s MODIFY %s %s", tablename, column->name, ast_str_buffer(typestr));
+		ast_str_set(&sql, 0, "ALTER TABLE %s MODIFY `%s` %s", tablename, column->name, ast_str_buffer(typestr));
 		if (!column->null) {
 			ast_str_append(&sql, 0, " NOT NULL");
 		}

Modified: team/russell/messaging/apps/app_chanspy.c
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/apps/app_chanspy.c?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/apps/app_chanspy.c (original)
+++ team/russell/messaging/apps/app_chanspy.c Wed May  4 10:28:27 2011
@@ -404,6 +404,7 @@
 	struct ast_audiohook bridge_whisper_audiohook;
 	int fd;
 	int volfactor;
+	struct ast_flags flags;
 };
 
 struct spy_dtmf_options {
@@ -438,7 +439,7 @@
 		return -1;
 	}
 
-	if (ast_test_flag(&csth->spy_audiohook, OPTION_READONLY)) {
+	if (ast_test_flag(&csth->flags, OPTION_READONLY)) {
 		/* Option 'o' was set, so don't mix channel audio */
 		f = ast_audiohook_read_frame(&csth->spy_audiohook, samples, AST_AUDIOHOOK_DIRECTION_READ, &format_slin);
 	} else {
@@ -539,7 +540,7 @@
 			spyer_name, name);
 
 	memset(&csth, 0, sizeof(csth));
-	ast_copy_flags(&csth.spy_audiohook, flags, AST_FLAGS_ALL);
+	ast_copy_flags(&csth.flags, flags, AST_FLAGS_ALL);
 
 	ast_audiohook_init(&csth.spy_audiohook, AST_AUDIOHOOK_TYPE_SPY, "ChanSpy", 0);
 

Modified: team/russell/messaging/apps/app_meetme.c
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/apps/app_meetme.c?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/apps/app_meetme.c (original)
+++ team/russell/messaging/apps/app_meetme.c Wed May  4 10:28:27 2011
@@ -2918,6 +2918,11 @@
  						res = ast_streamfile(chan, user->end_sound, chan->language);
  						res = ast_waitstream(chan, "");
  					}
+					if (ast_test_flag64(confflags, CONFFLAG_KICK_CONTINUE)) {
+						ret = 0;
+					} else {
+						ret = -1;
+					}
  					break;
  				}
  				

Modified: team/russell/messaging/autoconf/ast_check_pwlib.m4
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/autoconf/ast_check_pwlib.m4?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/autoconf/ast_check_pwlib.m4 (original)
+++ team/russell/messaging/autoconf/ast_check_pwlib.m4 Wed May  4 10:28:27 2011
@@ -205,9 +205,9 @@
 		$2_VER=$((${$2_MAJOR_VERSION}*10000+${$2_MINOR_VERSION}*100+${$2_BUILD_NUMBER}))
 		$2_REQ=$(($4*10000+$5*100+$6))
 		if test "x$10" = "x"; then
-			let $2_MAX=9999999
+			$2_MAX=9999999
 		else
-			let $2_MAX=$8*10000+$9*100+$10
+			$2_MAX=$(($8*10000+$9*100+$10))
 		fi
 
 		AC_MSG_CHECKING(if $1 version ${$2_VERSION} is compatible with chan_h323)

Modified: team/russell/messaging/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/russell/messaging/channels/chan_sip.c?view=diff&rev=316706&r1=316705&r2=316706
==============================================================================
--- team/russell/messaging/channels/chan_sip.c (original)
+++ team/russell/messaging/channels/chan_sip.c Wed May  4 10:28:27 2011
@@ -1568,7 +1568,7 @@
 static int parse_minse(const char *p_hdrval, int *const p_interval);
 static int st_get_se(struct sip_pvt *, int max);
 static enum st_refresher st_get_refresher(struct sip_pvt *);
-static enum st_mode st_get_mode(struct sip_pvt *);
+static enum st_mode st_get_mode(struct sip_pvt *, int no_cached);
 static struct sip_st_dlg* sip_st_alloc(struct sip_pvt *const p);
 
 /*------- RTP Glue functions -------- */
@@ -9554,7 +9554,7 @@
 static int add_supported_header(struct sip_pvt *pvt, struct sip_request *req)
 {
 	int res;
-	if (st_get_mode(pvt) != SESSION_TIMER_MODE_REFUSE) {
+	if (st_get_mode(pvt, 0) != SESSION_TIMER_MODE_REFUSE) {
 		res = add_header(req, "Supported", "replaces, timer");
 	} else {
 		res = add_header(req, "Supported", "replaces");
@@ -11928,7 +11928,7 @@
 	}
 
 	/* Add Session-Timers related headers */
-	if (st_get_mode(p) == SESSION_TIMER_MODE_ORIGINATE) {
+	if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
 		char i2astr[10];
 
 		if (!p->stimer->st_interval) {
@@ -19787,7 +19787,7 @@
 		}
 
 		/* Check for Session-Timers related headers */
-		if (st_get_mode(p) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
+		if (st_get_mode(p, 0) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
 			p_hdrval = (char*)get_header(req, "Session-Expires");
 			if (!ast_strlen_zero(p_hdrval)) {
 				/* UAS supports Session-Timers */
@@ -19809,7 +19809,7 @@
 				start_session_timer(p);
 			} else {
 				/* UAS doesn't support Session-Timers */
-				if (st_get_mode(p) == SESSION_TIMER_MODE_ORIGINATE) {
+				if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
 					p->stimer->st_ref = SESSION_TIMER_REFRESHER_UAC;
 					p->stimer->st_active_peer_ua = FALSE;
 					start_session_timer(p);
@@ -22249,7 +22249,7 @@
 		}
 
 		dlg_min_se = st_get_se(p, FALSE);
-		switch (st_get_mode(p)) {
+		switch (st_get_mode(p, 1)) {
 		case SESSION_TIMER_MODE_ACCEPT:
 		case SESSION_TIMER_MODE_ORIGINATE:
 			if (uac_max_se > 0 && uac_max_se < dlg_min_se) {
@@ -22295,14 +22295,14 @@
 			break;
 
 		default:
-			ast_log(LOG_ERROR, "Internal Error %d at %s:%d\n", st_get_mode(p), __FILE__, __LINE__);
+			ast_log(LOG_ERROR, "Internal Error %d at %s:%d\n", st_get_mode(p, 1), __FILE__, __LINE__);
 			break;
 		}
 	} else {
 		/* The UAC did not request session-timers.  Asterisk (UAS), will now decide
 		(based on session-timer-mode in sip.conf) whether to run session-timers for
 		this session or not. */
-		switch (st_get_mode(p)) {
+		switch (st_get_mode(p, 1)) {
 		case SESSION_TIMER_MODE_ORIGINATE:
 			st_active = TRUE;
 			st_interval = st_get_se(p, TRUE);
@@ -25568,15 +25568,18 @@
 }
 
 
-/*! \brief Get the session-timer mode
- * \param p pointer to the SIP dialog
+/*!
+ * \brief Get the session-timer mode 
+ * \param p pointer to the SIP dialog 
+ * \param no_cached, set this to true in order to force a peername lookup on
+ *        the session timer mode.
 */
-enum st_mode st_get_mode(struct sip_pvt *p)
+enum st_mode st_get_mode(struct sip_pvt *p, int no_cached)
 {
 	if (!p->stimer)
 		sip_st_alloc(p);
 
-	if (p->stimer->st_cached_mode != SESSION_TIMER_MODE_INVALID)
+	if (!no_cached && p->stimer->st_cached_mode != SESSION_TIMER_MODE_INVALID)
 		return p->stimer->st_cached_mode;
 
 	if (p->relatedpeer) {
@@ -27498,509 +27501,516 @@
 	ast_clear_flag(&global_flags[1], SIP_PAGE2_IGNORESDPVERSION);
 
 
-	/* Read the [general] config section of sip.conf (or from realtime config) */
-	for (v = ast_variable_browse(cfg, "general"); v; v = v->next) {
-		if (handle_common_options(&global_flags[0], &dummy[0], v)) {
+	/* Read all [general] config sections of sip.conf (or from realtime config) */
+	for (cat = ast_category_browse(cfg, "general"); cat; cat = ast_category_browse(cfg, cat)) {
+		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;
-		}
-
-		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)) {
-					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;
+
+		for (v = ast_variable_browse(cfg, cat); v; v = v->next) {
+			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;
+			}
+
+			/* 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_NOTICE, "'%s' is not a valid transport type. if no other is specified, udp will be used.\n", trans);
+					ast_log(LOG_WARNING, "'%s' must not contain spaces at line %d.  Using default.\n", v->value, v->lineno);
 				}
-				if (default_primary_transport == 0) {
-					default_primary_transport = default_transports;
+			} 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);
 				}
-			}
-		} 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, "auth_message_requests")) {
-			sip_cfg.auth_message_requests = ast_true(v->value) ? 1 : 0;
-		} else if (!strcasecmp(v->name, "accept_outofcall_message")) {
-			sip_cfg.accept_outofcall_message = ast_true(v->value) ? 1 : 0;
-		} 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);
+				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 {
-				default_fromdomainport = STANDARD_SIP_PORT;
-			}
-		} else if (!strcasecmp(v->name, "outboundproxy")) {
-			char *tok, *proxyname;
-
-			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;
-			}
-
-			tok = ast_skip_blanks(strtok(ast_strdupa(v->value), ","));
-
-			sip_parse_host(tok, v->lineno, &proxyname,
-				       &sip_cfg.outboundproxy.port,
-				       &sip_cfg.outboundproxy.transport);
-
-			if ((tok = strtok(NULL, ","))) {
-				sip_cfg.outboundproxy.force = !strncasecmp(ast_skip_blanks(tok), "force", 5);
-			} else {
-				sip_cfg.outboundproxy.force = FALSE;
-			}
-
-			if (ast_strlen_zero(proxyname)) {
-				ast_log(LOG_WARNING, "you must specify a name for the outboundproxy on line %d of sip.conf.", v->lineno);
-				sip_cfg.outboundproxy.name[0] = '\0';
-				continue;
-			}
-
-			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))) {
-				ast_log(LOG_WARNING, "Invalid localnet value: %s\n", v->value);
-			} else {
-				localaddr = na;
-			}
-			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_debug(1, "No context specified at line %d for domain '%s'\n", v->lineno, domain);
-			}
-			if (ast_strlen_zero(domain)) {
-				ast_log(LOG_WARNING, "Empty domain specified at line %d\n", v->lineno);
-			} else {
-				add_sip_domain(ast_strip(domain), SIP_DOMAIN_CONFIG, cntx ? ast_strip(cntx) : "");
-			}
-		} else if (!strcasecmp(v->name, "register")) {
-			if (sip_register(v->value, v->lineno) == 0) {
-				registry_count++;
-			}
-		} else if (!strcasecmp(v->name, "mwi")) {
-			sip_subscribe_mwi(v->value, v->lineno);
-		} else if (!strcasecmp(v->name, "tos_sip")) {
-			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, "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);

[... 1008 lines stripped ...]



More information about the svn-commits mailing list