#include #include #include #include #include #include "private/uci_config.h" #include "config.h" #include "log.h" 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; int err_flg; char *conf_fname_full; int b_count; FILE *fp; bool ret_val; ret_val = false; pkg = NULL; if ((conf_dir_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_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, 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(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, key, value, true); } 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; 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, &err_flg); // 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 get value from configuration file: %s. Could not load current file content.\n", conf_fname_full); } } else { 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(conf_fname_full); } else { 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 get value from configuration file, invalid parameters.\n"); } return ret_val; }