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=NULL, *matchvar = NULL;
+ struct ast_variable *cur, *prev = NULL, *newer = NULL;
+ struct ast_variable *matchcur = NULL, *matchprev = NULL;
+ /* Find the last match. See comments in ast_variable_retrieve,
+ * but this ensures updating config sections that inherit from
+ * templates works properly. */
for (cur = category->root; cur; prev = cur, cur = cur->next) {
- if (strcasecmp(cur->name, variable) ||
- (!ast_strlen_zero(match) && strcasecmp(cur->value, match)))
+ if (strcasecmp(cur->name, variable) || (!ast_strlen_zero(match) && strcasecmp(cur->value, match))) {
+ /* Not the same variable,
+ * or its value doesn't match. */
continue;
- matchvar = cur;
+ }
+ matchprev = prev;
+ matchcur = cur;
}
- for (cur = category->root; cur; prev = cur, cur = cur->next) {
- if (cur != matchvar) {
- continue;
- }
- if (!(newer = ast_variable_new(variable, value, cur->file)))
- return -1;
+ if (!matchcur) {
+ /* Could not find variable to update */
+ return -1;
+ }
- ast_variable_move(newer, cur);
- newer->object = newer->object || object;
+ /* Restore pointers from the matching var */
+ prev = matchprev;
+ cur = matchcur;
- /* Replace the old node in the list with the new node. */
- newer->next = cur->next;
- if (prev)
- prev->next = newer;
- else
- category->root = newer;
- if (category->last == cur)
- category->last = newer;
+ if (!(newer = ast_variable_new(variable, value, cur->file))) {
+ return -1;
+ }
- ast_variable_destroy(cur);
+ ast_variable_move(newer, cur);
+ newer->object = newer->object || object;
- return 0;
+ /* Replace the old node in the list with the new node. */
+ newer->next = cur->next;
+ if (prev) {
+ prev->next = newer;
+ } else {
+ category->root = newer;
+ }
+ if (category->last == cur) {
+ category->last = newer;
}
- /* Could not find variable to update */
- return -1;
+ ast_variable_destroy(cur);
+ return 0;
}
struct ast_category *ast_category_delete(struct ast_config *config,