From b41bca63173d3c27fe3ba51612df20da9a795aea Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 29 Jul 2021 14:59:10 +0200 Subject: fall back to /etc for default configuration entry point --- src/util/configuration.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++-- src/util/gnunet-config.c | 1 - src/util/program.c | 31 ++++++++++------------ 3 files changed, 79 insertions(+), 20 deletions(-) (limited to 'src/util') diff --git a/src/util/configuration.c b/src/util/configuration.c index 875a811b3..776cfc7ea 100644 --- a/src/util/configuration.c +++ b/src/util/configuration.c @@ -1155,7 +1155,7 @@ GNUNET_CONFIGURATION_serialize_diagnostics (const struct GNUNET_buffer_write_fstr (&buf, "# Entry point: %s\n", cfg->main_filename ? cfg->main_filename : - ""); + ""); GNUNET_buffer_write_fstr (&buf, "#\n# Files Loaded:\n"); @@ -2253,6 +2253,58 @@ GNUNET_CONFIGURATION_load_from (struct GNUNET_CONFIGURATION_Handle *cfg, return fun_ret; } +char * +GNUNET_CONFIGURATION_default_filename (void) +{ + char *cfg_fn; + const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get (); + const char *xdg = getenv ("XDG_CONFIG_HOME"); + + if (NULL != xdg) + GNUNET_asprintf (&cfg_fn, + "%s%s%s", + xdg, + DIR_SEPARATOR_STR, + pd->config_file); + else + cfg_fn = GNUNET_strdup (pd->user_config_file); + + if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn)) + return cfg_fn; + + GNUNET_free (cfg_fn); + + /* Fall back to /etc/ for the default configuration. + Should be okay to use forward slashes here. */ + + GNUNET_asprintf (&cfg_fn, + "/etc/%s", + pd->config_file); + + if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn)) + return cfg_fn; + + GNUNET_free (cfg_fn); + + GNUNET_asprintf (&cfg_fn, + "/etc/%s", + pd->config_file); + + if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn)) + return cfg_fn; + + GNUNET_asprintf (&cfg_fn, + "/etc/%s/%s", + pd->project_dirname, + pd->config_file); + + if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn)) + return cfg_fn; + + GNUNET_free (cfg_fn); + return NULL; +} + struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_default (void) @@ -2284,7 +2336,9 @@ GNUNET_CONFIGURATION_default (void) if (GNUNET_OK != GNUNET_DISK_file_test (cfgname)) { GNUNET_free (cfgname); - GNUNET_asprintf (&cfgname, "/etc/%s/%s", pd->project_dirname, + GNUNET_asprintf (&cfgname, + "/etc/%s/%s", + pd->project_dirname, pd->config_file); } if (GNUNET_OK != GNUNET_DISK_file_test (cfgname)) @@ -2353,7 +2407,10 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, ipath = GNUNET_OS_installation_get_path (GNUNET_OS_IPK_DATADIR); if (NULL == ipath) + { + GNUNET_break (0); return GNUNET_SYSERR; + } GNUNET_asprintf (&baseconfig, "%s%s", ipath, "config.d"); GNUNET_free (ipath); } @@ -2364,6 +2421,9 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, if ((GNUNET_YES == GNUNET_DISK_directory_test (dname, GNUNET_YES))&& (GNUNET_SYSERR == GNUNET_CONFIGURATION_load_from (cfg, dname))) { + LOG (GNUNET_ERROR_TYPE_WARNING, + "Failed to load base configuration from '%s'\n", + filename); GNUNET_free (dname); return GNUNET_SYSERR; /* no configuration at all found */ } @@ -2372,6 +2432,9 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, (GNUNET_OK != GNUNET_CONFIGURATION_parse (cfg, filename))) { /* specified configuration not found */ + LOG (GNUNET_ERROR_TYPE_WARNING, + "Failed to load configuration from file '%s'\n", + filename); return GNUNET_SYSERR; } if (((GNUNET_YES != diff --git a/src/util/gnunet-config.c b/src/util/gnunet-config.c index 20fd44c65..4f16332db 100644 --- a/src/util/gnunet-config.c +++ b/src/util/gnunet-config.c @@ -173,7 +173,6 @@ run (void *cls, { struct GNUNET_CONFIGURATION_Handle *ncfg; /* Re-parse the configuration with diagnostics enabled. */ - GNUNET_assert (NULL != cfgfile); ncfg = GNUNET_CONFIGURATION_create (); GNUNET_CONFIGURATION_enable_diagnostics (ncfg); GNUNET_CONFIGURATION_load (ncfg, cfgfile); diff --git a/src/util/program.c b/src/util/program.c index e34b37370..a79e07d19 100644 --- a/src/util/program.c +++ b/src/util/program.c @@ -140,7 +140,6 @@ GNUNET_PROGRAM_run2 (int argc, char *loglev; char *logfile; char *cfg_fn; - const char *xdg; enum GNUNET_GenericReturnValue ret; int iret; unsigned int cnt; @@ -149,12 +148,13 @@ GNUNET_PROGRAM_run2 (int argc, long long clock_offset; struct GNUNET_CONFIGURATION_Handle *cfg; const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get (); - struct GNUNET_GETOPT_CommandLineOption defoptions[] = - { GNUNET_GETOPT_option_cfgfile (&cc.cfgfile), + struct GNUNET_GETOPT_CommandLineOption defoptions[] = { + GNUNET_GETOPT_option_cfgfile (&cc.cfgfile), GNUNET_GETOPT_option_help (binaryHelp), GNUNET_GETOPT_option_loglevel (&loglev), GNUNET_GETOPT_option_logfile (&logfile), - GNUNET_GETOPT_option_version (pd->version) }; + GNUNET_GETOPT_option_version (pd->version) + }; struct GNUNET_GETOPT_CommandLineOption *allopts; const char *gargs; char *lpfx; @@ -219,17 +219,7 @@ GNUNET_PROGRAM_run2 (int argc, &cmd_sorter); loglev = NULL; if ((NULL != pd->config_file) && (NULL != pd->user_config_file)) - { - xdg = getenv ("XDG_CONFIG_HOME"); - if (NULL != xdg) - GNUNET_asprintf (&cfg_fn, - "%s%s%s", - xdg, - DIR_SEPARATOR_STR, - pd->config_file); - else - cfg_fn = GNUNET_strdup (pd->user_config_file); - } + cfg_fn = GNUNET_CONFIGURATION_default_filename (); else cfg_fn = NULL; lpfx = GNUNET_strdup (binaryName); @@ -251,6 +241,9 @@ GNUNET_PROGRAM_run2 (int argc, } if (NULL != cc.cfgfile) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Loading configuration from entry point specified as option (%s)\n", + cc.cfgfile); if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) || (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile))) { @@ -266,6 +259,9 @@ GNUNET_PROGRAM_run2 (int argc, } else { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Loading configuration default entry point (%s)\n", + cc.cfgfile); if ((NULL != cfg_fn) && (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))) { if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn)) @@ -283,8 +279,9 @@ GNUNET_PROGRAM_run2 (int argc, } else if (NULL != cfg_fn) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Loading configuration without entry point\n"); GNUNET_free (cfg_fn); - cfg_fn = NULL; if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -349,7 +346,7 @@ GNUNET_PROGRAM_run2 (int argc, cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg); } ret = GNUNET_OK; -cleanup: + cleanup: GNUNET_CONFIGURATION_destroy (cfg); GNUNET_free (cc.cfgfile); GNUNET_free (cfg_fn); -- cgit v1.2.3