From 0cb07a4fdfcb616285b2871b4c78e5de7938c2a8 Mon Sep 17 00:00:00 2001 From: russell Date: Fri, 20 Apr 2007 18:19:18 +0000 Subject: 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: http://svn.digium.com/svn/asterisk/branches/1.4@61690 f38db490-d61c-443f-a65b-d21fe96a405b --- main/config.c | 65 ++++++++++++++++++++++++----------------------------------- 1 file changed, 26 insertions(+), 39 deletions(-) (limited to 'main/config.c') diff --git a/main/config.c b/main/config.c index 153478c08..9dafa72fd 100644 --- a/main/config.c +++ b/main/config.c @@ -467,54 +467,41 @@ int ast_variable_delete(struct ast_category *category, char *variable, char *mat return res; } -int ast_variable_update(struct ast_category *category, char *variable, char *value, 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; } -- cgit v1.2.3