/* * uci_config.c * * Created on: Aug 2, 2012 * Author: lamikr */ #include "uci_config.h" #include "../log.h" int uci_create_named_section(struct uci_context *ctx, const char *conf_fname_base, const char *section_type, const char *section_name, bool save_immediately) { struct uci_ptr ptr; int ret_val; char *cmd_data; int len; ret_val = -1; if ((ctx != NULL) && (conf_fname_base != NULL) && (section_type != NULL) && (section_name != NULL)) { len = strlen(conf_fname_base); len = len + 1; len = len + strlen(section_type); len = len + 1; len = len + strlen(section_name); len = len + 1; cmd_data = malloc(len); if (cmd_data != NULL) { snprintf(cmd_data, len, "%s.%s=%s", conf_fname_base, section_name, section_type); if (uci_lookup_ptr(ctx, &ptr, cmd_data, true) == UCI_OK) { ret_val = uci_set(ctx, &ptr); if (ret_val == UCI_OK) { if (save_immediately) { ret_val = uci_save(ctx, ptr.p); } } } free(cmd_data); } } return ret_val; } bool uci_set_config_value(struct uci_context *ctx, struct uci_package *pkg, const char *conf_fname_base, const char *conf_fname_full, const char *section_type, const char *section_name, const char *key, const char *value, const bool save_immediately) { struct uci_section *sct; struct uci_section *tmp_sct; int err_flg; struct uci_element *elem; struct uci_ptr ptr; bool ret_val; ret_val = false; err_flg = UCI_OK; if ((ctx != NULL) && (pkg != NULL) && (section_type != NULL) && (section_name != NULL) && (key != NULL) && (value != NULL)) { sct = NULL; uci_foreach_element(&pkg->sections, elem) { tmp_sct = uci_to_section(elem); if (tmp_sct != NULL) { if (strcmp(tmp_sct->type, section_type) == 0) { sct = tmp_sct; break; } else { //TODO: uci_free_section(tmp_sct); ?, or will uci_free_contect(ctx) also free the section } } } if (sct == NULL) { //log_debug("Creating new section %s to configuration file: %s\n", section_name, conf_fname_full); //err_flg = uci_add_named_section(ctx, pkg, section_type, section_name, &sct); //err_flg = uci_add_section(ctx, pkg, section_name, &sct); err_flg = uci_create_named_section(ctx, conf_fname_base, section_type, section_name, false); if (err_flg == UCI_OK) { uci_foreach_element(&pkg->sections, elem) { tmp_sct = uci_to_section(elem); if (strcmp(tmp_sct->type, section_type) == 0) { sct = tmp_sct; break; } } } //TODO: uci_free_section(sct); ?, or will uci_free_contect(ctx) also free the section } if (err_flg == UCI_OK) { memset(&ptr, 0, sizeof(ptr)); ptr.package = pkg->e.name; ptr.section = sct->e.name; ptr.option = key; err_flg = uci_lookup_ptr(ctx, &ptr, NULL, false); if (err_flg == UCI_OK) { ptr.value = value; err_flg = uci_set(ctx, &ptr); log_debug("file: %s, section_key: %s/%s: value: %s.\n", conf_fname_full, section_name, key, value); if (err_flg == UCI_OK) { if (save_immediately == true) { err_flg = uci_save(ctx, pkg); if (err_flg == UCI_OK) { ret_val = true; } else { log_error("Failed to set value to configuration file: %s. Could not save the file.\n", conf_fname_full); } } else { ret_val = true; } } else { log_error("Failed to set value to configuration file: %s. Could not set new value.\n", conf_fname_full); } } else { log_error("Failed to set value to configuration file: %s. Could not look-up pointer for package %s section %s.\n", conf_fname_full, pkg->e.name, sct->e.name); } } else { log_error("Failed to set value to configuration file: %s. Could not create section %s.\n", conf_fname_full, section_name); } } else { log_error("Failed to set value to configuration file, invalid parameters\n"); } return ret_val; } char *uci_get_config_value(struct uci_context *ctx, struct uci_package *pkg, const char *section_name, const char *key_name) { struct uci_section *section; struct uci_option *option; char *ret_val; ret_val = NULL; if ((ctx != NULL) && (pkg != NULL)) { section = uci_lookup_section(ctx, pkg, section_name); if (section != NULL) { option = uci_lookup_option(ctx, section, key_name); if (option != NULL) { switch (option->type) { case UCI_TYPE_STRING: //log_debug("key: %s option name: %s, value: %s\n", key.c_str(), option->e.name, option->v.string); ret_val = option->v.string; break; default: log_error("Failed to read configuration value for key: %s\n", key_name); break; } } else { log_error("Failed to find configuration key: %s\n", key_name); } } else { log_error("Failed to find configuration section name: %s\n", section_name); } } return ret_val; } bool uci_save_config_values(struct uci_context *ctx, struct uci_package *pkg) { bool ret_val; int err_flg; if ((ctx != NULL) && (pkg != NULL)) { err_flg = uci_save(ctx, pkg); if (err_flg == UCI_OK) { ret_val = true; } else { log_error("Could not save configuration file.\n"); } } return ret_val; }