[Asterisk-cvs] asterisk pbx.c,1.194,1.195

markster at lists.digium.com markster at lists.digium.com
Sun Jan 9 14:24:26 CST 2005


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

Modified Files:
	pbx.c 
Log Message:
Improve show dialplan support to support patterns and also to select contexts (bug #3230)


Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.194
retrieving revision 1.195
diff -u -d -r1.194 -r1.195
--- pbx.c	1 Jan 2005 21:26:37 -0000	1.194
+++ pbx.c	9 Jan 2005 20:28:47 -0000	1.195
@@ -2810,49 +2810,31 @@
 	return NULL;
 }
 
-static int handle_show_dialplan(int fd, int argc, char *argv[])
+struct dialplan_counters {
+	int total_context;
+	int total_exten;
+	int total_prio;
+	int context_existence;
+	int extension_existence;
+};
+
+static int show_dialplan_helper(int fd, char *context, char *exten, struct dialplan_counters *dpc, struct ast_include *rinclude)
 {
 	struct ast_context *c;
-	char *exten = NULL, *context = NULL;
-	int context_existence = 0, extension_existence = 0;
-	/* Variables used for different counters */
-	int total_context = 0, total_exten = 0, total_prio = 0;
-	
-	if (argc != 3 && argc != 2) return -1;
-
-	/* we obtain [exten@]context? if yes, split them ... */
-	if (argc == 3) {
-		char *splitter = argv[2];
-		/* is there a '@' character? */
-		if (strchr(argv[2], '@')) {
-			/* yes, split into exten & context ... */
-			exten   = strsep(&splitter, "@");
-			context = splitter;
-
-			/* check for length and change to NULL if ast_strlen_zero() */
-			if (ast_strlen_zero(exten))   exten = NULL;
-			if (ast_strlen_zero(context)) context = NULL;
-		} else
-		{
-			/* no '@' char, only context given */
-			context = argv[2];
-			if (ast_strlen_zero(context)) context = NULL;
-		}
-	}
+	int res=0, old_total_exten = dpc->total_exten;
 
 	/* try to lock contexts */
 	if (ast_lock_contexts()) {
 		ast_log(LOG_WARNING, "Failed to lock contexts list\n");
-		return RESULT_FAILURE;
+		return -1;
 	}
 
 	/* walk all contexts ... */
-	c = ast_walk_contexts(NULL);
-	while (c) {
+	for (c = ast_walk_contexts(NULL); c ; c = ast_walk_contexts(c)) {
 		/* show this context? */
 		if (!context ||
 			!strcmp(ast_get_context_name(c), context)) {
-			context_existence = 1;
+			dpc->context_existence = 1;
 
 			/* try to lock context before walking in ... */
 			if (!ast_lock_context(c)) {
@@ -2867,39 +2849,44 @@
 				 * if we our extension only
 				 */
 				if (!exten) {
-					total_context++;
+					dpc->total_context++;
 					ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
 						ast_get_context_name(c), ast_get_context_registrar(c));
 					context_info_printed = 1;
 				}
 
 				/* walk extensions ... */
-				e = ast_walk_context_extensions(c, NULL);
-				while (e) {
+				for (e = ast_walk_context_extensions(c, NULL); e; e = ast_walk_context_extensions(c, e)) {
 					struct ast_exten *p;
 					int prio;
 
 					/* looking for extension? is this our extension? */
 					if (exten &&
-						strcmp(ast_get_extension_name(e), exten))
+						!ast_extension_match(ast_get_extension_name(e), exten))
 					{
 						/* we are looking for extension and it's not our
  						 * extension, so skip to next extension */
-						e = ast_walk_context_extensions(c, e);
 						continue;
 					}
 
-					extension_existence = 1;
+					dpc->extension_existence = 1;
 
 					/* may we print context info? */	
 					if (!context_info_printed) {
-						total_context++;
-						ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
-							ast_get_context_name(c),
-							ast_get_context_registrar(c));
+						dpc->total_context++;
+						if (rinclude) {
+							/* TODO Print more info about rinclude */
+							ast_cli(fd, "[ Included context '%s' created by '%s' ]\n",
+								ast_get_context_name(c),
+								ast_get_context_registrar(c));
+						} else {
+							ast_cli(fd, "[ Context '%s' created by '%s' ]\n",
+								ast_get_context_name(c),
+								ast_get_context_registrar(c));
+						}
 						context_info_printed = 1;
 					}
-					total_prio++;
+					dpc->total_prio++;
 
 					/* write extension name and first peer */	
 					bzero(buf, sizeof(buf));		
@@ -2922,11 +2909,10 @@
 					ast_cli(fd, "  %-17s %-45s [%s]\n", buf, buf2,
 						ast_get_extension_registrar(e));
 
-					total_exten++;
+					dpc->total_exten++;
 					/* walk next extension peers */
-					p = ast_walk_extension_priorities(e, e);
-					while (p) {
-						total_prio++;
+					for (p=ast_walk_extension_priorities(e, e); p; p=ast_walk_extension_priorities(e, p)) {
+						dpc->total_prio++;
 						bzero((void *)buf2, sizeof(buf2));
 						bzero((void *)buf, sizeof(buf));
 						if (ast_get_extension_label(p))
@@ -2946,71 +2932,102 @@
 
 						ast_cli(fd,"  %-17s %-45s [%s]\n",
 							buf, buf2,
-							ast_get_extension_registrar(p));	
-
-						p = ast_walk_extension_priorities(e, p);
+							ast_get_extension_registrar(p));
 					}
-					e = ast_walk_context_extensions(c, e);
 				}
 
-				/* include & ignorepat we all printing if we are not
-				 * looking for exact extension
-				 */
-				if (!exten) {
-					if (ast_walk_context_extensions(c, NULL))
-						ast_cli(fd, "\n");
-
-					/* walk included and write info ... */
-					i = ast_walk_context_includes(c, NULL);
-					while (i) {
-						bzero(buf, sizeof(buf));
-						snprintf(buf, sizeof(buf), "'%s'",
-							ast_get_include_name(i));
+				/* walk included and write info ... */
+				for (i = ast_walk_context_includes(c, NULL); i; i = ast_walk_context_includes(c, i)) {
+					bzero(buf, sizeof(buf));
+					snprintf(buf, sizeof(buf), "'%s'",
+						ast_get_include_name(i));
+					if (exten) {
+						/* Check all includes for the requested extension */
+						show_dialplan_helper(fd, (char *)ast_get_include_name(i), exten, dpc, i);
+					} else {
 						ast_cli(fd, "  Include =>        %-45s [%s]\n",
 							buf, ast_get_include_registrar(i));
-						i = ast_walk_context_includes(c, i);
 					}
+				}
 
-					/* walk ignore patterns and write info ... */
-					ip = ast_walk_context_ignorepats(c, NULL);
-					while (ip) {
-						bzero(buf, sizeof(buf));
-						snprintf(buf, sizeof(buf), "'%s'",
-							ast_get_ignorepat_name(ip));
+				/* walk ignore patterns and write info ... */
+				for (ip=ast_walk_context_ignorepats(c, NULL); ip; ip=ast_walk_context_ignorepats(c, ip)) {
+					const char *ipname = ast_get_ignorepat_name(ip);
+					char ignorepat[AST_MAX_EXTENSION];
+					snprintf(buf, sizeof(buf), "'%s'", ipname);
+					snprintf(ignorepat, sizeof(ignorepat), "_%s.", ipname);
+					if ((!exten) || ast_extension_match(ignorepat, exten)) {
 						ast_cli(fd, "  Ignore pattern => %-45s [%s]\n",
-							buf, ast_get_ignorepat_registrar(ip));	
-						ip = ast_walk_context_ignorepats(c, ip);
+							buf, ast_get_ignorepat_registrar(ip));
 					}
-					sw = ast_walk_context_switches(c, NULL);
-					while(sw) {
-						bzero(buf, sizeof(buf));
+				}
+				if (!rinclude) {
+					for (sw = ast_walk_context_switches(c, NULL); sw; sw = ast_walk_context_switches(c, sw)) {
 						snprintf(buf, sizeof(buf), "'%s/%s'",
 							ast_get_switch_name(sw),
 							ast_get_switch_data(sw));
 						ast_cli(fd, "  Alt. Switch =>    %-45s [%s]\n",
 							buf, ast_get_switch_registrar(sw));	
-						sw = ast_walk_context_switches(c, sw);
 					}
 				}
 	
 				ast_unlock_context(c);
 
 				/* if we print something in context, make an empty line */
-				if (context_info_printed) ast_cli(fd, "\n");
+				if (context_info_printed) ast_cli(fd, "\r\n");
 			}
 		}
-		c = ast_walk_contexts(c);
 	}
 	ast_unlock_contexts();
 
+	if (dpc->total_exten == old_total_exten) {
+		/* Nothing new under the sun */
+		return -1;
+	} else {
+		return res;
+	}
+}
+
+static int handle_show_dialplan(int fd, int argc, char *argv[])
+{
+	char *exten = NULL, *context = NULL;
+	/* Variables used for different counters */
+	struct dialplan_counters counters;
+
+	memset(&counters, 0, sizeof(counters));
+
+	if (argc != 2 && argc != 3) return -1;
+
+	/* we obtain [exten@]context? if yes, split them ... */
+	if (argc == 3) {
+		char *splitter = ast_strdupa(argv[2]);
+		/* is there a '@' character? */
+		if (splitter && strchr(argv[2], '@')) {
+			/* yes, split into exten & context ... */
+			exten   = strsep(&splitter, "@");
+			context = splitter;
+
+			/* check for length and change to NULL if ast_strlen_zero() */
+			if (ast_strlen_zero(exten))   exten = NULL;
+			if (ast_strlen_zero(context)) context = NULL;
+			show_dialplan_helper(fd, context, exten, &counters, NULL);
+		} else {
+			/* no '@' char, only context given */
+			context = argv[2];
+			if (ast_strlen_zero(context)) context = NULL;
+			show_dialplan_helper(fd, context, exten, &counters, NULL);
+		}
+	} else {
+		return RESULT_SHOWUSAGE;
+	}
+
 	/* check for input failure and throw some error messages */
-	if (context && !context_existence) {
-		ast_cli(fd, "There is no existence of '%s' context\n",
-			context);
+	if (context && !counters.context_existence) {
+		ast_cli(fd, "There is no existence of '%s' context\n", context);
 		return RESULT_FAILURE;
 	}
 
-	if (exten && !extension_existence) {
+	if (exten && !counters.extension_existence) {
 		if (context)
 			ast_cli(fd, "There is no existence of %s@%s extension\n",
 				exten, context);
@@ -3020,8 +3037,10 @@
 				exten);
 		return RESULT_FAILURE;
 	}
-	ast_cli(fd,"-= %d extensions (%d priorities) in %d contexts. =-\n",total_exten, total_prio, total_context);
-	
+
+	ast_cli(fd,"-= %d extensions (%d priorities) in %d contexts. =-\n",
+				counters.total_exten, counters.total_prio, counters.total_context);
+
 	/* everything ok */
 	return RESULT_SUCCESS;
 }




More information about the svn-commits mailing list