#include #include #include "action.h" #include "block.h" #include "any_log.h" void action_perform(action_t *action, block_t *block, config_t *config) { for (size_t i = 0; i < action->length; i++) { const char *key = action->parts[i].key; const char *value = action->parts[i].value; if (strncmp(key, "block.", 6)) abort(); int sep = 6; while (key[sep] != '.' && key[sep] != '\0') sep++; if (key[sep] == '\0') abort(); block_t *target = NULL; for (size_t i = 0; i < config->n_blocks; i++) { size_t length = strlen(config->blocks[i]->label); if (length == (sep - 6) && !strncmp(key + 6, config->blocks[i]->label, length)) { target = config->blocks[i]; break; } } if (target == NULL) abort(); if (target->scheme->change_fn == NULL) { log_warn("Block '%s' does not support changing values", target->label); continue; } block_change(target, key, value); } log_debug("Performed action '%s'", action->label); } int action_validate(action_t *action, config_t *config) { // TODO return 0; } void action_free(action_t *action) { for (size_t i = 0; i < action->length; i++) { free(action->parts[i].key); free(action->parts[i].value); } free(action->parts); free(action->label); }