static int service_update(struct service *s, struct blob_attr **tb, bool add) { struct blob_attr *cur; int rem; if (s->trigger) { trigger_del(s); free(s->trigger); s->trigger = NULL; } service_validate_del(s); if (tb[SERVICE_SET_TRIGGER] && blobmsg_data_len(tb[SERVICE_SET_TRIGGER])) { s->trigger = blob_memdup(tb[SERVICE_SET_TRIGGER]); if (!s->trigger) return -1; trigger_add(s->trigger, s); } if (tb[SERVICE_SET_VALIDATE] && blobmsg_data_len(tb[SERVICE_SET_VALIDATE])) { blobmsg_for_each_attr(cur, tb[SERVICE_SET_VALIDATE], rem) service_validate_add(s, cur); } if (tb[SERVICE_SET_INSTANCES]) { if (!add) vlist_update(&s->instances); blobmsg_for_each_attr(cur, tb[SERVICE_SET_INSTANCES], rem) { service_instance_add(s, cur); } if (!add) vlist_flush(&s->instances); }
int trigger_rename (struct t_trigger *trigger, const char *name) { int length, i; char *option_name; if (!name || !name[0] || !trigger_name_valid (name) || trigger_search (name)) { return 0; } length = strlen (name) + 64; option_name = malloc (length); if (!option_name) return 0; for (i = 0; i < TRIGGER_NUM_OPTIONS; i++) { if (trigger->options[i]) { snprintf (option_name, length, "%s.%s", name, trigger_option_string[i]); weechat_config_option_rename (trigger->options[i], option_name); } } if (trigger->name) free (trigger->name); trigger->name = strdup (name); free (option_name); /* re-insert trigger in list (for sorting triggers by name) */ if (trigger->prev_trigger) (trigger->prev_trigger)->next_trigger = trigger->next_trigger; else triggers = trigger->next_trigger; if (trigger->next_trigger) (trigger->next_trigger)->prev_trigger = trigger->prev_trigger; else last_trigger = trigger->prev_trigger; trigger_add (trigger, &triggers, &last_trigger); return 1; }
struct t_trigger * trigger_new_with_options (const char *name, struct t_config_option **options) { struct t_trigger *new_trigger; int i; new_trigger = trigger_alloc (name); if (!new_trigger) return NULL; for (i = 0; i < TRIGGER_NUM_OPTIONS; i++) { new_trigger->options[i] = options[i]; } trigger_add (new_trigger, &triggers, &last_trigger); triggers_count++; if (trigger_regex_split (weechat_config_string (new_trigger->options[TRIGGER_OPTION_REGEX]), &new_trigger->regex_count, &new_trigger->regex) < 0) { weechat_printf (NULL, _("%s%s: invalid regular expression in trigger " "\"%s\""), weechat_prefix ("error"), TRIGGER_PLUGIN_NAME, name); } trigger_split_command (weechat_config_string (new_trigger->options[TRIGGER_OPTION_COMMAND]), &new_trigger->commands_count, &new_trigger->commands); if (weechat_config_boolean (new_trigger->options[TRIGGER_OPTION_ENABLED])) trigger_hook (new_trigger); return new_trigger; }
int trigger_config_trigger_read_cb (const void *pointer, void *data, struct t_config_file *config_file, struct t_config_section *section, const char *option_name, const char *value) { char *pos_option, *trigger_name; struct t_trigger *ptr_temp_trigger; int index_option; /* make C compiler happy */ (void) pointer; (void) data; (void) config_file; (void) section; if (!option_name) return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; pos_option = strchr (option_name, '.'); if (!pos_option) return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; trigger_name = weechat_strndup (option_name, pos_option - option_name); if (!trigger_name) return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; pos_option++; /* search temporary trigger */ for (ptr_temp_trigger = triggers_temp; ptr_temp_trigger; ptr_temp_trigger = ptr_temp_trigger->next_trigger) { if (strcmp (ptr_temp_trigger->name, trigger_name) == 0) break; } if (!ptr_temp_trigger) { /* create new temporary trigger */ ptr_temp_trigger = trigger_alloc (trigger_name); if (ptr_temp_trigger) trigger_add (ptr_temp_trigger, &triggers_temp, &last_trigger_temp); } if (ptr_temp_trigger) { index_option = trigger_search_option (pos_option); if (index_option >= 0) { trigger_config_create_option_temp (ptr_temp_trigger, index_option, value); } else { weechat_printf (NULL, _("%sWarning: unknown option for section \"%s\": " "%s (value: \"%s\")"), weechat_prefix ("error"), TRIGGER_CONFIG_SECTION_TRIGGER, option_name, value); } } free (trigger_name); return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE; }