#include #include #include #include #include #include "config.h" #include "system.h" #include "utils.h" #define CONFIG_STR_SIZE 128 static char *ftag_config_keys[FC_COUNT]; static char ftag_config_values[FC_COUNT][CONFIG_STR_SIZE]; static void ftag_config_read(struct uconfig_s *uconfig, 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) { struct uconfig_s *uconfig; 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(uconfig, key); } uconfig_destroy(uconfig); 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) { if (!file_exists(opt_config_file)) { fprintf(stderr, "ftag: file %s does not exist\n", opt_config_file); exit(EXIT_FAILURE); } strbuild(config_file, "%s", opt_config_file); } else if (env_xdg_config_home) { strbuild(config_file, "%s/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"); 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) { }