#include #include #include #include #include #include "config.h" #include "system.h" #include "utils.h" #define CONFIG_STR_SIZE 128 static struct uconfig_s *uconfig; static char *ftag_config_keys[FC_COUNT]; static char ftag_config_values[FC_COUNT][CONFIG_STR_SIZE]; static void ftag_config_read(enum ftag_config_e key) { char *new_value = uconfig_get(uconfig, ftag_config_keys[key]); if (new_value != NULL) { assert(strlen(new_value) < CONFIG_STR_SIZE); strcpy(ftag_config_values[key], new_value); } } static int ftag_config_load_file(const char *config_file) { if (!(config_file && file_exists(config_file))) return 0; uconfig = uconfig_new(config_file); if (uconfig == NULL) { fprintf(stderr, "%s: error during configuration file parsing\n", __func__); exit(EXIT_FAILURE); } for (enum ftag_config_e key = FC_FIRST; key < FC_COUNT; key++) { ftag_config_read(key); } return 1; } void ftag_config_init(const char *opt_config_file) { const char *env_xdg_config_home = getenv("XDG_CONFIG_HOME"); const char *env_home = getenv("HOME"); char config_file[512]; if (opt_config_file) { strbuild(config_file, "%s", opt_config_file); } else if (env_xdg_config_home) { strbuild(config_file, "%s/.config/ftag/ftag.conf", env_xdg_config_home); } else { assert(env_home); strbuild(config_file, "%s/.config/ftag/ftag.conf", env_home); } /* Keys */ ftag_config_keys[FC_DATABASE_PATH] = "database_path"; ftag_config_keys[FC_CACHE_DIR] = "cache_dir"; ftag_config_keys[FC_REMOTE_HOST] = "remote_host"; ftag_config_keys[FC_REMOTE_ROOT] = "remote_root"; /* Defaults */ strbuild(ftag_config_values[FC_DATABASE_PATH], "%s/.cache/ftag/ftag.sqlite3", env_home); strbuild(ftag_config_values[FC_CACHE_DIR], "%s/.cache/ftag", env_home); strcpy(ftag_config_values[FC_REMOTE_HOST], "localhost"); strcpy(ftag_config_values[FC_REMOTE_ROOT], "ftag"); uconfig = NULL; int config_loaded = 0; config_loaded = ftag_config_load_file(config_file); if (config_loaded) return; ftag_config_load_file(config_file); } const char *ftag_config_get(enum ftag_config_e key) { return ftag_config_values[key]; } void ftag_config_finalize(void) { if (uconfig) uconfig_destroy(uconfig); }