Made chan_agent code parsing more robust and
authorMatt O'Gorman <mogorman@digium.com>
Fri, 13 Jan 2006 18:30:49 +0000 (18:30 +0000)
committerMatt O'Gorman <mogorman@digium.com>
Fri, 13 Jan 2006 18:30:49 +0000 (18:30 +0000)
implemented new macro code. from 6228.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8064 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_agent.c
include/asterisk/app.h

index 534b0ee..5b1679e 100644 (file)
@@ -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) {
index 4cae463..ace4982 100644 (file)
@@ -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