[Asterisk-cvs] asterisk/apps app_dial.c,1.109,1.110

markster at lists.digium.com markster at lists.digium.com
Sun Nov 28 17:09:50 CST 2004


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

Modified Files:
	app_dial.c 
Log Message:
Implement max # of forwards (bug #2942, different strategy)


Index: app_dial.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_dial.c,v
retrieving revision 1.109
retrieving revision 1.110
diff -u -d -r1.109 -r1.110
--- app_dial.c	22 Nov 2004 22:40:06 -0000	1.109
+++ app_dial.c	28 Nov 2004 22:08:44 -0000	1.110
@@ -122,6 +122,7 @@
 	int allowdisconnect_in;
 	int allowdisconnect_out;
 	int forcecallerid;
+	int forwards;
 	struct localuser *next;
 };
 
@@ -141,6 +142,8 @@
 	}
 }
 
+#define AST_MAX_FORWARDS   8
+
 #define AST_MAX_WATCHERS 256
 
 #define HANDLE_CAUSE(blah, bleh) do { \
@@ -255,12 +258,21 @@
 						tech = "Local";
 					}
 					/* Before processing channel, go ahead and check for forwarding */
-					if (option_verbose > 2)
-						ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
-					/* Setup parameters */
-					o->chan = ast_request(tech, in->nativeformats, stuff, &cause);
+					o->forwards++;
+					if (o->forwards < AST_MAX_FORWARDS) {
+						if (option_verbose > 2)
+							ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", in->name, tech, stuff, o->chan->name);
+						/* Setup parameters */
+						o->chan = ast_request(tech, in->nativeformats, stuff, &cause);
+						if (!o->chan)
+							ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
+					} else {
+						if (option_verbose > 2)
+							ast_verbose(VERBOSE_PREFIX_3 "Too many forwards from %s\n", o->chan->name);
+						cause = AST_CAUSE_CONGESTION;
+						o->chan = NULL;
+					}
 					if (!o->chan) {
-						ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
 						o->stillgoing = 0;
 						HANDLE_CAUSE(cause, in);
 					} else {
@@ -804,14 +816,23 @@
 				stuff = tmpchan;
 				tech = "Local";
 			}
-			/* Before processing channel, go ahead and check for forwarding */
-			if (option_verbose > 2)
-				ast_verbose(VERBOSE_PREFIX_3 "Forwarding %s to '%s/%s' (thanks to %s)\n", chan->name, tech, stuff, tmp->chan->name);
-			/* Setup parameters */
-			ast_hangup(tmp->chan);
-			tmp->chan = ast_request(tech, chan->nativeformats, stuff, &cause);
+			tmp->forwards++;
+			if (tmp->forwards < AST_MAX_FORWARDS) {
+				if (option_verbose > 2)
+					ast_verbose(VERBOSE_PREFIX_3 "Now forwarding %s to '%s/%s' (thanks to %s)\n", chan->name, tech, stuff, tmp->chan->name);
+				ast_hangup(tmp->chan);
+				/* Setup parameters */
+				tmp->chan = ast_request(tech, chan->nativeformats, stuff, &cause);
+				if (!tmp->chan)
+					ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause = %d)\n", tech, stuff, cause);
+			} else {
+				if (option_verbose > 2)
+					ast_verbose(VERBOSE_PREFIX_3 "Too many forwards from %s\n", tmp->chan->name);
+				ast_hangup(tmp->chan);
+				tmp->chan = NULL;
+				cause = AST_CAUSE_CONGESTION;
+			}
 			if (!tmp->chan) {
-				ast_log(LOG_NOTICE, "Unable to create local channel for call forward to '%s/%s' (cause %d)\n", tech, stuff, cause);
 				HANDLE_CAUSE(cause, chan);
 				cur = rest;
 				continue;




More information about the svn-commits mailing list