X-Git-Url: http://pilppa.org/gitweb/?p=libplp.git;a=blobdiff_plain;f=src%2Fconfig.c;h=9c479a0e255e70c8dac7c6217849cc6c4d49ca79;hp=32f0a93b63ee0d5c1b30819e69031874d44f9d65;hb=860d8c023b82eeca9833d4a3f534c6d11a9523f3;hpb=65f22bbea2531f7cd492d6108b8902f92b7750a8 diff --git a/src/config.c b/src/config.c index 32f0a93..9c479a0 100644 --- a/src/config.c +++ b/src/config.c @@ -4,158 +4,150 @@ #include #include +#include "private/uci_config.h" #include "config.h" #include "log.h" -static int uci_create_named_section(struct uci_context *ctx, - const char *conf_file_name, - const char *section_type, - const char *section_name) -{ - struct uci_ptr ptr; - int ret_val; - char *cmd_data; - int len; - - ret_val = -1; - if ((ctx != NULL) && - (conf_file_name != NULL) && - (section_type != NULL) && - (section_name != NULL)) { - len = strlen(conf_file_name); - 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_file_name, 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) { - ret_val = uci_save(ctx, ptr.p); - } - } - free(cmd_data); - } - } - return ret_val; -} - -bool set_config_value_to_section(const char *conf_dir_name, - const char *conf_file_name, +bool set_config_value_and_save(const char *conf_dir_name, + const char *conf_file_basename, const char *section_type, const char *section_name, const char *key, const char *value) { struct uci_context *ctx; struct uci_package *pkg; - struct uci_section *sct; - struct uci_section *tmp_sct; int err_flg; - char *fname; + char *conf_fname_full; int b_count; - struct uci_element *elem; - struct uci_ptr ptr; FILE *fp; bool ret_val; ret_val = false; + pkg = NULL; if ((conf_dir_name != NULL) && - (conf_file_name != NULL) && + (conf_file_basename != NULL) && (section_type != NULL) && (section_name != NULL) && (key != NULL) && (value != NULL)) { - b_count = strlen(conf_dir_name) + strlen(conf_file_name) + 10; - fname = (char *)calloc(1, b_count); - if (fname != NULL) { - strncpy(fname, conf_dir_name, b_count); - strncat(fname, "/", 1); - strncat(fname, conf_file_name, strlen(conf_file_name) + 1); + b_count = strlen(conf_dir_name) + strlen(conf_file_basename) + 10; + conf_fname_full = (char *)calloc(1, b_count); + if (conf_fname_full != NULL) { + strncpy(conf_fname_full, conf_dir_name, b_count); + strncat(conf_fname_full, "/", 1); + strncat(conf_fname_full, conf_file_basename, strlen(conf_file_basename) + 1); ctx = uci_alloc_context(); if (ctx != NULL) { - sct = NULL; - uci_set_confdir(ctx, conf_dir_name); - if (access(fname, W_OK) != 0) { - if (access(fname, F_OK) != 0) { - fp = fopen(fname, "w+"); + if (access(conf_fname_full, W_OK) != 0) { + // if file is not writable, try to change it to be writable + if (access(conf_fname_full, F_OK) != 0) { + fp = fopen(conf_fname_full, "w+"); fclose(fp); } } - if (access(fname, W_OK) == 0) { - err_flg = uci_load(ctx, fname, &pkg); - uci_foreach_element(&pkg->sections, elem) { - tmp_sct = uci_to_section(elem); - if (strcmp(tmp_sct->type, section_type) == 0) { - sct = tmp_sct; - break; - } - } - if (sct == NULL) { - log_debug("Creating new section %s to configuration file: %s\n", section_name, fname); - //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_file_name, + if (access(conf_fname_full, W_OK) == 0) { + uci_set_confdir(ctx, + conf_dir_name); + err_flg = uci_load(ctx, conf_fname_full, &pkg); + if ((err_flg == UCI_OK) && + (pkg != NULL)) { + ret_val = uci_set_config_value(ctx, + pkg, + conf_file_basename, + conf_fname_full, section_type, - section_name); - 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; - } - } - } + section_name, + key, + value, + true); } - 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); - if (err_flg == UCI_OK) { - err_flg = uci_save(ctx, pkg); - if (err_flg == UCI_OK) { - ret_val = true; - log_debug("Set value to section %s in configuration file: %s\n", section_name, fname); - } - else { - log_error("Failed to set value to configuration file: %s\n. Could not save the file\n", fname); - } + else { + log_error("Failed to set value to configuration file: %s. Could not load current file content.\n", conf_fname_full); + } + } + else { + log_error("Failed to set value to configuration file: %s. File does not exist or is not writable\n", conf_fname_full); + } + //TODO: uci_free_package(pkg) ?, or will uci_free_contect(ctx) also free the package + uci_free_context(ctx); + } + free(conf_fname_full); + } + else { + log_error("Failed to set value to configuration file: %s/%s, out of memory\n", conf_dir_name, conf_file_basename); + } + } + else { + log_error("Failed to set value to configuration file, invalid parameters\n"); + } + return ret_val; +} + +char* get_config_value_and_close(const char *conf_dir_name, + const char *conf_file_basename, + const char *section_name, + const char *key) { + struct uci_context *ctx; + struct uci_package *pkg; + int err_flg; + char *conf_fname_full; + int b_count; + FILE *fp; + char *ret_val; - } - else { - log_error("Failed to set value to configuration file: %s\n. Could not set new value\n", fname); - } - } - else { - log_error("Failed to set value to configuration file: %s\n. Could not look-up pointer for package %s section %s.\n", fname, pkg->e.name, sct->e.name); - } - uci_free_context(ctx); + ret_val = NULL; + pkg = NULL; + if ((conf_dir_name != NULL) && + (conf_file_basename != NULL) && + (section_name != NULL) && + (key != NULL)) { + b_count = strlen(conf_dir_name) + strlen(conf_file_basename) + 10; + conf_fname_full = (char *)calloc(1, b_count); + if (conf_fname_full != NULL) { + strncpy(conf_fname_full, conf_dir_name, b_count); + strncat(conf_fname_full, "/", 1); + strncat(conf_fname_full, conf_file_basename, strlen(conf_file_basename) + 1); + ctx = uci_alloc_context(); + if (ctx != NULL) { + if (access(conf_fname_full, R_OK) != 0) { + // if file is not writable, try to change it to be writable + if (access(conf_fname_full, R_OK) != 0) { + fp = fopen(conf_fname_full, "w+"); + fclose(fp); + } + } + if (access(conf_fname_full, R_OK) == 0) { + uci_set_confdir(ctx, + conf_dir_name); + err_flg = uci_load(ctx, conf_fname_full, &pkg); + if ((err_flg == UCI_OK) && + (pkg != NULL)) { + ret_val = uci_get_config_value(ctx, + pkg, + section_name, + key); + // need to duplicate response val, as uci_free_context() would free the value otherwise + if (ret_val != NULL) + ret_val = strdup(ret_val); } else { - log_error("Failed to set value to configuration file: %s. Could not create section %s.\n", fname, section_name); + log_error("Failed to get value from configuration file: %s. Could not load current file content.\n", conf_fname_full); } } else { - log_error("Failed to set value to configuration file: %s. File does not exist or is not writable\n.", fname); + log_error("Failed to get value from configuration file: %s. File does not exist or is not readable.\n", conf_fname_full); } + //TODO: uci_free_package(pkg) ?, or will uci_free_contect(ctx) also free the package + uci_free_context(ctx); } - free(fname); + free(conf_fname_full); } else { - log_error("Failed to set value to configuration file: %s, out of memory\n", fname); + log_error("Failed to get value from configuration file: %s/%s, out of memory.\n", conf_dir_name, conf_file_basename); } } else { - log_error("Failed to set value to configuration file, invalid parameters\n"); + log_error("Failed to get value from configuration file, invalid parameters.\n"); } return ret_val; }