[asterisk-commits] trunk - r8064 in /trunk: channels/chan_agent.c include/asterisk/app.h

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Fri Jan 13 12:30:50 CST 2006


Author: mogorman
Date: Fri Jan 13 12:30:49 2006
New Revision: 8064

URL: http://svn.digium.com/view/asterisk?rev=8064&view=rev
Log:
Made chan_agent code parsing more robust and
implemented new macro code. from 6228.

Modified:
    trunk/channels/chan_agent.c
    trunk/include/asterisk/app.h

Modified: trunk/channels/chan_agent.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_agent.c?rev=8064&r1=8063&r2=8064&view=diff
==============================================================================
--- trunk/channels/chan_agent.c (original)
+++ trunk/channels/chan_agent.c Fri Jan 13 12:30:49 2006
@@ -288,17 +288,17 @@
 	struct agent_pvt *p, *prev;
 	prev = NULL;
 	p = agents;
-	// Iterate over all agents looking for the one.
+	/* Iterate over all agents looking for the one. */
 	while(p) {
 		if (p == agent) {
-			// Once it wal found, check if it is the first one.
+			/* Once it was found, check if it is the first one. */
 			if (prev)
-				// If it is not, tell the previous agent that the next one is the next one of the current (jumping the current).
+				/* If it is not, tell the previous agent that the next one is the next one of the current (jumping the current). */
 				prev->next = agent->next;
 			else
-				// If it is the first one, just change the general pointer to point to the second one.
+				/* If it is the first one, just change the general pointer to point to the second one. */
 				agents = agent->next;
-			// We are done.
+			/* We are done. */
 			break;
 		}
 		prev = p;
@@ -316,32 +316,47 @@
  */
 static struct agent_pvt *add_agent(char *agent, int pending)
 {
-	int argc;
-	char *argv[3];
-	char *args;
+	char *parse;
+	AST_DECLARE_APP_ARGS(args,
+		AST_APP_ARG(agt);
+		AST_APP_ARG(password);
+		AST_APP_ARG(name);
+	);
 	char *password = NULL;
 	char *name = NULL;
 	char *agt = NULL;
 	struct agent_pvt *p, *prev;
 
-	args = ast_strdupa(agent);
-
-	// Extract username (agt), password and name from agent (args).
-	if ((argc = ast_app_separate_args(args, ',', argv, sizeof(argv) / sizeof(argv[0])))) {
-		agt = argv[0];
-		if (argc > 1) {
-			password = argv[1];
-			while (*password && *password < 33) password++;
-		} 
-		if (argc > 2) {
-			name = argv[2];
-			while (*name && *name < 33) name++;
-		}
-	} else {
+	parse = ast_strdupa(agent);
+	if (!parse) {
+		ast_log(LOG_ERROR, "Out of memory!\n");
+		return NULL;
+	}
+
+	/* Extract username (agt), password and name from agent (args). */
+	AST_NONSTANDARD_APP_ARGS(args, parse, ',');
+
+	if(args.argc == 0) {
 		ast_log(LOG_WARNING, "A blank agent line!\n");
+		return NULL;
+	}
+
+	if(ast_strlen_zero(args.agt) ) {
+		ast_log(LOG_WARNING, "An agent line with no agentid!\n");
+		return NULL;
+	} else
+		agt = args.agt;
+
+	if(!ast_strlen_zero(args.password)) {
+		password = args.password;
+		while (*password && *password < 33) password++;
+	}
+	if(!ast_strlen_zero(args.name)) {
+		name = args.name;
+		while (*name && *name < 33) name++;
 	}
 	
-	// Are we searching for the agent here ? to see if it exists already ?
+	/* Are we searching for the agent here ? To see if it exists already ? */
 	prev=NULL;
 	p = agents;
 	while(p) {

Modified: trunk/include/asterisk/app.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/app.h?rev=8064&r1=8063&r2=8064&view=diff
==============================================================================
--- trunk/include/asterisk/app.h (original)
+++ trunk/include/asterisk/app.h Fri Jan 13 12:30:49 2006
@@ -229,6 +229,19 @@
 	args.argc = ast_app_separate_args(parse, '|', args.argv, (sizeof(args) - sizeof(args.argc)) / sizeof(args.argv[0]))
 	
 /*!
+  \brief Performs the 'nonstandard' argument separation process for an application.
+  \param args An argument structure defined using AST_DECLARE_APP_ARGS
+  \param parse A modifiable buffer containing the input to be parsed
+  \param sep A nonstandard separator character
+
+  This function will separate the input string using the nonstandard argument
+  separator character and fill in the provided structure, including
+  the argc argument counter field.
+ */
+#define AST_NONSTANDARD_APP_ARGS(args, parse, sep) \
+	args.argc = ast_app_separate_args(parse, sep, args.argv, (sizeof(args) - sizeof(args.argc)) / sizeof(args.argv[0]))
+	
+/*!
   \brief Separate a string into arguments in an array
   \param buf The string to be parsed (this must be a writable copy, as it will be modified)
   \param delim The character to be used to delimit arguments



More information about the asterisk-commits mailing list