[Asterisk-cvs] asterisk/apps app_macro.c,1.18,1.19

markster at lists.digium.com markster at lists.digium.com
Thu Jan 6 23:37:42 CST 2005


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv29422/apps

Modified Files:
	app_macro.c 
Log Message:
Add MacroExit application (bug #3045)


Index: app_macro.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_macro.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- app_macro.c	15 Dec 2004 03:24:39 -0000	1.18
+++ app_macro.c	7 Jan 2005 05:42:31 -0000	1.19
@@ -28,6 +28,9 @@
 
 #define MAX_ARGS 80
 
+/* special result value used to force macro exit */
+#define MACRO_EXIT_RESULT 1024
+
 static char *tdesc = "Extension Macros";
 
 static char *descrip =
@@ -48,11 +51,20 @@
 "Executes macro defined in <label_a> if <expr> is true\n"
 "(otherwise <label_b> if provided)\n";
 
+static char *exit_descrip =
+"  MacroExit():\n"
+"Causes the currently running macro to exit as if it had\n"
+"ended normally by running out of priorities to execute.\n"
+"If used outside a macro, will likely cause unexpected\n"
+"behavior.\n";
+
 static char *app = "Macro";
 static char *if_app = "MacroIf";
+static char *exit_app = "MacroExit";
 
 static char *synopsis = "Macro Implementation";
 static char *if_synopsis = "Conditional Macro Implementation";
+static char *exit_synopsis = "Exit From Macro";
 
 STANDARD_LOCAL_USER;
 
@@ -159,6 +171,9 @@
 			break;
 		}
 		switch(res) {
+	        case MACRO_EXIT_RESULT:
+                        res = 0;
+			goto out;
 		case AST_PBX_KEEPALIVE:
 			if (option_debug)
 				ast_log(LOG_DEBUG, "Spawn extension (%s,%s,%d) exited KEEPALIVE in macro %s on '%s'\n", chan->context, chan->exten, chan->priority, macro, chan->name);
@@ -262,6 +277,11 @@
 	return res;
 }
 			
+static int macro_exit_exec(struct ast_channel *chan, void *data)
+{
+	return MACRO_EXIT_RESULT;
+}
+
 int unload_module(void)
 {
 	STANDARD_HANGUP_LOCALUSERS;
@@ -271,6 +291,7 @@
 
 int load_module(void)
 {
+	ast_register_application(exit_app, macro_exit_exec, exit_synopsis, exit_descrip);
 	ast_register_application(if_app, macroif_exec, if_synopsis, if_descrip);
 	return ast_register_application(app, macro_exec, synopsis, descrip);
 }




More information about the svn-commits mailing list