[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