diff options
author | Russell Bryant <russell@russellbryant.com> | 2007-04-20 18:23:24 +0000 |
---|---|---|
committer | Russell Bryant <russell@russellbryant.com> | 2007-04-20 18:23:24 +0000 |
commit | 97d0661327bddf012b09cb045e4df2158b9500e9 (patch) | |
tree | a916a6f504a9ac69db826e48eca6444b2796d5d9 /main/config.c | |
parent | 49af71c100bb7ed62e1ccf4d235ccdb5579ee7d2 (diff) |
Merged revisions 61690 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r61690 | russell | 2007-04-20 13:19:18 -0500 (Fri, 20 Apr 2007) | 4 lines
Fix the UpdateConfig manager action to properly treat "variables" and "objects"
differently (a=b versus a=>b).
(issue #9568, reported by pari, patch by me)
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@61691 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/config.c')
-rw-r--r-- | main/config.c | 65 |
1 files changed, 26 insertions, 39 deletions
diff --git a/main/config.c b/main/config.c index 9bc97eac6..b1d30aa7c 100644 --- a/main/config.c +++ b/main/config.c @@ -468,54 +468,41 @@ int ast_variable_delete(struct ast_category *category, const char *variable, con return res; } -int ast_variable_update(struct ast_category *category, const char *variable, const char *value, const char *match) +int ast_variable_update(struct ast_category *category, const char *variable, + const char *value, const char *match, unsigned int object) { struct ast_variable *cur, *prev=NULL, *newer; - newer = ast_variable_new(variable, value); - if (!newer) + + if (!(newer = ast_variable_new(variable, value))) return -1; - cur = category->root; - while (cur) { - if (cur->name == variable) { - newer->next = cur->next; - newer->object = cur->object; - if (prev) - prev->next = newer; - else - category->root = newer; - if (category->last == cur) - category->last = newer; - cur->next = NULL; - ast_variables_destroy(cur); - return 0; - } - prev = cur; - cur = cur->next; - } + + newer->object = object; - prev = NULL; - cur = category->root; - while (cur) { - if (!strcasecmp(cur->name, variable) && (ast_strlen_zero(match) || !strcasecmp(cur->value, match))) { - newer->next = cur->next; - newer->object = cur->object; - if (prev) - prev->next = newer; - else - category->root = newer; - if (category->last == cur) - category->last = newer; - cur->next = NULL; - ast_variables_destroy(cur); - return 0; - } - prev = cur; - cur = cur->next; + for (cur = category->root; cur; prev = cur, cur = cur->next) { + if (strcasecmp(cur->name, variable) || + (!ast_strlen_zero(match) && strcasecmp(cur->value, match))) + continue; + + newer->next = cur->next; + newer->object = cur->object || object; + if (prev) + prev->next = newer; + else + category->root = newer; + if (category->last == cur) + category->last = newer; + + cur->next = NULL; + ast_variables_destroy(cur); + + return 0; } + if (prev) prev->next = newer; else category->root = newer; + return 0; } |