aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-01-13 18:30:49 +0000
committermogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b>2006-01-13 18:30:49 +0000
commitf94feca2c56f917573ddbfe2138f3cc6bb6e30fa (patch)
tree12104c60901cd2c3c369da8ba91c5ab84a1a6ed0
parent5af8c4e9eba73dd65ff9f9b1dd652e125245e99f (diff)
Made chan_agent code parsing more robust and
implemented new macro code. from 6228. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@8064 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_agent.c59
-rw-r--r--include/asterisk/app.h13
2 files changed, 50 insertions, 22 deletions
diff --git a/channels/chan_agent.c b/channels/chan_agent.c
index 534b0ee75..5b1679e2b 100644
--- a/channels/chan_agent.c
+++ b/channels/chan_agent.c
@@ -288,17 +288,17 @@ static void agent_unlink(struct agent_pvt *agent)
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 void agent_unlink(struct agent_pvt *agent)
*/
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);
+ 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).
- 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 {
+ /* 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) {
diff --git a/include/asterisk/app.h b/include/asterisk/app.h
index 4cae463e8..ace498286 100644
--- a/include/asterisk/app.h
+++ b/include/asterisk/app.h
@@ -229,6 +229,19 @@ int ast_app_group_match_get_count(const char *groupmatch, const char *category);
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