diff options
author | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-04-20 18:23:24 +0000 |
---|---|---|
committer | russell <russell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-04-20 18:23:24 +0000 |
commit | 28472c738345af3d092c4fabd338a8ff1e73611f (patch) | |
tree | a916a6f504a9ac69db826e48eca6444b2796d5d9 | |
parent | f011109cce0aff92037ddb70c688543980474a0c (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: http://svn.digium.com/svn/asterisk/trunk@61691 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_voicemail.c | 6 | ||||
-rw-r--r-- | include/asterisk/config.h | 3 | ||||
-rw-r--r-- | main/config.c | 65 | ||||
-rw-r--r-- | main/manager.c | 10 |
4 files changed, 39 insertions, 45 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 408005a26..ba2da801d 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -839,7 +839,7 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword) ast_log(LOG_WARNING, "Failed to get category structure.\n"); break; } - ast_variable_update(cat, vmu->mailbox, new, NULL); + ast_variable_update(cat, vmu->mailbox, new, NULL, 0); } } /* save the results */ @@ -871,7 +871,7 @@ static void vm_change_password(struct ast_vm_user *vmu, const char *newpassword) break; } if (!var) - ast_variable_update(cat, "vmsecret", new, NULL); + ast_variable_update(cat, "vmsecret", new, NULL, 0); else ast_variable_append(cat, var); } @@ -3967,7 +3967,7 @@ static int vm_forwardoptions(struct ast_channel *chan, struct ast_vm_user *vmu, *duration += prepend_duration; msg_cat = ast_category_get(msg_cfg, "message"); snprintf(duration_str, 11, "%ld", *duration); - if (!ast_variable_update(msg_cat, "duration", duration_str, NULL)) { + if (!ast_variable_update(msg_cat, "duration", duration_str, NULL, 0)) { config_text_file_save(textfile, msg_cfg, "app_voicemail"); STORE(curdir, vmu->mailbox, context, curmsg, chan, vmu, vmfmts, *duration, vms); } diff --git a/include/asterisk/config.h b/include/asterisk/config.h index 4ebf7b63b..8eb9a95da 100644 --- a/include/asterisk/config.h +++ b/include/asterisk/config.h @@ -212,7 +212,8 @@ void ast_category_rename(struct ast_category *cat, const char *name); struct ast_variable *ast_variable_new(const char *name, const char *value); void ast_variable_append(struct ast_category *category, struct ast_variable *variable); int ast_variable_delete(struct ast_category *category, const char *variable, const char *match); -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); int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator); 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; } diff --git a/main/manager.c b/main/manager.c index 9c6f2af90..94eb202dd 100644 --- a/main/manager.c +++ b/main/manager.c @@ -1121,6 +1121,8 @@ static void handle_updates(struct mansession *s, const struct message *m, struct struct ast_variable *v; for (x=0;x<100000;x++) { + unsigned int object = 0; + snprintf(hdr, sizeof(hdr), "Action-%06d", x); action = astman_get_header(m, hdr); if (ast_strlen_zero(action)) @@ -1131,6 +1133,10 @@ static void handle_updates(struct mansession *s, const struct message *m, struct var = astman_get_header(m, hdr); snprintf(hdr, sizeof(hdr), "Value-%06d", x); value = astman_get_header(m, hdr); + if (!ast_strlen_zero(value) && *value == '>') { + object = 1; + value++; + } snprintf(hdr, sizeof(hdr), "Match-%06d", x); match = astman_get_header(m, hdr); if (!strcasecmp(action, "newcat")) { @@ -1151,7 +1157,7 @@ static void handle_updates(struct mansession *s, const struct message *m, struct ast_category_delete(cfg, cat); } else if (!strcasecmp(action, "update")) { if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) - ast_variable_update(category, var, value, match); + ast_variable_update(category, var, value, match, object); } else if (!strcasecmp(action, "delete")) { if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) ast_variable_delete(category, var, match); @@ -1159,7 +1165,7 @@ static void handle_updates(struct mansession *s, const struct message *m, struct if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat)) && (v = ast_variable_new(var, value))){ - if (match && !strcasecmp(match, "object")) + if (object || (match && !strcasecmp(match, "object"))) v->object = 1; ast_variable_append(category, v); } |