Allow updates to match specific lines, allow specification of object or

no when appending.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@38489 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Mark Spencer 19 years ago
parent 193aab348c
commit f2a6636210

@ -323,9 +323,10 @@ struct ast_config *ast_config_new(void)
return config; return config;
} }
int ast_variable_delete(struct ast_category *category, char *variable) int ast_variable_delete(struct ast_category *category, char *variable, char *match)
{ {
struct ast_variable *cur, *prev=NULL; struct ast_variable *cur, *prev=NULL, *curn;
int res = -1;
cur = category->root; cur = category->root;
while (cur) { while (cur) {
if (cur->name == variable) { if (cur->name == variable) {
@ -349,7 +350,8 @@ int ast_variable_delete(struct ast_category *category, char *variable)
prev = NULL; prev = NULL;
cur = category->root; cur = category->root;
while (cur) { while (cur) {
if (!strcasecmp(cur->name, variable)) { curn = cur->next;
if (!strcasecmp(cur->name, variable) && (ast_strlen_zero(match) || !strcasecmp(cur->value, match))) {
if (prev) { if (prev) {
prev->next = cur->next; prev->next = cur->next;
if (cur == category->last) if (cur == category->last)
@ -361,15 +363,16 @@ int ast_variable_delete(struct ast_category *category, char *variable)
} }
cur->next = NULL; cur->next = NULL;
ast_variables_destroy(cur); ast_variables_destroy(cur);
return 0; res = 0;
} } else
prev = cur; prev = cur;
cur = cur->next;
cur = curn;
} }
return -1; return res;
} }
int ast_variable_update(struct ast_category *category, char *variable, char *value) int ast_variable_update(struct ast_category *category, char *variable, char *value, char *match)
{ {
struct ast_variable *cur, *prev=NULL, *newer; struct ast_variable *cur, *prev=NULL, *newer;
newer = ast_variable_new(variable, value); newer = ast_variable_new(variable, value);
@ -379,6 +382,7 @@ int ast_variable_update(struct ast_category *category, char *variable, char *val
while (cur) { while (cur) {
if (cur->name == variable) { if (cur->name == variable) {
newer->next = cur->next; newer->next = cur->next;
newer->object = cur->object;
if (prev) if (prev)
prev->next = newer; prev->next = newer;
else else
@ -396,8 +400,9 @@ int ast_variable_update(struct ast_category *category, char *variable, char *val
prev = NULL; prev = NULL;
cur = category->root; cur = category->root;
while (cur) { while (cur) {
if (!strcasecmp(cur->name, variable)) { if (!strcasecmp(cur->name, variable) && (ast_strlen_zero(match) || !strcasecmp(cur->value, match))) {
newer->next = cur->next; newer->next = cur->next;
newer->object = cur->object;
if (prev) if (prev)
prev->next = newer; prev->next = newer;
else else

@ -182,8 +182,8 @@ void ast_category_rename(struct ast_category *cat, const char *name);
struct ast_variable *ast_variable_new(const char *name, const char *value); struct ast_variable *ast_variable_new(const char *name, const char *value);
void ast_variable_append(struct ast_category *category, struct ast_variable *variable); void ast_variable_append(struct ast_category *category, struct ast_variable *variable);
int ast_variable_delete(struct ast_category *category, char *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); int ast_variable_update(struct ast_category *category, char *variable, char *value, char *match);
int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator); int config_text_file_save(const char *filename, const struct ast_config *cfg, const char *generator);

@ -906,7 +906,7 @@ static void handle_updates(struct mansession *s, struct message *m, struct ast_c
{ {
int x; int x;
char hdr[40]; char hdr[40];
char *action, *cat, *var, *value; char *action, *cat, *var, *value, *match;
struct ast_category *category; struct ast_category *category;
struct ast_variable *v; struct ast_variable *v;
@ -921,6 +921,8 @@ static void handle_updates(struct mansession *s, struct message *m, struct ast_c
var = astman_get_header(m, hdr); var = astman_get_header(m, hdr);
snprintf(hdr, sizeof(hdr), "Value-%06d", x); snprintf(hdr, sizeof(hdr), "Value-%06d", x);
value = astman_get_header(m, hdr); value = astman_get_header(m, hdr);
snprintf(hdr, sizeof(hdr), "Match-%06d", x);
match = astman_get_header(m, hdr);
if (!strcasecmp(action, "newcat")) { if (!strcasecmp(action, "newcat")) {
if (!ast_strlen_zero(cat)) { if (!ast_strlen_zero(cat)) {
category = ast_category_new(cat); category = ast_category_new(cat);
@ -939,14 +941,16 @@ static void handle_updates(struct mansession *s, struct message *m, struct ast_c
ast_category_delete(cfg, cat); ast_category_delete(cfg, cat);
} else if (!strcasecmp(action, "update")) { } else if (!strcasecmp(action, "update")) {
if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat)))
ast_variable_update(category, var, value); ast_variable_update(category, var, value, match);
} else if (!strcasecmp(action, "delete")) { } else if (!strcasecmp(action, "delete")) {
if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat))) if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && (category = ast_category_get(cfg, cat)))
ast_variable_delete(category, var); ast_variable_delete(category, var, match);
} else if (!strcasecmp(action, "append")) { } else if (!strcasecmp(action, "append")) {
if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) && if (!ast_strlen_zero(cat) && !ast_strlen_zero(var) &&
(category = ast_category_get(cfg, cat)) && (category = ast_category_get(cfg, cat)) &&
(v = ast_variable_new(var, value))){ (v = ast_variable_new(var, value))){
if (match && !strcasecmp(match, "object"))
v->object = 1;
ast_variable_append(category, v); ast_variable_append(category, v);
} }
} }
@ -962,7 +966,8 @@ static char mandescr_updateconfig[] =
" Action-XXXXXX: Action to Take (NewCat,RenameCat,DelCat,Update,Delete,Append)\n" " Action-XXXXXX: Action to Take (NewCat,RenameCat,DelCat,Update,Delete,Append)\n"
" Cat-XXXXXX: Category to operate on\n" " Cat-XXXXXX: Category to operate on\n"
" Var-XXXXXX: Variable to work on\n" " Var-XXXXXX: Variable to work on\n"
" Value-XXXXXX: Value to work on\n"; " Value-XXXXXX: Value to work on\n"
" Match-XXXXXX: Extra match required to match line\n";
static int action_updateconfig(struct mansession *s, struct message *m) static int action_updateconfig(struct mansession *s, struct message *m)
{ {

Loading…
Cancel
Save