[svn-commits] russell: branch russell/iax2_frame_queue r87464 - in /team/russell/iax2_frame...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Mon Oct 29 17:13:47 CDT 2007


Author: russell
Date: Mon Oct 29 17:13:46 2007
New Revision: 87464

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

Modified:
    team/russell/iax2_frame_queue/   (props changed)
    team/russell/iax2_frame_queue/CHANGES
    team/russell/iax2_frame_queue/Makefile
    team/russell/iax2_frame_queue/UPGRADE.txt
    team/russell/iax2_frame_queue/apps/app_controlplayback.c
    team/russell/iax2_frame_queue/apps/app_meetme.c
    team/russell/iax2_frame_queue/apps/app_minivm.c
    team/russell/iax2_frame_queue/apps/app_mixmonitor.c
    team/russell/iax2_frame_queue/apps/app_osplookup.c
    team/russell/iax2_frame_queue/apps/app_playback.c
    team/russell/iax2_frame_queue/apps/app_queue.c
    team/russell/iax2_frame_queue/apps/app_record.c
    team/russell/iax2_frame_queue/apps/app_rpt.c
    team/russell/iax2_frame_queue/apps/app_voicemail.c
    team/russell/iax2_frame_queue/channels/chan_agent.c
    team/russell/iax2_frame_queue/channels/chan_alsa.c
    team/russell/iax2_frame_queue/channels/chan_features.c
    team/russell/iax2_frame_queue/channels/chan_gtalk.c
    team/russell/iax2_frame_queue/channels/chan_h323.c
    team/russell/iax2_frame_queue/channels/chan_iax2.c
    team/russell/iax2_frame_queue/channels/chan_jingle.c
    team/russell/iax2_frame_queue/channels/chan_local.c
    team/russell/iax2_frame_queue/channels/chan_mgcp.c
    team/russell/iax2_frame_queue/channels/chan_misdn.c
    team/russell/iax2_frame_queue/channels/chan_oss.c
    team/russell/iax2_frame_queue/channels/chan_sip.c
    team/russell/iax2_frame_queue/channels/chan_skinny.c
    team/russell/iax2_frame_queue/channels/chan_usbradio.c
    team/russell/iax2_frame_queue/channels/chan_zap.c
    team/russell/iax2_frame_queue/channels/iax2-provision.c
    team/russell/iax2_frame_queue/channels/misdn/isdn_lib.c
    team/russell/iax2_frame_queue/channels/misdn/isdn_lib.h
    team/russell/iax2_frame_queue/channels/misdn/isdn_msg_parser.c
    team/russell/iax2_frame_queue/codecs/codec_zap.c
    team/russell/iax2_frame_queue/configs/queues.conf.sample
    team/russell/iax2_frame_queue/configs/zapata.conf.sample
    team/russell/iax2_frame_queue/configure
    team/russell/iax2_frame_queue/configure.ac
    team/russell/iax2_frame_queue/funcs/func_curl.c
    team/russell/iax2_frame_queue/funcs/func_cut.c
    team/russell/iax2_frame_queue/funcs/func_devstate.c
    team/russell/iax2_frame_queue/funcs/func_lock.c
    team/russell/iax2_frame_queue/funcs/func_logic.c
    team/russell/iax2_frame_queue/funcs/func_odbc.c
    team/russell/iax2_frame_queue/funcs/func_realtime.c
    team/russell/iax2_frame_queue/funcs/func_shell.c
    team/russell/iax2_frame_queue/funcs/func_strings.c
    team/russell/iax2_frame_queue/include/asterisk/app.h
    team/russell/iax2_frame_queue/include/asterisk/autoconfig.h.in
    team/russell/iax2_frame_queue/include/asterisk/cli.h
    team/russell/iax2_frame_queue/include/asterisk/linkedlists.h
    team/russell/iax2_frame_queue/include/asterisk/lock.h
    team/russell/iax2_frame_queue/include/asterisk/pval.h
    team/russell/iax2_frame_queue/main/Makefile
    team/russell/iax2_frame_queue/main/acl.c
    team/russell/iax2_frame_queue/main/app.c
    team/russell/iax2_frame_queue/main/ast_expr2.c
    team/russell/iax2_frame_queue/main/ast_expr2.y
    team/russell/iax2_frame_queue/main/ast_expr2f.c
    team/russell/iax2_frame_queue/main/asterisk.c
    team/russell/iax2_frame_queue/main/astmm.c
    team/russell/iax2_frame_queue/main/astobj2.c
    team/russell/iax2_frame_queue/main/cdr.c
    team/russell/iax2_frame_queue/main/channel.c
    team/russell/iax2_frame_queue/main/cli.c
    team/russell/iax2_frame_queue/main/config.c
    team/russell/iax2_frame_queue/main/db.c
    team/russell/iax2_frame_queue/main/dnsmgr.c
    team/russell/iax2_frame_queue/main/file.c
    team/russell/iax2_frame_queue/main/frame.c
    team/russell/iax2_frame_queue/main/http.c
    team/russell/iax2_frame_queue/main/image.c
    team/russell/iax2_frame_queue/main/loader.c
    team/russell/iax2_frame_queue/main/logger.c
    team/russell/iax2_frame_queue/main/manager.c
    team/russell/iax2_frame_queue/main/pbx.c
    team/russell/iax2_frame_queue/main/rtp.c
    team/russell/iax2_frame_queue/main/threadstorage.c
    team/russell/iax2_frame_queue/main/translate.c
    team/russell/iax2_frame_queue/main/udptl.c
    team/russell/iax2_frame_queue/main/utils.c
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-ntest22
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test16
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test19
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test2
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test3
    team/russell/iax2_frame_queue/pbx/ael/ael-test/ref.ael-test4
    team/russell/iax2_frame_queue/pbx/pbx_ael.c
    team/russell/iax2_frame_queue/pbx/pbx_config.c
    team/russell/iax2_frame_queue/pbx/pbx_dundi.c
    team/russell/iax2_frame_queue/res/ael/ael.flex
    team/russell/iax2_frame_queue/res/ael/ael.tab.c
    team/russell/iax2_frame_queue/res/ael/ael.tab.h
    team/russell/iax2_frame_queue/res/ael/ael.y
    team/russell/iax2_frame_queue/res/ael/ael_lex.c
    team/russell/iax2_frame_queue/res/ael/pval.c
    team/russell/iax2_frame_queue/res/res_agi.c
    team/russell/iax2_frame_queue/res/res_clioriginate.c
    team/russell/iax2_frame_queue/res/res_config_pgsql.c
    team/russell/iax2_frame_queue/res/res_config_sqlite.c
    team/russell/iax2_frame_queue/res/res_convert.c
    team/russell/iax2_frame_queue/res/res_crypto.c
    team/russell/iax2_frame_queue/res/res_features.c
    team/russell/iax2_frame_queue/res/res_indications.c
    team/russell/iax2_frame_queue/res/res_jabber.c
    team/russell/iax2_frame_queue/res/res_limit.c
    team/russell/iax2_frame_queue/res/res_monitor.c
    team/russell/iax2_frame_queue/res/res_musiconhold.c
    team/russell/iax2_frame_queue/res/res_odbc.c
    team/russell/iax2_frame_queue/res/res_realtime.c
    team/russell/iax2_frame_queue/utils/ael_main.c
    team/russell/iax2_frame_queue/utils/conf2ael.c

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

Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.

Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Propchange: team/russell/iax2_frame_queue/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Oct 29 17:13:46 2007
@@ -1,1 +1,1 @@
-/trunk:1-86529
+/trunk:1-87462

Modified: team/russell/iax2_frame_queue/CHANGES
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/CHANGES?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/CHANGES (original)
+++ team/russell/iax2_frame_queue/CHANGES Mon Oct 29 17:13:46 2007
@@ -165,6 +165,7 @@
   * Added additional information to EXITWITHTIMEOUT and EXITWITHKEY events in the
      queue log.
   * Added ability for non-realtime queues to have realtime members
+  * Added the "linear" strategy to queues.
 
 MeetMe Changes
 --------------

Modified: team/russell/iax2_frame_queue/Makefile
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/Makefile?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/Makefile (original)
+++ team/russell/iax2_frame_queue/Makefile Mon Oct 29 17:13:46 2007
@@ -200,7 +200,11 @@
   endif
 endif
 
-ASTCFLAGS+=-pipe -Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG)
+ifeq ($(findstring -save-temps,$(ASTCFLAGS)),)
+ASTCFLAGS+=-pipe
+endif
+
+ASTCFLAGS+=-Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations $(DEBUG)
 
 ASTCFLAGS+=-include $(ASTTOPDIR)/include/asterisk/autoconfig.h
 

Modified: team/russell/iax2_frame_queue/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/UPGRADE.txt?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/UPGRADE.txt (original)
+++ team/russell/iax2_frame_queue/UPGRADE.txt Mon Oct 29 17:13:46 2007
@@ -79,6 +79,11 @@
   these functions in any location where you desire to ensure that only one
   channel is executing that path at any one time.
 
+Dialplan Functions:
+
+* QUEUE_MEMBER_COUNT() has been deprecated in favor of the QUEUE_MEMBER() function. For
+  more information, issue a "show function QUEUE_MEMBER" from the CLI.
+
 CDR:
 
 * The cdr_sqlite module has been marked as deprecated in favor of

Modified: team/russell/iax2_frame_queue/apps/app_controlplayback.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_controlplayback.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_controlplayback.c (original)
+++ team/russell/iax2_frame_queue/apps/app_controlplayback.c Mon Oct 29 17:13:46 2007
@@ -142,7 +142,7 @@
 	res = ast_control_streamfile(chan, args.filename, args.fwd, args.rev, args.stop, args.pause, args.restart, skipms, &offsetms);
 
 	/* If we stopped on one of our stop keys, return 0  */
-	if (args.stop && strchr(args.stop, res)) {
+	if (res > 0 && args.stop && strchr(args.stop, res)) {
 		res = 0;
 		pbx_builtin_setvar_helper(chan, "CPLAYBACKSTATUS", "USERSTOPPED");
 	} else {

Modified: team/russell/iax2_frame_queue/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_meetme.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_meetme.c (original)
+++ team/russell/iax2_frame_queue/apps/app_meetme.c Mon Oct 29 17:13:46 2007
@@ -82,7 +82,9 @@
 enum {
 	ADMINFLAG_MUTED =     (1 << 1), /*!< User is muted */
 	ADMINFLAG_SELFMUTED = (1 << 2), /*!< User muted self */
-	ADMINFLAG_KICKME =    (1 << 3)  /*!< User has been kicked */
+	ADMINFLAG_KICKME =    (1 << 3),  /*!< User has been kicked */
+	/*! User has requested to speak */
+	ADMINFLAG_T_REQUEST = (1 << 4),
 };
 
 #define MEETME_DELAYDETECTTALK     300
@@ -1050,7 +1052,7 @@
 			min = ((now - user->jointime) % 3600) / 60;
 			sec = (now - user->jointime) % 60;
 			if ( !concise )
-				ast_cli(a->fd, "User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %02d:%02d:%02d\n",
+				ast_cli(a->fd, "User #: %-2.2d %12.12s %-20.20s Channel: %s %s %s %s %s %s %02d:%02d:%02d\n",
 					user->user_no,
 					S_OR(user->chan->cid.cid_num, "<unknown>"),
 					S_OR(user->chan->cid.cid_name, "<no name>"),
@@ -1058,9 +1060,10 @@
 					user->userflags & CONFFLAG_ADMIN ? "(Admin)" : "",
 					user->userflags & CONFFLAG_MONITOR ? "(Listen only)" : "",
 					user->adminflags & ADMINFLAG_MUTED ? "(Admin Muted)" : user->adminflags & ADMINFLAG_SELFMUTED ? "(Muted)" : "",
+					user->adminflags & ADMINFLAG_T_REQUEST ? "(Request to Talk)" : "",
 					istalking(user->talking), hr, min, sec); 
 			else 
-				ast_cli(a->fd, "%d!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
+				ast_cli(a->fd, "%d!%s!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
 					user->user_no,
 					S_OR(user->chan->cid.cid_num, ""),
 					S_OR(user->chan->cid.cid_name, ""),
@@ -1068,6 +1071,7 @@
 					user->userflags  & CONFFLAG_ADMIN   ? "1" : "",
 					user->userflags  & CONFFLAG_MONITOR ? "1" : "",
 					user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)  ? "1" : "",
+					user->adminflags & ADMINFLAG_T_REQUEST ? "1" : "",
 					user->talking, hr, min, sec);
 			
 		}
@@ -1244,9 +1248,9 @@
 }
 
 static struct ast_cli_entry cli_meetme[] = {
-	NEW_CLI(meetme_cmd, "Execute a command on a conference or conferee"),
-	NEW_CLI(sla_show_trunks, "Show SLA Trunks"),
-	NEW_CLI(sla_show_stations, "Show SLA Stations"),
+	AST_CLI_DEFINE(meetme_cmd, "Execute a command on a conference or conferee"),
+	AST_CLI_DEFINE(sla_show_trunks, "Show SLA Trunks"),
+	AST_CLI_DEFINE(sla_show_stations, "Show SLA Stations"),
 };
 
 static void conf_flush(int fd, struct ast_channel *chan)
@@ -1445,6 +1449,7 @@
 	int ret = -1;
 	int x;
 	int menu_active = 0;
+	int talkreq_manager = 0;
 	int using_pseudo = 0;
 	int duration=20;
 	int hr, min, sec;
@@ -1798,7 +1803,7 @@
 			x = 1;
 			ast_channel_setoption(chan, AST_OPTION_TONE_VERIFY, &x, sizeof(char), 0);
 		}	
-		if (!(dsp = ast_dsp_new())) {
+		if (!(confflags & CONFFLAG_MONITOR) && !(dsp = ast_dsp_new())) {
 			ast_log(LOG_WARNING, "Unable to allocate DSP!\n");
 			res = -1;
 		}
@@ -1991,7 +1996,33 @@
 						"Status: off\r\n",
 						chan->name, chan->uniqueid, conf->confno, user->user_no);
 			}
-
+			
+			if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && 
+				(user->adminflags & ADMINFLAG_T_REQUEST) && !(talkreq_manager)) {
+				talkreq_manager = 1;
+
+				manager_event(EVENT_FLAG_CALL, "MeetmeTalkRequest", 
+					      "Channel: %s\r\n"
+							      "Uniqueid: %s\r\n"
+							      "Meetme: %s\r\n"
+							      "Usernum: %i\r\n"
+							      "Status: on\r\n",
+							      chan->name, chan->uniqueid, conf->confno, user->user_no);
+			}
+
+			
+			if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) && 
+				!(user->adminflags & ADMINFLAG_T_REQUEST) && (talkreq_manager)) {
+				talkreq_manager = 0;
+				manager_event(EVENT_FLAG_CALL, "MeetmeTalkRequest", 
+					      "Channel: %s\r\n"
+							      "Uniqueid: %s\r\n"
+							      "Meetme: %s\r\n"
+							      "Usernum: %i\r\n"
+							      "Status: off\r\n",
+							     chan->name, chan->uniqueid, conf->confno, user->user_no);
+			}
+			
 			/* If I have been kicked, exit the conference */
 			if (user->adminflags & ADMINFLAG_KICKME) {
 				//You have been kicked.
@@ -2029,7 +2060,7 @@
 					if (user->talk.actual)
 						ast_frame_adjust_volume(f, user->talk.actual);
 
-					{
+					if (!(confflags & CONFFLAG_MONITOR)) {
 						int totalsilence;
 
 						if (user->talking == -1)
@@ -2226,6 +2257,15 @@
 									if (!ast_streamfile(chan, "conf-unmuted", chan->language))
 										ast_waitstream(chan, "");
 								}
+								break;
+							case '2':
+								menu_active = 0;
+								if (user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED))
+									user->adminflags |= ADMINFLAG_T_REQUEST;
+									
+								if (user->adminflags & ADMINFLAG_T_REQUEST)
+									if (!ast_streamfile(chan, "beep", chan->language))
+										ast_waitstream(chan, "");
 								break;
 							case '4':
 								tweak_listen_volume(user, VOL_DOWN);
@@ -3022,13 +3062,13 @@
 		break;					
 	case 109: /* m: Unmute */ 
 		if (user) {
-			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);
 		} else
 			ast_log(LOG_NOTICE, "Specified User not found!\n");
 		break;
 	case 110: /* n: Unmute all users */
 		AST_LIST_TRAVERSE(&cnf->userlist, user, list)
-			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);
+			user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);
 		break;
 	case 107: /* k: Kick user */ 
 		if (user)
@@ -3210,7 +3250,7 @@
 	if (mute)
 		user->adminflags |= ADMINFLAG_MUTED;	/* request user muting */
 	else
-		user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED);	/* request user unmuting */
+		user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);	/* request user unmuting */
 
 	AST_LIST_UNLOCK(&confs);
 

Modified: team/russell/iax2_frame_queue/apps/app_minivm.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_minivm.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_minivm.c (original)
+++ team/russell/iax2_frame_queue/apps/app_minivm.c Mon Oct 29 17:13:46 2007
@@ -2991,12 +2991,12 @@
 
 /*! \brief CLI commands for Mini-voicemail */
 static struct ast_cli_entry cli_minivm[] = {
-	NEW_CLI(handle_minivm_show_users, "List defined mini-voicemail boxes"),
-	NEW_CLI(handle_minivm_show_zones, "List zone message formats"),
-	NEW_CLI(handle_minivm_list_templates, "List message templates"),	
-	NEW_CLI(handle_minivm_reload, "Reload Mini-voicemail configuration"),
-	NEW_CLI(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
-	NEW_CLI(handle_minivm_show_settings, "Show mini-voicemail general settings"),
+	AST_CLI_DEFINE(handle_minivm_show_users, "List defined mini-voicemail boxes"),
+	AST_CLI_DEFINE(handle_minivm_show_zones, "List zone message formats"),
+	AST_CLI_DEFINE(handle_minivm_list_templates, "List message templates"),	
+	AST_CLI_DEFINE(handle_minivm_reload, "Reload Mini-voicemail configuration"),
+	AST_CLI_DEFINE(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
+	AST_CLI_DEFINE(handle_minivm_show_settings, "Show mini-voicemail general settings"),
 };
 
 static struct ast_custom_function minivm_counter_function = {

Modified: team/russell/iax2_frame_queue/apps/app_mixmonitor.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_mixmonitor.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_mixmonitor.c (original)
+++ team/russell/iax2_frame_queue/apps/app_mixmonitor.c Mon Oct 29 17:13:46 2007
@@ -399,7 +399,7 @@
 }
 
 static struct ast_cli_entry cli_mixmonitor[] = {
-	NEW_CLI(handle_cli_mixmonitor, "Execute a MixMonitor command")
+	AST_CLI_DEFINE(handle_cli_mixmonitor, "Execute a MixMonitor command")
 };
 
 static int unload_module(void)

Modified: team/russell/iax2_frame_queue/apps/app_osplookup.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_osplookup.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_osplookup.c (original)
+++ team/russell/iax2_frame_queue/apps/app_osplookup.c Mon Oct 29 17:13:46 2007
@@ -2000,7 +2000,7 @@
 "		SUCCESS | FAILED | ERROR \n";
 
 static struct ast_cli_entry cli_osp[] = {
-	NEW_CLI(handle_cli_osp_show, "Displays OSF information")
+	AST_CLI_DEFINE(handle_cli_osp_show, "Displays OSF information")
 };
 
 static int load_module(void)

Modified: team/russell/iax2_frame_queue/apps/app_playback.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_playback.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_playback.c (original)
+++ team/russell/iax2_frame_queue/apps/app_playback.c Mon Oct 29 17:13:46 2007
@@ -357,7 +357,6 @@
 	return 0;
 }
 
-
 static char *__say_cli_init(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	const char *old_mode = say_api_buf[0] ? say_new : say_old;
@@ -368,11 +367,11 @@
 		e->usage = 
 			"Usage: say load [new|old]\n"
 			"       say load\n"
-			"	   Report status of current say mode\n"
+			"           Report status of current say mode\n"
 			"       say load new\n"
-			"          Set say method, configured in say.conf\n"
+			"           Set say method, configured in say.conf\n"
 			"       say load old\n"
-			"          Set old say metod, coded in asterisk core\n";
+			"           Set old say method, coded in asterisk core\n";
 		return NULL;
 	case CLI_GENERATE:
 		return NULL;
@@ -380,24 +379,20 @@
 	if (a->argc == 2) {
 		ast_cli(a->fd, "say mode is [%s]\n", old_mode);
 		return CLI_SUCCESS;
-        } else if (a->argc != 3)
-                return CLI_SHOWUSAGE;
-        mode = a->argv[2];
-	
-	if (!strcmp(mode, old_mode)) {
+	} else if (a->argc != 3)
+		return CLI_SHOWUSAGE;
+	mode = a->argv[2];
+	if (!strcmp(mode, old_mode))
 		ast_log(LOG_NOTICE, "say mode is %s already\n", mode);
-	} else {
-		if (say_init_mode(mode) == 0) {
+	else
+		if (say_init_mode(mode) == 0)
 			ast_log(LOG_NOTICE, "init say.c from %s to %s\n", old_mode, mode);
-		}
-	}
+
 	return CLI_SUCCESS;
 }
 
 static struct ast_cli_entry cli_playback[] = {
-	NEW_CLI(__say_cli_init, "Set or show the say mode"),
-	NEW_CLI(__say_cli_init, "Set the say mode"),
-	NEW_CLI(__say_cli_init, "Set the say mode"),
+	AST_CLI_DEFINE(__say_cli_init, "Set or show the say mode"),
 };
 
 static int playback_exec(struct ast_channel *chan, void *data)

Modified: team/russell/iax2_frame_queue/apps/app_queue.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_queue.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_queue.c (original)
+++ team/russell/iax2_frame_queue/apps/app_queue.c Mon Oct 29 17:13:46 2007
@@ -100,7 +100,8 @@
 	QUEUE_STRATEGY_LEASTRECENT,
 	QUEUE_STRATEGY_FEWESTCALLS,
 	QUEUE_STRATEGY_RANDOM,
-	QUEUE_STRATEGY_RRMEMORY
+	QUEUE_STRATEGY_RRMEMORY,
+	QUEUE_STRATEGY_LINEAR
 };
 
 static struct strategy {
@@ -112,6 +113,7 @@
 	{ QUEUE_STRATEGY_FEWESTCALLS, "fewestcalls" },
 	{ QUEUE_STRATEGY_RANDOM, "random" },
 	{ QUEUE_STRATEGY_RRMEMORY, "rrmemory" },
+	{ QUEUE_STRATEGY_LINEAR, "linear" },
 };
 
 #define DEFAULT_RETRY		5
@@ -257,6 +259,9 @@
 /*! \brief queues.conf [general] option */
 static int montype_default = 0;
 
+/*! \brief queues.conf [general] option */
+static int shared_lastcall = 0;
+
 /*! \brief Subscription to device state change events */
 static struct ast_event_sub *device_state_sub;
 
@@ -300,6 +305,7 @@
 	int metric;
 	int oldstatus;
 	time_t lastcall;
+	struct call_queue *lastqueue;
 	struct member *member;
 };
 
@@ -320,6 +326,8 @@
 	int opos;                           /*!< Where we started in the queue */
 	int handled;                        /*!< Whether our call was handled */
 	int max_penalty;                    /*!< Limit the members that can take this call to this penalty or lower */
+	int linpos;							/*!< If using linear strategy, what position are we at? */
+	int linwrapped;						/*!< Is the linpos wrapped? */
 	time_t start;                       /*!< When we started holding */
 	time_t expire;                      /*!< When this entry should expire (time out of queue) */
 	struct ast_channel *chan;           /*!< Our channel */
@@ -336,6 +344,7 @@
 	int status;                         /*!< Status of queue member */
 	int paused;                         /*!< Are we paused (not accepting calls)? */
 	time_t lastcall;                    /*!< When last successful call was hungup */
+	struct call_queue *lastqueue;	    /*!< Last queue we received a call */
 	unsigned int dead:1;                /*!< Used to detect members deleted in realtime */
 	unsigned int delme:1;               /*!< Flag to delete entry on reload */
 };
@@ -797,7 +806,7 @@
 static int member_cmp_fn(void *obj1, void *obj2, int flags)
 {
 	struct member *mem1 = obj1, *mem2 = obj2;
-	return strcmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
+	return strcasecmp(mem1->interface, mem2->interface) ? 0 : CMP_MATCH;
 }
 
 static void init_queue(struct call_queue *q)
@@ -828,8 +837,13 @@
 	q->monfmt[0] = '\0';
 	q->periodicannouncefrequency = 0;
 	q->sound_callerannounce[0] = '\0';	/* Default, don't announce the caller that he has been answered */
-	if(!q->members)
-		q->members = ao2_container_alloc(37, member_hash_fn, member_cmp_fn);
+	if(!q->members) {
+		if(q->strategy == QUEUE_STRATEGY_LINEAR)
+			/* linear strategy depends on order, so we have to place all members in a single bucket */
+			q->members = ao2_container_alloc(1, member_hash_fn, member_cmp_fn);
+		else
+			q->members = ao2_container_alloc(37, member_hash_fn, member_cmp_fn);
+	}
 	q->membercount = 0;
 	q->found = 1;
 	ast_copy_string(q->sound_next, "queue-youarenext", sizeof(q->sound_next));
@@ -1058,12 +1072,8 @@
 	} else if (!strcasecmp(param, "servicelevel")) {
 		q->servicelevel= atoi(val);
 	} else if (!strcasecmp(param, "strategy")) {
-		q->strategy = strat2int(val);
-		if (q->strategy < 0) {
-			ast_log(LOG_WARNING, "'%s' isn't a valid strategy for queue '%s', using ringall instead\n",
-				val, q->name);
-			q->strategy = QUEUE_STRATEGY_RINGALL;
-		}
+		/* We already have set this, no need to do it again */
+		return;
 	} else if (!strcasecmp(param, "joinempty")) {
 		if (!strcasecmp(val, "loose"))
 			q->joinempty = QUEUE_EMPTY_LOOSE;
@@ -1858,8 +1868,10 @@
 	char *location;
 
 	/* on entry here, we know that tmp->chan == NULL */
-	if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
-		ast_debug(1, "Wrapuptime not yet expired for %s\n", tmp->interface);
+	if ((tmp->lastqueue && tmp->lastqueue->wrapuptime && (time(NULL) - tmp->lastcall < tmp->lastqueue->wrapuptime)) ||
+		(!tmp->lastqueue && qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime))) {
+		ast_debug(1, "Wrapuptime not yet expired on queue %s for %s\n", 
+				(tmp->lastqueue ? tmp->lastqueue->name : qe->parent->name), tmp->interface);
 		if (qe->chan->cdr)
 			ast_cdr_busy(qe->chan->cdr);
 		tmp->stillgoing = 0;
@@ -1907,7 +1919,9 @@
 
 		ao2_lock(qe->parent);
 		qe->parent->rrpos++;
+		qe->linpos++;
 		ao2_unlock(qe->parent);
+
 
 		(*busies)++;
 		return 0;
@@ -2014,7 +2028,7 @@
 	return ret;
 }
 
-static int store_next(struct queue_ent *qe, struct callattempt *outgoing)
+static int store_next_rr(struct queue_ent *qe, struct callattempt *outgoing)
 {
 	struct callattempt *best = find_best(outgoing);
 
@@ -2033,6 +2047,29 @@
 		}
 	}
 	qe->parent->wrapped = 0;
+
+	return 0;
+}
+
+static int store_next_lin(struct queue_ent *qe, struct callattempt *outgoing)
+{
+	struct callattempt *best = find_best(outgoing);
+
+	if (best) {
+		/* Ring just the best channel */
+		ast_debug(1, "Next is '%s' with metric %d\n", best->interface, best->metric);
+		qe->linpos = best->metric % 1000;
+	} else {
+		/* Just increment rrpos */
+		if (qe->linwrapped) {
+			/* No more channels, start over */
+			qe->linpos = 0;
+		} else {
+			/* Prioritize next entry */
+			qe->linpos++;
+		}
+	}
+	qe->linwrapped = 0;
 
 	return 0;
 }
@@ -2492,9 +2529,31 @@
 
 static int update_queue(struct call_queue *q, struct member *member, int callcompletedinsl)
 {
+	struct member *mem;
+	struct call_queue *qtmp;
+	struct ao2_iterator queue_iter;	
+	
+	if (shared_lastcall) {
+		queue_iter = ao2_iterator_init(queues, 0);
+		while ((qtmp = ao2_iterator_next(&queue_iter))) {
+			ao2_lock(qtmp);
+			if ((mem = ao2_find(qtmp->members, member, OBJ_POINTER))) {
+				time(&mem->lastcall);
+				mem->calls++;
+				mem->lastqueue = q;
+				ao2_ref(mem, -1);
+			}
+			ao2_unlock(qtmp);
+			ao2_ref(qtmp, -1);
+		}
+	} else {
+		ao2_lock(q);
+		time(&member->lastcall);
+		member->calls++;
+		member->lastqueue = q;
+		ao2_unlock(q);
+	}	
 	ao2_lock(q);
-	time(&member->lastcall);
-	member->calls++;
 	q->callscompleted++;
 	if (callcompletedinsl)
 		q->callscompletedinsl++;
@@ -2511,6 +2570,17 @@
 	case QUEUE_STRATEGY_RINGALL:
 		/* Everyone equal, except for penalty */
 		tmp->metric = mem->penalty * 1000000;
+		break;
+	case QUEUE_STRATEGY_LINEAR:
+		if (pos < qe->linpos) {
+			tmp->metric = 1000 + pos;
+		} else {
+			if (pos > qe->linpos)
+				/* Indicate there is another priority */
+				qe->linwrapped = 1;
+			tmp->metric = pos;
+		}
+		tmp->metric += mem->penalty * 1000000;
 		break;
 	case QUEUE_STRATEGY_RRMEMORY:
 		if (pos < q->rrpos) {
@@ -2660,7 +2730,7 @@
                         ast_set_flag(&(bridge_config.features_caller), AST_FEATURE_PARKCALL);
                         break;
 		case 'n':
-			if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY)
+			if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR)
 				(*tries)++;
 			else
 				*tries = qe->parent->membercount;
@@ -2698,6 +2768,7 @@
 		tmp->member = cur;
 		tmp->oldstatus = cur->status;
 		tmp->lastcall = cur->lastcall;
+		tmp->lastqueue = cur->lastqueue;
 		ast_copy_string(tmp->interface, cur->interface, sizeof(tmp->interface));
 		/* Special case: If we ring everyone, go ahead and ring them, otherwise
 		   just calculate their metric for the appropriate strategy */
@@ -2727,7 +2798,10 @@
 	lpeer = wait_for_answer(qe, outgoing, &to, &digit, numbusies, ast_test_flag(&(bridge_config.features_caller), AST_FEATURE_DISCONNECT), forwardsallowed);
 	ao2_lock(qe->parent);
 	if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
-		store_next(qe, outgoing);
+		store_next_rr(qe, outgoing);
+	}
+	if (qe->parent->strategy == QUEUE_STRATEGY_LINEAR) {
+		store_next_lin(qe, outgoing);
 	}
 	ao2_unlock(qe->parent);
 	peer = lpeer ? lpeer->chan : NULL;
@@ -3959,6 +4033,67 @@
 	struct call_queue *q, tmpq;
 	struct member *m;
 	struct ao2_iterator mem_iter;
+	char *queuename, *option;
+
+	buf[0] = '\0';
+	
+	if (ast_strlen_zero(data)) {
+		ast_log(LOG_ERROR, "%s requires an argument: queuename\n", cmd);
+		return -1;
+	}
+
+	queuename = data;
+	if ((option = strchr(data, ',')))
+		*option++ = '\0';
+	else
+		option = "logged";
+
+	ast_copy_string(tmpq.name, queuename, sizeof(tmpq.name));
+	
+	if ((q = ao2_find(queues, &tmpq, OBJ_POINTER))) {
+		ao2_lock(q);
+		if(!strcasecmp(option, "logged")) {
+			mem_iter = ao2_iterator_init(q->members, 0);
+			while ((m = ao2_iterator_next(&mem_iter))) {
+				/* Count the agents who are logged in and presently answering calls */
+				if ((m->status != AST_DEVICE_UNAVAILABLE) && (m->status != AST_DEVICE_INVALID)) {
+					count++;
+				}
+				ao2_ref(m, -1);
+			}
+		} else if(!strcasecmp(option, "free")) {
+			mem_iter = ao2_iterator_init(q->members, 0);
+			while ((m = ao2_iterator_next(&mem_iter))) {
+				/* Count the agents who are logged in and presently answering calls */
+				if ((m->status == AST_DEVICE_NOT_INUSE) && (!m->paused)) {
+					count++;
+				}
+				ao2_ref(m, -1);
+			}
+		} else /* must be "count" */
+			count = q->membercount;
+		ao2_unlock(q);
+		queue_unref(q);
+	} else
+		ast_log(LOG_WARNING, "queue %s was not found\n", data);
+
+	snprintf(buf, len, "%d", count);
+
+	return 0;
+}
+
+static int queue_function_qac_dep(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
+{
+	int count = 0;
+	struct call_queue *q, tmpq;
+	struct member *m;
+	struct ao2_iterator mem_iter;
+	static int depflag = 1;
+	if(depflag)
+	{
+		depflag = 0;
+		ast_log(LOG_NOTICE, "The function QUEUE_MEMBER_COUNT has been deprecated in favor of the QUEUE_MEMBER function and will not be in further releases.\n");
+	}
 
 	buf[0] = '\0';
 	
@@ -3988,6 +4123,7 @@
 
 	return 0;
 }
+
 
 static int queue_function_queuewaitingcount(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
 {
@@ -4082,12 +4218,26 @@
 };
 
 static struct ast_custom_function queuemembercount_function = {
+	.name = "QUEUE_MEMBER",
+	.synopsis = "Count number of members answering a queue",
+	.syntax = "QUEUE_MEMBER(<queuename>, <option>)",
+	.desc =
+"Returns the number of members currently associated with the specified queue.\n"
+"One of three options may be passed to determine the count returned:\n"
+	"\"logged\" - Returns the number of logged-in members for the specified queue\n"
+	"\"free\" - Returns the number of logged-in members for the specified queue available to take a call\n"
+	"\"count\" - Returns the total number of members for the specified queue\n",
+	.read = queue_function_qac,
+};
+
+static struct ast_custom_function queuemembercount_dep = {
 	.name = "QUEUE_MEMBER_COUNT",
 	.synopsis = "Count number of members answering a queue",
 	.syntax = "QUEUE_MEMBER_COUNT(<queuename>)",
 	.desc =
-"Returns the number of members currently associated with the specified queue.\n",
-	.read = queue_function_qac,
+"Returns the number of members currently associated with the specified queue.\n\n"
+"This function has been deprecated in favor of the QUEUE_MEMBER function\n",
+	.read = queue_function_qac_dep,
 };
 
 static struct ast_custom_function queuewaitingcount_function = {
@@ -4169,6 +4319,9 @@
 			update_cdr = 0;
 			if ((general_val = ast_variable_retrieve(cfg, "general", "updatecdr")))
 				update_cdr = ast_true(general_val);
+			shared_lastcall = 0;
+			if ((general_val = ast_variable_retrieve(cfg, "general", "shared_lastcall")))
+				shared_lastcall = ast_true(general_val);
 		} else {	/* Define queue */
 			/* Look for an existing one */
 			ast_copy_string(tmpq.name, cat, sizeof(tmpq.name));
@@ -4181,6 +4334,7 @@
 			} else
 				new = 0;
 			if (q) {
+				const char *tmpvar;
 				if (!new)
 					ao2_lock(q);
 				/* Check if a queue with this name already exists */
@@ -4190,6 +4344,20 @@
 						ao2_unlock(q);
 					continue;
 				}
+				/* Due to the fact that the "linear" strategy will have a different allocation
+				 * scheme for queue members, we must devise the queue's strategy before other initializations
+				 */
+				if((tmpvar = ast_variable_retrieve(cfg, cat, "strategy"))) {
+					ast_log(LOG_DEBUG, "Success!!\n");
+					q->strategy = strat2int(tmpvar);
+					ast_log(LOG_DEBUG, "Queue strategy set to '%s'\n", int2strat(q->strategy));
+					if (q->strategy < 0) {
+						ast_log(LOG_WARNING, "'%s' isn't a valid strategy for queue '%s', using ringall instead\n",
+						tmpvar, q->name);
+						q->strategy = QUEUE_STRATEGY_RINGALL;
+					}
+				} else
+					q->strategy = QUEUE_STRATEGY_RINGALL;
 				/* Re-initialize the queue, and clear statistics */
 				init_queue(q);
 				if (!queue_keep_stats) 
@@ -5004,10 +5172,10 @@
 "Usage: queue unpause member <channel> in <queue> reason <reason>\n";
 
 static struct ast_cli_entry cli_queue[] = {
-	NEW_CLI(queue_show, "Show status of a specified queue"),
-	NEW_CLI(handle_queue_add_member, "Add a channel to a specified queue"),
-	NEW_CLI(handle_queue_remove_member, "Removes a channel from a specified queue"),
-	NEW_CLI(handle_queue_pause_member, "Pause or unpause a queue member"),
+	AST_CLI_DEFINE(queue_show, "Show status of a specified queue"),
+	AST_CLI_DEFINE(handle_queue_add_member, "Add a channel to a specified queue"),
+	AST_CLI_DEFINE(handle_queue_remove_member, "Removes a channel from a specified queue"),
+	AST_CLI_DEFINE(handle_queue_pause_member, "Pause or unpause a queue member"),
 };
 
 static int unload_module(void)
@@ -5040,6 +5208,7 @@
 	res |= ast_unregister_application(app);
 	res |= ast_custom_function_unregister(&queuevar_function);
 	res |= ast_custom_function_unregister(&queuemembercount_function);
+	res |= ast_custom_function_unregister(&queuemembercount_dep);
 	res |= ast_custom_function_unregister(&queuememberlist_function);
 	res |= ast_custom_function_unregister(&queuewaitingcount_function);
 
@@ -5098,6 +5267,7 @@
 	res |= ast_manager_register("QueueLog", EVENT_FLAG_AGENT, manager_queue_log_custom, "Adds custom entry in queue_log");
 	res |= ast_custom_function_register(&queuevar_function);
 	res |= ast_custom_function_register(&queuemembercount_function);
+	res |= ast_custom_function_register(&queuemembercount_dep);
 	res |= ast_custom_function_register(&queuememberlist_function);
 	res |= ast_custom_function_register(&queuewaitingcount_function);
 	if (!(device_state_sub = ast_event_subscribe(AST_EVENT_DEVICE_STATE, device_state_cb, NULL, AST_EVENT_IE_END)))

Modified: team/russell/iax2_frame_queue/apps/app_record.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_record.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_record.c (original)
+++ team/russell/iax2_frame_queue/apps/app_record.c Mon Oct 29 17:13:46 2007
@@ -117,7 +117,7 @@
 	int ioflags;
 	int waitres;
 	struct ast_silence_generator *silgen = NULL;
-	struct ast_flags flags;
+	struct ast_flags flags = { 0, };
 	AST_DECLARE_APP_ARGS(args,
 		AST_APP_ARG(filename);
 		AST_APP_ARG(silence);

Modified: team/russell/iax2_frame_queue/apps/app_rpt.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_rpt.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_rpt.c (original)
+++ team/russell/iax2_frame_queue/apps/app_rpt.c Mon Oct 29 17:13:46 2007
@@ -706,12 +706,12 @@
 static char *handle_cli_rpt_restart(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
 
 static struct ast_cli_entry cli_rpt[] = {
-	NEW_CLI(handle_cli_rpt_debug_level, "Enable app_rpt debuggin"),
-	NEW_CLI(handle_cli_rpt_dump,        "Dump app_rpt structs for debugging"),
-	NEW_CLI(handle_cli_rpt_stats,       "Dump node statistics"),
-	NEW_CLI(handle_cli_rpt_lstats,      "Dump link statistics"),
-	NEW_CLI(handle_cli_rpt_reload,      "Reload app_rpt config"),
-	NEW_CLI(handle_cli_rpt_restart,     "Restart app_rpt")
+	AST_CLI_DEFINE(handle_cli_rpt_debug_level, "Enable app_rpt debuggin"),
+	AST_CLI_DEFINE(handle_cli_rpt_dump,        "Dump app_rpt structs for debugging"),
+	AST_CLI_DEFINE(handle_cli_rpt_stats,       "Dump node statistics"),
+	AST_CLI_DEFINE(handle_cli_rpt_lstats,      "Dump link statistics"),
+	AST_CLI_DEFINE(handle_cli_rpt_reload,      "Reload app_rpt config"),
+	AST_CLI_DEFINE(handle_cli_rpt_restart,     "Restart app_rpt")
 };
 
 /*

Modified: team/russell/iax2_frame_queue/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/apps/app_voicemail.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/apps/app_voicemail.c (original)
+++ team/russell/iax2_frame_queue/apps/app_voicemail.c Mon Oct 29 17:13:46 2007
@@ -69,7 +69,6 @@
 #include <errno.h>
 #include <unistd.h>
 #include <string.h>
-#include <stdlib.h>
 #include <stdio.h>
 #include <sys/time.h>
 #include <sys/stat.h>
@@ -7735,8 +7734,8 @@
 }
 
 static struct ast_cli_entry cli_voicemail[] = {
-	NEW_CLI(handle_voicemail_show_users, "List defined voicemail boxes"),
-	NEW_CLI(handle_voicemail_show_zones, "List zone message formats"),
+	AST_CLI_DEFINE(handle_voicemail_show_users, "List defined voicemail boxes"),
+	AST_CLI_DEFINE(handle_voicemail_show_zones, "List zone message formats"),
 };
 
 static void poll_subscribed_mailboxes(void)
@@ -9383,8 +9382,8 @@
 	memset(buf, 0, len);
 
 	ast_copy_string(buf, start+taglen, len);
-	eol_pnt = strchr(buf,'\n');
-	*eol_pnt = '\0';
+	if ((eol_pnt = strchr(buf,'\r')) || (eol_pnt = strchr(buf,'\n')))
+		*eol_pnt = '\0';
 	return buf;
 }
 

Modified: team/russell/iax2_frame_queue/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_frame_queue/channels/chan_agent.c?view=diff&rev=87464&r1=87463&r2=87464
==============================================================================
--- team/russell/iax2_frame_queue/channels/chan_agent.c (original)
+++ team/russell/iax2_frame_queue/channels/chan_agent.c Mon Oct 29 17:13:46 2007
@@ -1765,9 +1765,9 @@
 "       If 'soft' is specified, do not hangup existing calls.\n";
 
 static struct ast_cli_entry cli_agents[] = {
-	NEW_CLI(agents_show, "Show status of agents"),
-	NEW_CLI(agents_show_online, "Show all online agents"),
-	NEW_CLI(agent_logoff_cmd, "Sets an agent offline"),
+	AST_CLI_DEFINE(agents_show, "Show status of agents"),
+	AST_CLI_DEFINE(agents_show_online, "Show all online agents"),
+	AST_CLI_DEFINE(agent_logoff_cmd, "Sets an agent offline"),
 };
 
 /*!
@@ -2339,7 +2339,7 @@
 	/* Make sure we can register our agent channel type */
 	if (ast_channel_register(&agent_tech)) {

[... 14735 lines stripped ...]



More information about the svn-commits mailing list