[Asterisk-cvs] asterisk/res res_features.c,1.16.2.6,1.16.2.7

russell at lists.digium.com russell at lists.digium.com
Sun May 15 11:50:04 CDT 2005


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

Modified Files:
      Tag: v1-0
	res_features.c 
Log Message:
ensure that calls to gethostbyname are null terminated,
also use MAXHOSTNAMELEN where appropriate (bug #4198) (bug #4212)


Index: res_features.c
===================================================================
RCS file: /usr/cvsroot/asterisk/res/res_features.c,v
retrieving revision 1.16.2.6
retrieving revision 1.16.2.7
diff -u -d -r1.16.2.6 -r1.16.2.7
--- res_features.c	11 May 2005 03:16:52 -0000	1.16.2.6
+++ res_features.c	15 May 2005 15:55:31 -0000	1.16.2.7
@@ -58,6 +58,9 @@
 /* Context for which parking is made accessible */
 static char parking_con[AST_MAX_EXTENSION] = "parkedcalls";
 
+/* Context for dialback for parking (KLUDGE) */
+static char parking_con_dial[AST_MAX_EXTENSION] = "park-dial";
+
 /* Extension you type to park the call */
 static char parking_ext[AST_MAX_EXTENSION] = "700";
 
@@ -112,6 +115,7 @@
 	int priority;
 	int parkingtime;
 	int notquiteyet;
+	char peername[1024];
 	unsigned char moh_trys;
 	struct parkeduser *next;
 };
@@ -190,6 +194,8 @@
 				pu->parkingtime = parkingtime;
 			if (extout)
 				*extout = x;
+			if (peer)
+				strncpy(pu->peername, peer->name, sizeof(pu->peername) - 1);
 			/* Remember what had been dialed, so that if the parking
 			   expires, we try to come back to the same place */
 			if (!ast_strlen_zero(chan->macrocontext))
@@ -560,19 +566,21 @@
 	struct timeval tv;
 	struct ast_frame *f;
 	char exten[AST_MAX_EXTENSION];
+	char *peername,*cp;
+	char returnexten[AST_MAX_EXTENSION];
 	struct ast_context *con;
 	int x;
 	fd_set rfds, efds;
 	fd_set nrfds, nefds;
 	FD_ZERO(&rfds);
 	FD_ZERO(&efds);
+
 	for (;;) {
 		ms = -1;
 		max = -1;
 		ast_mutex_lock(&parking_lock);
 		pl = NULL;
 		pu = parkinglot;
-		gettimeofday(&tv, NULL);
 		FD_ZERO(&nrfds);
 		FD_ZERO(&nefds);
 		while(pu) {
@@ -582,17 +590,42 @@
 				pu = pu->next;
 				continue;
 			}
+			gettimeofday(&tv, NULL);
 			tms = (tv.tv_sec - pu->start.tv_sec) * 1000 + (tv.tv_usec - pu->start.tv_usec) / 1000;
 			if (tms > pu->parkingtime) {
-				/* They've been waiting too long, send them back to where they came.  Theoretically they
-				   should have their original extensions and such, but we copy to be on the safe side */
-				strncpy(pu->chan->exten, pu->exten, sizeof(pu->chan->exten)-1);
-				strncpy(pu->chan->context, pu->context, sizeof(pu->chan->context)-1);
-				pu->chan->priority = pu->priority;
-				if (option_verbose > 1) 
-					ast_verbose(VERBOSE_PREFIX_2 "Timeout for %s parked on %d. Returning to %s,%s,%d\n", pu->chan->name, pu->parkingnum, pu->chan->context, pu->chan->exten, pu->chan->priority);
 				/* Stop music on hold */
 				ast_moh_stop(pu->chan);
+				/* Get chan, exten from derived kludge */
+				if (pu->peername[0]) {
+					peername = ast_strdupa(pu->peername);
+					cp = strrchr(peername, '-');
+					if (cp) 
+						*cp = 0;
+					con = ast_context_find(parking_con_dial);
+					if (!con) {
+						con = ast_context_create(NULL, parking_con_dial, registrar);
+						if (!con) {
+							ast_log(LOG_ERROR, "Parking dial context '%s' does not exist and unable to create\n", parking_con_dial);
+						}
+					}
+					if (con) {
+						snprintf(returnexten, sizeof(returnexten), "%s||t", peername);
+						ast_add_extension2(con, 1, peername, 1, NULL, "Dial", strdup(returnexten), free, registrar);
+					}
+					strncpy(pu->chan->exten, peername, sizeof(pu->chan->exten) - 1);
+					strncpy(pu->chan->context, parking_con_dial, sizeof(pu->chan->context) - 1);
+					pu->chan->priority = 1;
+
+				} else {
+					/* They've been waiting too long, send them back to where they came.  Theoretically they
+					   should have their original extensions and such, but we copy to be on the safe side */
+					strncpy(pu->chan->exten, pu->exten, sizeof(pu->chan->exten)-1);
+					strncpy(pu->chan->context, pu->context, sizeof(pu->chan->context)-1);
+					pu->chan->priority = pu->priority;
+				}
+
+				if (option_verbose > 1) 
+					ast_verbose(VERBOSE_PREFIX_2 "Timeout for %s parked on %d. Returning to %s,%s,%d\n", pu->chan->name, pu->parkingnum, pu->chan->context, pu->chan->exten, pu->chan->priority);
 				/* Start up the PBX, or hang them up */
 				if (ast_pbx_start(pu->chan))  {
 					ast_log(LOG_WARNING, "Unable to restart the PBX for user on '%s', hanging them up...\n", pu->chan->name);
@@ -614,14 +647,17 @@
 					ast_log(LOG_WARNING, "Whoa, no parking context?\n");
 				free(pt);
 			} else {
-				for (x=0;x<AST_MAX_FDS;x++) {
+				for (x=0; x<AST_MAX_FDS; x++) {
 					if ((pu->chan->fds[x] > -1) && (FD_ISSET(pu->chan->fds[x], &rfds) || FD_ISSET(pu->chan->fds[x], &efds))) {
 						if (FD_ISSET(pu->chan->fds[x], &efds))
 							pu->chan->exception = 1;
+						else
+							pu->chan->exception = 0;	
 						pu->chan->fdno = x;
 						/* See if they need servicing */
 						f = ast_read(pu->chan);
 						if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass ==  AST_CONTROL_HANGUP))) {
+
 							/* There's a problem, hang them up*/
 							if (option_verbose > 1) 
 								ast_verbose(VERBOSE_PREFIX_2 "%s got tired of being parked\n", pu->chan->name);
@@ -646,7 +682,7 @@
 							/* XXX Maybe we could do something with packets, like dial "0" for operator or something XXX */
 							ast_frfree(f);
 							if (pu->moh_trys < 3 && !pu->chan->generatordata) {
-								ast_log(LOG_DEBUG, "MOH on parked call stopped by outside source.  Restarting\n");
+								ast_log(LOG_DEBUG, "MOH on parked call stopped by outside source.  Restarting.\n");
 								ast_moh_start(pu->chan, NULL);
 								pu->moh_trys++;
 							}
@@ -655,7 +691,7 @@
 					}
 				}
 				if (x >= AST_MAX_FDS) {
-std:					for (x=0;x<AST_MAX_FDS;x++) {
+std:					for (x=0; x<AST_MAX_FDS; x++) {
 						/* Keep this one for next one */
 						if (pu->chan->fds[x] > -1) {
 							FD_SET(pu->chan->fds[x], &nrfds);




More information about the svn-commits mailing list