[Asterisk-cvs] asterisk/apps app_agi.c,1.31,1.32

jeremy at lists.digium.com jeremy at lists.digium.com
Tue Mar 23 07:53:51 CST 2004


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

Modified Files:
	app_agi.c 
Log Message:
fix agi to accept multiple arguments. Bug #664


Index: app_agi.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_agi.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- app_agi.c	12 Mar 2004 18:49:52 -0000	1.31
+++ app_agi.c	23 Mar 2004 12:50:15 -0000	1.32
@@ -95,7 +95,7 @@
 
 #define TONE_BLOCK_SIZE 200
 
-static int launch_script(char *script, char *args, int *fds, int *efd, int *opid)
+static int launch_script(char *script, char *argv[], int *fds, int *efd, int *opid)
 {
 	char tmp[256];
 	int pid;
@@ -159,7 +159,7 @@
 		for (x=STDERR_FILENO + 2;x<1024;x++) 
 			close(x);
 		/* Execute script */
-		execl(script, script, args, (char *)NULL);
+		execv(script, argv);
 		/* Can't use ast_log since FD's are closed */
 		fprintf(stderr, "Failed to execute '%s': %s\n", script, strerror(errno));
 		exit(1);
@@ -1429,12 +1429,13 @@
 {
 	int res=0;
 	struct localuser *u;
-	char *args,*ringy;
-	char tmp[256];
+	char *argv[MAX_ARGS];
+	char *tmp = (char *)data;
+	int argc = 0;
 	int fds[2];
 	int efd = -1;
 	int pid;
-	char *stringp=tmp;
+        char *stringp;
 	AGI agi;
 	if (!data || !strlen(data)) {
 		ast_log(LOG_WARNING, "AGI requires an argument (script)\n");
@@ -1443,28 +1444,22 @@
 
 
 	memset(&agi, 0, sizeof(agi));
-	strncpy(tmp, data, sizeof(tmp)-1);
-	strsep(&stringp, "|");
-	args = strsep(&stringp, "|");
-	ringy = strsep(&stringp,"|");
-	if (!args)
-		args = "";
+        while ((stringp = strsep(&tmp, "|"))) {
+		argv[argc++] = stringp;
+        }
+	argv[argc] = NULL;
+
 	LOCAL_USER_ADD(u);
 #if 0
 	 /* Answer if need be */
         if (chan->_state != AST_STATE_UP) {
-		if (ringy) { /* if for ringing first */
-			/* a little ringy-dingy first */
-		        ast_indicate(chan, AST_CONTROL_RINGING);  
-			sleep(3); 
-		}
 		if (ast_answer(chan)) {
 			LOCAL_USER_REMOVE(u);
 			return -1;
 		}
 	}
 #endif
-	res = launch_script(tmp, args, fds, enhanced ? &efd : NULL, &pid);
+	res = launch_script(argv[0], argv, fds, enhanced ? &efd : NULL, &pid);
 	if (!res) {
 		agi.fd = fds[1];
 		agi.ctrl = fds[0];




More information about the svn-commits mailing list