aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTristan Riehs <tristan.riehs@inria.fr>2026-05-03 21:42:52 +0200
committerTristan Riehs <tristan.riehs@inria.fr>2026-05-03 21:42:52 +0200
commit8f055cf8c4daa693b16fbd257399ab2e1ed2eed3 (patch)
treec54588bf33a320c4d5cde9a81afafc5aa2909fb5 /src
parent08f9d5ddd1233f973e6a613931f80cbebd4e39dd (diff)
Create a config module
Diffstat (limited to 'src')
-rw-r--r--src/config.c75
-rw-r--r--src/config.h16
2 files changed, 91 insertions, 0 deletions
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 <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <uconfig.h>
+
+#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);
+}
diff --git a/src/config.h b/src/config.h
index 82ffd6a..50cba3a 100644
--- a/src/config.h
+++ b/src/config.h
@@ -12,4 +12,20 @@
#define DATABASE_PATH FTAG_CACHE_DIR "/ftag.sqlite3"
+/* Note "FC" stands for "Ftag Config". */
+enum ftag_config_e {
+ FC_DATABASE_PATH,
+ FC_CACHE_DIR,
+ FC_REMOTE_HOST,
+ FC_REMOTE_ROOT,
+ FC_COUNT,
+ FC_FIRST = FC_DATABASE_PATH
+};
+
+void ftag_config_init(char *config_file);
+
+const char *ftag_config_get(enum ftag_config_e key);
+
+void ftag_config_destroy(void);
+
#endif