From 8f055cf8c4daa693b16fbd257399ab2e1ed2eed3 Mon Sep 17 00:00:00 2001 From: Tristan Riehs Date: Sun, 3 May 2026 21:42:52 +0200 Subject: Create a config module --- src/config.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/config.c (limited to 'src/config.c') diff --git a/src/config.c b/src/config.c new file mode 100644 index 0000000..c0d9409 --- /dev/null +++ b/src/config.c @@ -0,0 +1,75 @@ +#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); + } +} + +void ftag_config_init(char *config_file) +{ + const char *env_home = getenv("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"); + + if (config_file == NULL) { + /* Use default config file */ + /* TODO: prioritize XDG_CONFIG_HOME */ + config_file = malloc(CONFIG_STR_SIZE); + strbuild_with_size(config_file, CONFIG_STR_SIZE, + "%s/.config/ftag/ftag.conf", env_home); + } + + uconfig = NULL; + if (file_exists(config_file)) { + 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); + } + } +} + +const char *ftag_config_get(enum ftag_config_e key) +{ + return ftag_config_values[key]; +} + +void ftag_config_finalize(void) +{ + uconfig_destroy(uconfig); +} -- cgit v1.2.3