[asterisk-commits] russell: branch 1.4 r61690 - in /branches/1.4:
apps/ include/asterisk/ main/
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Apr 20 11:19:19 MST 2007
Author: russell
Date: Fri Apr 20 13:19:18 2007
New Revision: 61690
URL: http://svn.digium.com/view/asterisk?view=rev&rev=61690
Log:
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)
Modified:
branches/1.4/apps/app_voicemail.c
branches/1.4/include/asterisk/config.h
branches/1.4/main/config.c
branches/1.4/main/manager.c
Modified: branches/1.4/apps/app_voicemail.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/apps/app_voicemail.c?view=diff&rev=61690&r1=61689&r2=61690
==============================================================================
--- branches/1.4/apps/app_voicemail.c (original)
+++ branches/1.4/apps/app_voicemail.c Fri Apr 20 13:19:18 2007
@@ -798,7 +798,7 @@
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 */
@@ -830,7 +830,7 @@
break;
}
if (!var)
- ast_variable_update(cat, "vmsecret", new, NULL);
+ ast_variable_update(cat, "vmsecret", new, NULL, 0);
else
ast_variable_append(cat, var);
}
@@ -3842,7 +3842,7 @@
*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);
}
Modified: branches/1.4/include/asterisk/config.h
URL: http://svn.digium.com/view/asterisk/branches/1.4/include/asterisk/config.h?view=diff&rev=61690&r1=61689&r2=61690
==============================================================================
--- branches/1.4/include/asterisk/config.h (original)
+++ branches/1.4/include/asterisk/config.h Fri Apr 20 13:19:18 2007
@@ -184,7 +184,8 @@
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, char *variable, char *match);
-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);
int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator);
Modified: branches/1.4/main/config.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/config.c?view=diff&rev=61690&r1=61689&r2=61690
==============================================================================
--- branches/1.4/main/config.c (original)
+++ branches/1.4/main/config.c Fri Apr 20 13:19:18 2007
@@ -467,54 +467,41 @@
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;
- }
-
- 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;
- }
+
+ newer->object = object;
+
+ 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;
}
Modified: branches/1.4/main/manager.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/manager.c?view=diff&rev=61690&r1=61689&r2=61690
==============================================================================
--- branches/1.4/main/manager.c (original)
+++ branches/1.4/main/manager.c Fri Apr 20 13:19:18 2007
@@ -1068,6 +1068,8 @@
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))
@@ -1078,6 +1080,10 @@
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")) {
@@ -1098,7 +1104,7 @@
ast_category_delete(cfg, (char *) 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, (char *) var, (char *) value, (char *) 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, (char *) var, (char *) match);
@@ -1106,7 +1112,7 @@
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);
}
More information about the asterisk-commits
mailing list