[asterisk-commits] moy: branch moy/mfcr2 r144999 - in /team/moy/mfcr2: ./ apps/ build_tools/ cdr...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Sep 27 12:56:03 CDT 2008


Author: moy
Date: Sat Sep 27 12:56:02 2008
New Revision: 144999

URL: http://svn.digium.com/view/asterisk?view=rev&rev=144999
Log:
Merged trunk changes from revision 144876

Added:
    team/moy/mfcr2/doc/followme.txt
      - copied unchanged from r144825, trunk/doc/followme.txt
    team/moy/mfcr2/pbx/ael/ael-test/ael-vtest25/
      - copied from r144825, trunk/pbx/ael/ael-test/ael-vtest25/
    team/moy/mfcr2/pbx/ael/ael-test/ael-vtest25/extensions.ael
      - copied unchanged from r144825, trunk/pbx/ael/ael-test/ael-vtest25/extensions.ael
    team/moy/mfcr2/pbx/ael/ael-test/ref.ael-vtest25
      - copied unchanged from r144825, trunk/pbx/ael/ael-test/ref.ael-vtest25
Modified:
    team/moy/mfcr2/   (props changed)
    team/moy/mfcr2/CHANGES
    team/moy/mfcr2/Makefile
    team/moy/mfcr2/apps/app_alarmreceiver.c
    team/moy/mfcr2/apps/app_amd.c
    team/moy/mfcr2/apps/app_dial.c
    team/moy/mfcr2/apps/app_directory.c
    team/moy/mfcr2/apps/app_festival.c
    team/moy/mfcr2/apps/app_followme.c
    team/moy/mfcr2/apps/app_jack.c
    team/moy/mfcr2/apps/app_meetme.c
    team/moy/mfcr2/apps/app_minivm.c
    team/moy/mfcr2/apps/app_osplookup.c
    team/moy/mfcr2/apps/app_playback.c
    team/moy/mfcr2/apps/app_queue.c
    team/moy/mfcr2/apps/app_rpt.c
    team/moy/mfcr2/apps/app_voicemail.c
    team/moy/mfcr2/build_tools/get_makeopts
    team/moy/mfcr2/build_tools/get_moduleinfo
    team/moy/mfcr2/build_tools/make_buildopts_h
    team/moy/mfcr2/cdr/cdr_adaptive_odbc.c
    team/moy/mfcr2/cdr/cdr_pgsql.c
    team/moy/mfcr2/cdr/cdr_sqlite.c
    team/moy/mfcr2/channels/chan_agent.c
    team/moy/mfcr2/channels/chan_alsa.c
    team/moy/mfcr2/channels/chan_console.c
    team/moy/mfcr2/channels/chan_dahdi.c
    team/moy/mfcr2/channels/chan_gtalk.c
    team/moy/mfcr2/channels/chan_h323.c
    team/moy/mfcr2/channels/chan_iax2.c
    team/moy/mfcr2/channels/chan_jingle.c
    team/moy/mfcr2/channels/chan_local.c
    team/moy/mfcr2/channels/chan_mgcp.c
    team/moy/mfcr2/channels/chan_misdn.c
    team/moy/mfcr2/channels/chan_oss.c
    team/moy/mfcr2/channels/chan_phone.c
    team/moy/mfcr2/channels/chan_sip.c
    team/moy/mfcr2/channels/chan_skinny.c
    team/moy/mfcr2/channels/chan_unistim.c
    team/moy/mfcr2/channels/iax2-parser.c
    team/moy/mfcr2/codecs/codec_adpcm.c
    team/moy/mfcr2/codecs/codec_alaw.c
    team/moy/mfcr2/codecs/codec_dahdi.c
    team/moy/mfcr2/codecs/codec_g722.c
    team/moy/mfcr2/codecs/codec_g726.c
    team/moy/mfcr2/codecs/codec_gsm.c
    team/moy/mfcr2/codecs/codec_lpc10.c
    team/moy/mfcr2/codecs/codec_resample.c
    team/moy/mfcr2/codecs/codec_speex.c
    team/moy/mfcr2/codecs/codec_ulaw.c
    team/moy/mfcr2/configs/cdr.conf.sample
    team/moy/mfcr2/configs/cdr_adaptive_odbc.conf.sample
    team/moy/mfcr2/configs/extensions.lua.sample
    team/moy/mfcr2/configs/followme.conf.sample
    team/moy/mfcr2/configs/jabber.conf.sample
    team/moy/mfcr2/configs/sip.conf.sample
    team/moy/mfcr2/contrib/scripts/vmail.cgi
    team/moy/mfcr2/doc/asterisk.8
    team/moy/mfcr2/doc/tex/privacy.tex
    team/moy/mfcr2/formats/format_pcm.c
    team/moy/mfcr2/funcs/func_config.c
    team/moy/mfcr2/funcs/func_curl.c
    team/moy/mfcr2/funcs/func_cut.c
    team/moy/mfcr2/funcs/func_dialgroup.c
    team/moy/mfcr2/funcs/func_odbc.c
    team/moy/mfcr2/include/asterisk/astobj2.h
    team/moy/mfcr2/include/asterisk/channel.h
    team/moy/mfcr2/include/asterisk/config.h
    team/moy/mfcr2/include/asterisk/hashtab.h
    team/moy/mfcr2/include/asterisk/options.h
    team/moy/mfcr2/main/app.c
    team/moy/mfcr2/main/asterisk.c
    team/moy/mfcr2/main/astmm.c
    team/moy/mfcr2/main/callerid.c
    team/moy/mfcr2/main/cdr.c
    team/moy/mfcr2/main/channel.c
    team/moy/mfcr2/main/cli.c
    team/moy/mfcr2/main/config.c
    team/moy/mfcr2/main/dnsmgr.c
    team/moy/mfcr2/main/enum.c
    team/moy/mfcr2/main/features.c
    team/moy/mfcr2/main/file.c
    team/moy/mfcr2/main/http.c
    team/moy/mfcr2/main/loader.c
    team/moy/mfcr2/main/manager.c
    team/moy/mfcr2/main/pbx.c
    team/moy/mfcr2/main/poll.c
    team/moy/mfcr2/main/rtp.c
    team/moy/mfcr2/main/sched.c
    team/moy/mfcr2/main/taskprocessor.c
    team/moy/mfcr2/main/term.c
    team/moy/mfcr2/main/udptl.c
    team/moy/mfcr2/pbx/ael/ael-test/ref.ael-test6
    team/moy/mfcr2/pbx/pbx_lua.c
    team/moy/mfcr2/res/ael/ael.flex
    team/moy/mfcr2/res/ael/ael.tab.c
    team/moy/mfcr2/res/ael/ael.tab.h
    team/moy/mfcr2/res/ael/ael.y
    team/moy/mfcr2/res/ael/ael_lex.c
    team/moy/mfcr2/res/ael/pval.c
    team/moy/mfcr2/res/res_adsi.c
    team/moy/mfcr2/res/res_config_ldap.c
    team/moy/mfcr2/res/res_config_pgsql.c
    team/moy/mfcr2/res/res_config_sqlite.c
    team/moy/mfcr2/res/res_http_post.c
    team/moy/mfcr2/res/res_indications.c
    team/moy/mfcr2/res/res_jabber.c
    team/moy/mfcr2/res/res_musiconhold.c
    team/moy/mfcr2/res/res_odbc.c
    team/moy/mfcr2/res/res_phoneprov.c
    team/moy/mfcr2/res/res_smdi.c
    team/moy/mfcr2/res/res_snmp.c
    team/moy/mfcr2/res/res_timing_pthread.c
    team/moy/mfcr2/sounds/Makefile
    team/moy/mfcr2/utils/hashtest2.c

Propchange: team/moy/mfcr2/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.

Propchange: team/moy/mfcr2/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Modified: team/moy/mfcr2/CHANGES
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/CHANGES?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/CHANGES (original)
+++ team/moy/mfcr2/CHANGES Sat Sep 27 12:56:02 2008
@@ -2,7 +2,17 @@
 --- Functionality changes from Asterisk 1.6.1 to Asterisk 1.6.2  -------------
 ------------------------------------------------------------------------------
 
-* Nothing, yet!
+Dialplan Functions
+------------------
+ * Added a new dialplan function, CURLOPT, which permits setting various
+   options that may be useful with the CURL dialplan function, such as
+   cookies, proxies, connection timeouts, passwords, etc.
+
+Miscellaneous
+-------------
+ * res_jabber: autoprune has been disabled by default, to avoid misconfiguration 
+   that would end up being interpreted as a bug once Asterisk started removing 
+   the contacts from a user list.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 1.6.0 to Asterisk 1.6.1  -------------
@@ -112,6 +122,7 @@
    status variable SENDIMAGESTATUS to one of 'SUCCESS', 'FAILURE', or
    'UNSUPPORTED'.  This change makes SendImage() more consistent with other
    applications.
+ * Park has a new option, 's', which silences the announcement of the parking space number.
 
 SIP Changes
 -----------
@@ -209,6 +220,11 @@
     operator.  This is most helpful when working with long SQL queries in
     func_odbc.conf, as the queries no longer need to be specified on a single
     line.
+  * CDR config file, cdr.conf, has an added option, "initiatedseconds", 
+    which will add a second to the billsec when the ending
+    time is set, if the number in the microseconds field of the end time is 
+    greater than the number of microseconds in the answer time. This allows
+    users to count the 'initiated' seconds in their billing records. 
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 1.4.X to Asterisk 1.6.0  -------------
@@ -319,6 +335,7 @@
     sorted into the different possible callbacks, with the number of entries
     currently scheduled for each. Gives you a feel for how busy the sip channel
     driver is.
+  * Added 'skinny show lines verbose' CLI command. This will show the subs for every channel.
 
 SIP changes
 -----------

Modified: team/moy/mfcr2/Makefile
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/Makefile?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/Makefile (original)
+++ team/moy/mfcr2/Makefile Sat Sep 27 12:56:02 2008
@@ -275,9 +275,6 @@
 
 ifneq ($(wildcard .version),)
   ASTERISKVERSIONNUM:=$(shell $(AWK) -F. '{printf "%01d%02d%02d", $$1, $$2, $$3}' .version)
-  RPMVERSION:=$(shell sed 's/[-\/:]/_/g' .version)
-else
-  RPMVERSION=unknown
 endif
 
 ifneq ($(wildcard .svn),)
@@ -684,6 +681,7 @@
 		echo ";transcode_via_sln = yes ; Build transcode paths via SLINEAR, instead of directly" ; \
 		echo ";runuser = asterisk ; The user to run as" ; \
 		echo ";rungroup = asterisk ; The group to run as" ; \
+		echo ";lightbackground = yes ; If your terminal is set for a light-colored background" ; \
 		echo "" ; \
 		echo "; Changing the following lines may compromise your security." ; \
 		echo ";[files]" ; \
@@ -746,20 +744,6 @@
 	@echo " + HTTP_DOCSDIR                              +"
 	@echo " +                                           +"
 	@echo " +-------------------------------------------+"  
-
-spec: 
-	sed "s/^Version:.*/Version: $(RPMVERSION)/g" redhat/asterisk.spec > asterisk.spec ; \
-
-rpm: __rpm
-
-__rpm: main/version.c include/asterisk/version.h include/asterisk/buildopts.h spec
-	rm -rf /tmp/asterisk ; \
-	mkdir -p /tmp/asterisk/redhat/RPMS/i386 ; \
-	$(MAKE) DESTDIR=/tmp/asterisk install ; \
-	$(MAKE) DESTDIR=/tmp/asterisk samples ; \
-	mkdir -p /tmp/asterisk/etc/rc.d/init.d ; \
-	cp -f contrib/init.d/rc.redhat.asterisk /tmp/asterisk/etc/rc.d/init.d/asterisk ; \
-	rpmbuild --rcfile /usr/lib/rpm/rpmrc:redhat/rpmrc -bb asterisk.spec
 
 progdocs:
 	(cat contrib/asterisk-ng-doxygen; echo "HAVE_DOT=$(HAVEDOT)"; \
@@ -900,9 +884,9 @@
 	@echo "<?xml version=\"1.0\"?>" > $@
 	@echo >> $@
 	@echo "<menu name=\"Asterisk Module and Build Option Selection\">" >> $@
-	@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SUBMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
+	@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} moduleinfo >> $@; done
 	@cat build_tools/cflags.xml >> $@
-	@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SUBMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
+	@for dir in $(sort $(filter-out main,$(MOD_SUBDIRS))); do $(SILENTMAKE) -C $${dir} SUBDIR=$${dir} makeopts >> $@; done
 	@if [ "${AST_DEVMODE}" = "yes" ]; then \
 		cat build_tools/cflags-devmode.xml >> $@; \
 	fi

Modified: team/moy/mfcr2/apps/app_alarmreceiver.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_alarmreceiver.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_alarmreceiver.c (original)
+++ team/moy/mfcr2/apps/app_alarmreceiver.c Sat Sep 27 12:56:02 2008
@@ -639,6 +639,9 @@
 	if (!cfg) {
 		ast_verb(4, "AlarmReceiver: No config file\n");
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file %s is in an invalid format.  Aborting.\n", ALMRCV_CONFIG);
+		return 0;
 	} else {
 		p = ast_variable_retrieve(cfg, "general", "eventcmd");
 		if (p) {

Modified: team/moy/mfcr2/apps/app_amd.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_amd.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_amd.c (original)
+++ team/moy/mfcr2/apps/app_amd.c Sat Sep 27 12:56:02 2008
@@ -376,8 +376,12 @@
 	if (!(cfg = ast_config_load("amd.conf", config_flags))) {
 		ast_log(LOG_ERROR, "Configuration file amd.conf missing.\n");
 		return -1;
-	} else if (cfg == CONFIG_STATUS_FILEUNCHANGED)
+	} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file amd.conf is in an invalid format.  Aborting.\n");
+		return -1;
+	}
 
 	cat = ast_category_browse(cfg, NULL);
 

Modified: team/moy/mfcr2/apps/app_dial.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_dial.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_dial.c (original)
+++ team/moy/mfcr2/apps/app_dial.c Sat Sep 27 12:56:02 2008
@@ -1492,6 +1492,7 @@
 		
 		/* Inherit specially named variables from parent channel */
 		ast_channel_inherit_variables(chan, tc);
+		ast_channel_datastore_inherit(chan, tc);
 
 		tc->appl = "AppDial";
 		tc->data = "(Outgoing Line)";
@@ -1905,6 +1906,8 @@
 				ast_set_flag(&(config.features_callee), AST_FEATURE_AUTOMIXMON);
 			if (ast_test_flag64(peerflags, OPT_CALLER_MIXMONITOR))
 				ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMIXMON);
+			if (ast_test_flag64(peerflags, OPT_GO_ON))
+				ast_set_flag(&(config.features_caller), AST_FEATURE_NO_H_EXTEN);
 
 			if (moh) {
 				moh = 0;

Modified: team/moy/mfcr2/apps/app_directory.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_directory.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_directory.c (original)
+++ team/moy/mfcr2/apps/app_directory.c Sat Sep 27 12:56:02 2008
@@ -362,6 +362,9 @@
 		/* Loading config failed. */
 		ast_log(LOG_WARNING, "Loading config failed.\n");
 		return NULL;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file %s is in an invalid format.  Aborting.\n", VOICEMAIL_CONFIG);
+		return NULL;
 	}
 
 	/* Get realtime entries, categorized by their mailbox number
@@ -670,7 +673,10 @@
 		return -1;
 	}
 
-	ucfg = ast_config_load("users.conf", config_flags);
+	if ((ucfg = ast_config_load("users.conf", config_flags)) == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file users.conf is in an invalid format.  Aborting.\n");
+		ucfg = NULL;
+	}
 
 	dirintro = ast_variable_retrieve(cfg, args.vmcontext, "directoryintro");
 	if (ast_strlen_zero(dirintro))

Modified: team/moy/mfcr2/apps/app_festival.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_festival.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_festival.c (original)
+++ team/moy/mfcr2/apps/app_festival.c Sat Sep 27 12:56:02 2008
@@ -300,7 +300,11 @@
 	if (!cfg) {
 		ast_log(LOG_WARNING, "No such configuration file %s\n", FESTIVAL_CONFIG);
 		return -1;
-	}
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file " FESTIVAL_CONFIG " is in an invalid format.  Aborting.\n");
+		return -1;
+	}
+
 	if (!(host = ast_variable_retrieve(cfg, "general", "host"))) {
 		host = "localhost";
 	}
@@ -517,6 +521,9 @@
 	if (!cfg) {
 		ast_log(LOG_WARNING, "No such configuration file %s\n", FESTIVAL_CONFIG);
 		return AST_MODULE_LOAD_DECLINE;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file " FESTIVAL_CONFIG " is in an invalid format.  Aborting.\n");
+		return AST_MODULE_LOAD_DECLINE;
 	}
 	ast_config_destroy(cfg);
 	return ast_register_application(app, festival_exec, synopsis, descrip);

Modified: team/moy/mfcr2/apps/app_followme.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_followme.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_followme.c (original)
+++ team/moy/mfcr2/apps/app_followme.c Sat Sep 27 12:56:02 2008
@@ -89,6 +89,7 @@
 	char moh[AST_MAX_CONTEXT];	/*!< Music On Hold Class to be used */
 	char context[AST_MAX_CONTEXT];  /*!< Context to dial from */
 	unsigned int active;		/*!< Profile is active (1), or disabled (0). */
+	int realtime;           /*!< Cached from realtime */
 	char takecall[20];		/*!< Digit mapping to take a call */
 	char nextindp[20];		/*!< Digit mapping to decline a call */
 	char callfromprompt[PATH_MAX];	/*!< Sound prompt name and path */
@@ -233,17 +234,17 @@
 		ast_copy_string(f->takecall, val, sizeof(f->takecall));
 	else if (!strcasecmp(param, "declinecall"))
 		ast_copy_string(f->nextindp, val, sizeof(f->nextindp));
-	else if (!strcasecmp(param, "call-from-prompt"))
+	else if (!strcasecmp(param, "call-from-prompt") || !strcasecmp(param, "call_from_prompt"))
 		ast_copy_string(f->callfromprompt, val, sizeof(f->callfromprompt));
-	else if (!strcasecmp(param, "followme-norecording-prompt")) 
+	else if (!strcasecmp(param, "followme-norecording-prompt") || !strcasecmp(param, "norecording_prompt")) 
 		ast_copy_string(f->norecordingprompt, val, sizeof(f->norecordingprompt));
-	else if (!strcasecmp(param, "followme-options-prompt")) 
+	else if (!strcasecmp(param, "followme-options-prompt") || !strcasecmp(param, "options_prompt")) 
 		ast_copy_string(f->optionsprompt, val, sizeof(f->optionsprompt));
-	else if (!strcasecmp(param, "followme-pls-hold-prompt"))
+	else if (!strcasecmp(param, "followme-pls-hold-prompt") || !strcasecmp(param, "hold_prompt"))
 		ast_copy_string(f->plsholdprompt, val, sizeof(f->plsholdprompt));
-	else if (!strcasecmp(param, "followme-status-prompt")) 
+	else if (!strcasecmp(param, "followme-status-prompt") || !strcasecmp(param, "status_prompt")) 
 		ast_copy_string(f->statusprompt, val, sizeof(f->statusprompt));
-	else if (!strcasecmp(param, "followme-sorry-prompt")) 
+	else if (!strcasecmp(param, "followme-sorry-prompt") || !strcasecmp(param, "sorry_prompt")) 
 		ast_copy_string(f->sorryprompt, val, sizeof(f->sorryprompt));
 	else if (failunknown) {
 		if (linenum >= 0)
@@ -292,8 +293,12 @@
 	if (!(cfg = ast_config_load("followme.conf", config_flags))) {
 		ast_log(LOG_WARNING, "No follow me config file (followme.conf), so no follow me\n");
 		return 0;
-	} else if (cfg == CONFIG_STATUS_FILEUNCHANGED)
+	} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file followme.conf is in an invalid format.  Aborting.\n");
+		return 0;
+	}
 
 	AST_RWLIST_WRLOCK(&followmes);
 
@@ -312,37 +317,50 @@
 			featuredigittimeout = 5000;
 	}
 
-	takecallstr = ast_variable_retrieve(cfg, "general", "takecall");
-	if (!ast_strlen_zero(takecallstr))
+	if ((takecallstr = ast_variable_retrieve(cfg, "general", "takecall")) && !ast_strlen_zero(takecallstr)) {
 		ast_copy_string(takecall, takecallstr, sizeof(takecall));
-
-	declinecallstr = ast_variable_retrieve(cfg, "general", "declinecall");
-	if (!ast_strlen_zero(declinecallstr))
+	}
+
+	if ((declinecallstr = ast_variable_retrieve(cfg, "general", "declinecall")) && !ast_strlen_zero(declinecallstr)) {
 		ast_copy_string(nextindp, declinecallstr, sizeof(nextindp));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "call-from-prompt");
-	if (!ast_strlen_zero(tmpstr))
+	}
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "call-from-prompt")) && !ast_strlen_zero(tmpstr)) {
 		ast_copy_string(callfromprompt, tmpstr, sizeof(callfromprompt));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "norecording-prompt");
-	if (!ast_strlen_zero(tmpstr))
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "call_from_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(callfromprompt, tmpstr, sizeof(callfromprompt));
+	}
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "norecording-prompt")) && !ast_strlen_zero(tmpstr)) {
 		ast_copy_string(norecordingprompt, tmpstr, sizeof(norecordingprompt));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "options-prompt");
-	if (!ast_strlen_zero(tmpstr))
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "norecording_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(callfromprompt, tmpstr, sizeof(callfromprompt));
+	}
+
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "options-prompt")) && !ast_strlen_zero(tmpstr)) {
 		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "pls-hold-prompt");
-	if (!ast_strlen_zero(tmpstr))
-		ast_copy_string(plsholdprompt, tmpstr, sizeof(plsholdprompt));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "status-prompt");
-	if (!ast_strlen_zero(tmpstr))
-		ast_copy_string(statusprompt, tmpstr, sizeof(statusprompt));
-
-	tmpstr = ast_variable_retrieve(cfg, "general", "sorry-prompt");
-	if (!ast_strlen_zero(tmpstr))
-		ast_copy_string(sorryprompt, tmpstr, sizeof(sorryprompt));
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "options_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	}
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "pls-hold-prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "pls_hold_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	}
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "status-prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "status_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	}
+
+	if ((tmpstr = ast_variable_retrieve(cfg, "general", "sorry-prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	} else if ((tmpstr = ast_variable_retrieve(cfg, "general", "sorry_prompt")) && !ast_strlen_zero(tmpstr)) {
+		ast_copy_string(optionsprompt, tmpstr, sizeof(optionsprompt));
+	}
 
 	/* Chug through config file */
 	while ((cat = ast_category_browse(cfg, cat))) {
@@ -375,7 +393,7 @@
 		init_profile(f);
 		free_numbers(f);
 		var = ast_variable_browse(cfg, cat);
-		while(var) {
+		while (var) {
 			if (!strcasecmp(var->name, "number")) {
 				int idx = 0;
 
@@ -873,6 +891,67 @@
 	return;
 }
 
+static struct call_followme *find_realtime(const char *name)
+{
+	struct ast_variable *var = ast_load_realtime("followme", "name", name, SENTINEL), *v;
+	struct ast_config *cfg;
+	const char *catg;
+	struct call_followme *new;
+	struct ast_str *str = ast_str_create(16);
+
+	if (!var) {
+		return NULL;
+	}
+
+	if (!(new = alloc_profile(name))) {
+		return NULL;
+	}
+
+	for (v = var; v; v = v->next) {
+		if (!strcasecmp(v->name, "active")) {
+			if (ast_false(v->value)) {
+				ast_mutex_destroy(&new->lock);
+				ast_free(new);
+				return NULL;
+			}
+		} else {
+			profile_set_param(new, v->name, v->value, 0, 0);
+		}
+	}
+
+	ast_variables_destroy(var);
+	new->realtime = 1;
+
+	/* Load numbers */
+	if (!(cfg = ast_load_realtime_multientry("followme_numbers", "ordinal LIKE", "%", "name", name, SENTINEL))) {
+		ast_mutex_destroy(&new->lock);
+		ast_free(new);
+		return NULL;
+	}
+
+	for (catg = ast_category_browse(cfg, NULL); catg; catg = ast_category_browse(cfg, catg)) {
+		const char *numstr, *timeoutstr, *ordstr;
+		int timeout;
+		struct number *cur;
+		if (!(numstr = ast_variable_retrieve(cfg, catg, "phonenumber"))) {
+			continue;
+		}
+		if (!(timeoutstr = ast_variable_retrieve(cfg, catg, "timeout")) || sscanf(timeoutstr, "%d", &timeout) != 1 || timeout < 1) {
+			timeout = 25;
+		}
+		/* This one has to exist; it was part of the query */
+		ordstr = ast_variable_retrieve(cfg, catg, "ordinal");
+		ast_str_make_space(&str, strlen(numstr) + 1);
+		ast_copy_string(str->str, numstr, str->len);
+		if ((cur = create_followme_number(str->str, timeout, atoi(ordstr)))) {
+			AST_LIST_INSERT_TAIL(&new->numbers, cur, entry);
+		}
+	}
+	ast_config_destroy(cfg);
+
+	return new;
+}
+
 static int app_exec(struct ast_channel *chan, void *data)
 {
 	struct fm_args targs;
@@ -916,6 +995,10 @@
 	AST_RWLIST_UNLOCK(&followmes);
 
 	ast_debug(1, "New profile %s.\n", args.followmeid);
+
+	if (!f) {
+		f = find_realtime(args.followmeid);
+	}
 
 	if (!f) {
 		ast_log(LOG_WARNING, "Profile requested, %s, not found in the configuration.\n", args.followmeid);
@@ -1016,6 +1099,12 @@
 
 	outrun:
 
+	if (f->realtime) {
+		/* Not in list */
+		free_numbers(f);
+		ast_free(f);
+	}
+
 	return res;
 }
 

Modified: team/moy/mfcr2/apps/app_jack.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_jack.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_jack.c (original)
+++ team/moy/mfcr2/apps/app_jack.c Sat Sep 27 12:56:02 2008
@@ -27,7 +27,9 @@
  * another application, or to play audio from another application.
  *
  * \arg http://www.jackaudio.org/
- * \arg http://svn.digium.com/svn/libresample/trunk
+ *
+ * \note To install libresample, check it out of the following repository:
+ * <code>$ svn co http://svn.digium.com/svn/thirdparty/libresample/trunk</code>
  *
  * \ingroup applications
  */

Modified: team/moy/mfcr2/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_meetme.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_meetme.c (original)
+++ team/moy/mfcr2/apps/app_meetme.c Sat Sep 27 12:56:02 2008
@@ -2921,6 +2921,9 @@
 			if (!cfg) {
 				ast_log(LOG_WARNING, "No %s file :(\n", CONFIG_FILE_NAME);
 				return NULL;
+			} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+				ast_log(LOG_ERROR, "Config file " CONFIG_FILE_NAME " is in an invalid format.  Aborting.\n");
+				return NULL;
 			}
 			for (var = ast_variable_browse(cfg, "rooms"); var; var = var->next) {
 				if (strcasecmp(var->name, "conf"))
@@ -3083,7 +3086,7 @@
 			/* We only need to load the config file for static and empty_no_pin (otherwise we don't care) */
 			if ((empty_no_pin) || (!dynamic)) {
 				cfg = ast_config_load(CONFIG_FILE_NAME, config_flags);
-				if (cfg) {
+				if (cfg && cfg != CONFIG_STATUS_FILEINVALID) {
 					var = ast_variable_browse(cfg, "rooms");
 					while (var) {
 						if (!strcasecmp(var->name, "conf")) {
@@ -3729,8 +3732,12 @@
 	struct ast_flags config_flags = { 0 };
 	const char *val;
 
-	if (!(cfg = ast_config_load(CONFIG_FILE_NAME, config_flags)))
+	if (!(cfg = ast_config_load(CONFIG_FILE_NAME, config_flags))) {
 		return;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file " CONFIG_FILE_NAME " is in an invalid format.  Aborting.\n");
+		return;
+	}
 
 	audio_buffers = DEFAULT_AUDIO_BUFFERS;
 
@@ -5558,10 +5565,14 @@
 		ast_cond_init(&sla.cond, NULL);
 	}
 
-	if (!(cfg = ast_config_load(SLA_CONFIG_FILE, config_flags)))
+	if (!(cfg = ast_config_load(SLA_CONFIG_FILE, config_flags))) {
 		return 0; /* Treat no config as normal */
-	else if (cfg == CONFIG_STATUS_FILEUNCHANGED)
+	} else if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file " SLA_CONFIG_FILE " is in an invalid format.  Aborting.\n");
+		return 0;
+	}
 
 	if ((val = ast_variable_retrieve(cfg, "general", "attemptcallerid")))
 		sla.attempt_callerid = ast_true(val);

Modified: team/moy/mfcr2/apps/app_minivm.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_minivm.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_minivm.c (original)
+++ team/moy/mfcr2/apps/app_minivm.c Sat Sep 27 12:56:02 2008
@@ -2363,8 +2363,12 @@
 	struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
 
 	cfg = ast_config_load(VOICEMAIL_CONFIG, config_flags);
-	if (cfg == CONFIG_STATUS_FILEUNCHANGED)
+	if (cfg == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file " VOICEMAIL_CONFIG " is in an invalid format.  Aborting.\n");
+		return 0;
+	}
 
 	ast_mutex_lock(&minivmlock);
 

Modified: team/moy/mfcr2/apps/app_osplookup.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_osplookup.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_osplookup.c (original)
+++ team/moy/mfcr2/apps/app_osplookup.c Sat Sep 27 12:56:02 2008
@@ -1776,8 +1776,12 @@
 	struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
 	int error = OSPC_ERR_NO_ERROR;
 
-	if ((cfg = ast_config_load(OSP_CONFIG_FILE, config_flags)) == CONFIG_STATUS_FILEUNCHANGED)
+	if ((cfg = ast_config_load(OSP_CONFIG_FILE, config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (cfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file %s is in an invalid format.  Aborting.\n", OSP_CONFIG_FILE);
+		return 0;
+	}
 
 	if (cfg) {
 		if (reload)

Modified: team/moy/mfcr2/apps/app_playback.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_playback.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_playback.c (original)
+++ team/moy/mfcr2/apps/app_playback.c Sat Sep 27 12:56:02 2008
@@ -200,13 +200,13 @@
 		ast_debug(2, "doing [%s]\n", fn);
 
 		/* locate prefix and data, if any */
-		fmt = index(fn, ':');
+		fmt = strchr(fn, ':');
 		if (!fmt || fmt == fn)	{	/* regular filename */
 			ret = s_streamwait3(a, fn);
 			continue;
 		}
 		fmt++;
-		data = index(fmt, ':');	/* colon before data */
+		data = strchr(fmt, ':');	/* colon before data */
 		if (!data || data == fmt) {	/* simple prefix-fmt */
 			ret = do_say(a, fn, options, depth);
 			continue;
@@ -219,14 +219,14 @@
 			if (*p == '\'') {/* file name - we trim them */
 				char *y;
 				strcpy(fn2, ast_skip_blanks(p+1));	/* make a full copy */
-				y = index(fn2, '\'');
+				y = strchr(fn2, '\'');
 				if (!y) {
 					p = data;	/* invalid. prepare to end */
 					break;
 				}
 				*y = '\0';
 				ast_trim_blanks(fn2);
-				p = index(p+1, '\'');
+				p = strchr(p+1, '\'');
 				ret = s_streamwait3(a, fn2);
 			} else {
 				int l = fmt-fn;
@@ -461,8 +461,12 @@
 	struct ast_flags config_flags = { CONFIG_FLAG_FILEUNCHANGED };
 	struct ast_config *newcfg;
 
-	if ((newcfg = ast_config_load("say.conf", config_flags)) == CONFIG_STATUS_FILEUNCHANGED)
+	if ((newcfg = ast_config_load("say.conf", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) {
 		return 0;
+	} else if (newcfg == CONFIG_STATUS_FILEINVALID) {
+		ast_log(LOG_ERROR, "Config file say.conf is in an invalid format.  Aborting.\n");
+		return 0;
+	}
 
 	if (say_cfg) {
 		ast_config_destroy(say_cfg);
@@ -506,7 +510,7 @@
 	struct ast_flags config_flags = { 0 };
 
 	say_cfg = ast_config_load("say.conf", config_flags);
-	if (say_cfg) {
+	if (say_cfg && say_cfg != CONFIG_STATUS_FILEINVALID) {
 		for (v = ast_variable_browse(say_cfg, "general"); v ; v = v->next) {
     			if (ast_extension_match(v->name, "mode")) {
 				say_init_mode(v->value);

Modified: team/moy/mfcr2/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/moy/mfcr2/apps/app_queue.c?view=diff&rev=144999&r1=144998&r2=144999
==============================================================================
--- team/moy/mfcr2/apps/app_queue.c (original)
+++ team/moy/mfcr2/apps/app_queue.c Sat Sep 27 12:56:02 2008
@@ -391,13 +391,6 @@
 	unsigned int delme:1;               /*!< Flag to delete entry on reload */
 	char rt_uniqueid[80];               /*!< Unique id of realtime member entry */
 };
-
-struct member_interface {
-	char interface[80];
-	AST_LIST_ENTRY(member_interface) list;    /*!< Next call queue */
-};
-
-static AST_LIST_HEAD_STATIC(interfaces, member_interface);
 
 /* values used in multi-bit flags in call_queue */
 #define QUEUE_EMPTY_NORMAL 1
@@ -582,7 +575,7 @@
 static int queue_cmp_cb(void *obj, void *arg, int flags)
 {
 	struct call_queue *q = obj, *q2 = arg;
-	return !strcasecmp(q->name, q2->name) ? CMP_MATCH : 0;
+	return !strcasecmp(q->name, q2->name) ? CMP_MATCH | CMP_STOP : 0;
 }
 
 static inline struct call_queue *queue_ref(struct call_queue *q)
@@ -697,100 +690,69 @@
  * Lock interface list find sc, iterate through each queues queue_member list for member to
  * update state inside queues
 */
-static int update_status(const char *interface, const int status)
-{
-	struct member *cur;
-	struct ao2_iterator mem_iter, queue_iter;
+static int update_status(struct call_queue *q, struct member *m, const int status)
+{
+	m->status = status;
+
+	if (q->maskmemberstatus)
+		return 0;
+
+	manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
+		"Queue: %s\r\n"
+		"Location: %s\r\n"
+		"MemberName: %s\r\n"
+		"Membership: %s\r\n"
+		"Penalty: %d\r\n"
+		"CallsTaken: %d\r\n"
+		"LastCall: %d\r\n"
+		"Status: %d\r\n"
+		"Paused: %d\r\n",
+		q->name, m->interface, m->membername, m->dynamic ? "dynamic" : m->realtime ? "realtime" : "static",
+		m->penalty, m->calls, (int)m->lastcall, m->status, m->paused
+	);
+
+	return 0;
+}
+
+/*! \brief set a member's status based on device state of that member's interface*/
+static int handle_statechange(void *datap)
+{
+	struct statechange *sc = datap;
+	struct ao2_iterator miter, qiter;
+	struct member *m;
 	struct call_queue *q;
-
-	queue_iter = ao2_iterator_init(queues, 0);
-	while ((q = ao2_iterator_next(&queue_iter))) {
+	char interface[80], *slash_pos;
+	int found = 0;
+
+	qiter = ao2_iterator_init(queues, 0);
+
+	while ((q = ao2_iterator_next(&qiter))) {
 		ao2_lock(q);
-		mem_iter = ao2_iterator_init(q->members, 0);
-		while ((cur = ao2_iterator_next(&mem_iter))) {
-			char *tmp_interface;
-			char *slash_pos;
-			tmp_interface = ast_strdupa(cur->state_interface);
+
+		miter = ao2_iterator_init(q->members, 0);
+		for (; (m = ao2_iterator_next(&miter)); ao2_ref(m, -1)) {
+			ast_copy_string(interface, m->state_interface, sizeof(interface));
+
 			if ((slash_pos = strchr(interface, '/')))
 				if ((slash_pos = strchr(slash_pos + 1, '/')))
 					*slash_pos = '\0';
 
-			if (strcasecmp(interface, tmp_interface)) {
-				ao2_ref(cur, -1);
-				continue;
-			}
-
-			if (cur->status != status) {
-				cur->status = status;
-				if (q->maskmemberstatus) {
-					ao2_ref(cur, -1);
-					continue;
-				}
-
-				manager_event(EVENT_FLAG_AGENT, "QueueMemberStatus",
-					"Queue: %s\r\n"
-					"Location: %s\r\n"
-					"MemberName: %s\r\n"
-					"Membership: %s\r\n"
-					"Penalty: %d\r\n"
-					"CallsTaken: %d\r\n"
-					"LastCall: %d\r\n"
-					"Status: %d\r\n"
-					"Paused: %d\r\n",
-					q->name, cur->interface, cur->membername, cur->dynamic ? "dynamic" : cur->realtime ? "realtime" : "static",
-					cur->penalty, cur->calls, (int)cur->lastcall, cur->status, cur->paused);
-			}
-			ao2_ref(cur, -1);
-		}
-		queue_unref(q);
+			if (!strcasecmp(interface, sc->dev)) {
+				found = 1;
+				update_status(q, m, sc->state);
+				ao2_ref(m, -1);
+				break;
+			}
+		}
+
 		ao2_unlock(q);
 	}
 
-	return 0;
-}
-
-/*! \brief set a member's status based on device state of that member's interface*/
-static int handle_statechange(void *datap)
-{
-	struct member_interface *curint;
-	char *loc;
-	char *technology;
-	struct statechange *sc = datap;
-
-	technology = ast_strdupa(sc->dev);
-	loc = strchr(technology, '/');
-	if (loc) {
-		*loc++ = '\0';
-	} else {
-		ast_free(sc);
-		return 0;
-	}
-
-	AST_LIST_LOCK(&interfaces);
-	AST_LIST_TRAVERSE(&interfaces, curint, list) {
-		char *interface;
-		char *slash_pos;
-		interface = ast_strdupa(curint->interface);
-		if ((slash_pos = strchr(interface, '/')))
-			if ((slash_pos = strchr(slash_pos + 1, '/')))
-				*slash_pos = '\0';
-
-		if (!strcasecmp(interface, sc->dev))
-			break;
-	}
-	AST_LIST_UNLOCK(&interfaces);
-
-	if (!curint) {
-		if (option_debug > 2)
-			ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", technology, loc, sc->state, devstate2str(sc->state));
-		ast_free(sc);
-		return 0;
-	}
-
-	if (option_debug)
-		ast_log(LOG_DEBUG, "Device '%s/%s' changed to state '%d' (%s)\n", technology, loc, sc->state, devstate2str(sc->state));
-
-	update_status(sc->dev, sc->state);
+	if (found)
+		ast_debug(1, "Device '%s' changed to state '%d' (%s)\n", sc->dev, sc->state, devstate2str(sc->state));
+	else
+		ast_debug(3, "Device '%s' changed to state '%d' (%s) but we don't care because they're not a member of any queue.\n", sc->dev, sc->state, devstate2str(sc->state));
+
 	ast_free(sc);
 	return 0;
 }
@@ -872,7 +834,7 @@
 static int member_cmp_fn(void *obj1, void *obj2, int flags)
 {
 	struct member *mem1 = obj1, *mem2 = obj2;
-	return strcasecmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
+	return strcasecmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH | CMP_STOP;
 }
 
 /*! 
@@ -956,90 +918,6 @@
 	q->callsabandoned = 0;
 	q->callscompletedinsl = 0;
 	q->wrapuptime = 0;
-}
-
-static int add_to_interfaces(const char *interface)
-{
-	struct member_interface *curint;
-
-	AST_LIST_LOCK(&interfaces);
-	AST_LIST_TRAVERSE(&interfaces, curint, list) {
-		if (!strcasecmp(curint->interface, interface))
-			break;
-	}
-
-	if (curint) {
-		AST_LIST_UNLOCK(&interfaces);
-		return 0;
-	}
-
-	ast_debug(1, "Adding %s to the list of interfaces that make up all of our queue members.\n", interface);
-	
-	if ((curint = ast_calloc(1, sizeof(*curint)))) {
-		ast_copy_string(curint->interface, interface, sizeof(curint->interface));
-		AST_LIST_INSERT_HEAD(&interfaces, curint, list);
-	}
-	AST_LIST_UNLOCK(&interfaces);
-
-	return 0;
-}
-
-static int interface_exists_global(const char *interface)
-{
-	struct call_queue *q;
-	struct member *mem, tmpmem;
-	struct ao2_iterator queue_iter, mem_iter;
-	int ret = 0;
-
-	ast_copy_string(tmpmem.interface, interface, sizeof(tmpmem.interface));
-	queue_iter = ao2_iterator_init(queues, 0);
-	while ((q = ao2_iterator_next(&queue_iter))) {
-		ao2_lock(q);
-		mem_iter = ao2_iterator_init(q->members, 0);
-		while ((mem = ao2_iterator_next(&mem_iter))) { 
-			if (!strcasecmp(mem->state_interface, interface)) {
-				ao2_ref(mem, -1);
-				ret = 1;
-				break;
-			}
-		}
-		ao2_unlock(q);
-		queue_unref(q);
-	}
-
-	return ret;
-}
-
-static int remove_from_interfaces(const char *interface)
-{
-	struct member_interface *curint;
-
-	if (interface_exists_global(interface))
-		return 0;
-
-	AST_LIST_LOCK(&interfaces);
-	AST_LIST_TRAVERSE_SAFE_BEGIN(&interfaces, curint, list) {
-		if (!strcasecmp(curint->interface, interface)) {
-			ast_debug(1, "Removing %s from the list of interfaces that make up all of our queue members.\n", interface);
-			AST_LIST_REMOVE_CURRENT(list);
-			ast_free(curint);
-			break;
-		}
-	}
-	AST_LIST_TRAVERSE_SAFE_END;
-	AST_LIST_UNLOCK(&interfaces);
-
-	return 0;
-}
-
-static void clear_and_free_interfaces(void)
-{
-	struct member_interface *curint;
-
-	AST_LIST_LOCK(&interfaces);
-	while ((curint = AST_LIST_REMOVE_HEAD(&interfaces, list)))
-		ast_free(curint);
-	AST_LIST_UNLOCK(&interfaces);
 }
 
 /*! 
@@ -1354,9 +1232,7 @@
  			if (paused_str)
  				m->paused = paused;
  			if (strcasecmp(state_interface, m->state_interface)) {
- 				remove_from_interfaces(m->state_interface);
  				ast_copy_string(m->state_interface, state_interface, sizeof(m->state_interface));
- 				add_to_interfaces(m->state_interface);
  			}	   
  			m->penalty = penalty;
  			found = 1;
@@ -1372,7 +1248,6 @@
 			m->dead = 0;
 			m->realtime = 1;
 			ast_copy_string(m->rt_uniqueid, rt_uniqueid, sizeof(m->rt_uniqueid));
-			add_to_interfaces(m->state_interface);
 			ast_queue_log(q->name, "REALTIME", m->interface, "ADDMEMBER", "%s", "");
 			ao2_link(q->members, m);
 			ao2_ref(m, -1);
@@ -1392,7 +1267,6 @@
 	while ((cur = ao2_iterator_next(&mem_iter))) {
 		if (all || !cur->dynamic) {
 			ao2_unlink(q->members, cur);
-			remove_from_interfaces(cur->state_interface);
 			q->membercount--;
 		}
 		ao2_ref(cur, -1);
@@ -1560,7 +1434,6 @@
 		if (m->dead) {

[... 10044 lines stripped ...]



More information about the asterisk-commits mailing list