diff options
author | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-13 18:30:49 +0000 |
---|---|---|
committer | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-01-13 18:30:49 +0000 |
commit | f94feca2c56f917573ddbfe2138f3cc6bb6e30fa (patch) | |
tree | 12104c60901cd2c3c369da8ba91c5ab84a1a6ed0 | |
parent | 5af8c4e9eba73dd65ff9f9b1dd652e125245e99f (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.c | 59 | ||||
-rw-r--r-- | include/asterisk/app.h | 13 |
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 |