GNUnet 0.21.2
Configuration library

Configuration management. More...

Collaboration diagram for Configuration library:

Data Structures

struct  GNUNET_CONFIGURATION_ConfigSettings
 Closure for GNUNET_CONFIGURATION_config_tool_run() with settings for what should be done with the configuration. More...
 

Macros

#define GNUNET_CONFIGURATION_CONFIG_OPTIONS(cs)
 Macro that expands to a set of GNUNET-getopt directives to initialize a struct GNUNET_CONFIGURATION_ConfigSettings from the command line. More...
 

Typedefs

typedef enum GNUNET_GenericReturnValue(* GNUNET_CONFIGURATION_Callback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Signature of a function to be run with a configuration. More...
 
typedef void(* GNUNET_CONFIGURATION_Iterator) (void *cls, const char *section, const char *option, const char *value)
 Function to iterate over options. More...
 
typedef void(* GNUNET_CONFIGURATION_SectionIterator) (void *cls, const char *section)
 Function to iterate over section. More...
 

Functions

struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_create (void)
 Create a new configuration object. More...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_dup (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Duplicate an existing configuration object. More...
 
void GNUNET_CONFIGURATION_destroy (struct GNUNET_CONFIGURATION_Handle *cfg)
 Destroy configuration object. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
 Load configuration. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load_from (struct GNUNET_CONFIGURATION_Handle *cfg, const char *defaults_d)
 Load default configuration. More...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_default (void)
 Return GNUnet's default configuration. More...
 
char * GNUNET_CONFIGURATION_default_filename (void)
 Return the filename of the default configuration filename that is used when no explicit configuration entry point has been specified. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse (struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
 Parse a configuration file, add all of the options in the file to the configuration environment. More...
 
char * GNUNET_CONFIGURATION_serialize (const struct GNUNET_CONFIGURATION_Handle *cfg, size_t *size)
 Serializes the given configuration. More...
 
char * GNUNET_CONFIGURATION_serialize_diagnostics (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Serializes the given configuration with diagnostics information. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_deserialize (struct GNUNET_CONFIGURATION_Handle *cfg, const char *mem, size_t size, const char *source_filename)
 De-serializes configuration. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write (struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
 Write configuration file. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write_diffs (const struct GNUNET_CONFIGURATION_Handle *cfg_default, const struct GNUNET_CONFIGURATION_Handle *cfg_new, const char *filename)
 Write only configuration entries that have been changed to configuration file. More...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_get_diff (const struct GNUNET_CONFIGURATION_Handle *cfg_default, const struct GNUNET_CONFIGURATION_Handle *cfg_new)
 Compute configuration with only entries that have been changed. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_is_dirty (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Test if there are configuration options that were changed since the last save. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse_and_run (const char *filename, GNUNET_CONFIGURATION_Callback cb, void *cb_cls)
 Parse a configuration file filename and run the function cb with the resulting configuration object. More...
 
void GNUNET_CONFIGURATION_enable_diagnostics (struct GNUNET_CONFIGURATION_Handle *cfg)
 Enable extra diagnostics. More...
 
void GNUNET_CONFIGURATION_iterate (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Iterator iter, void *iter_cls)
 Iterate over all options in the configuration. More...
 
void GNUNET_CONFIGURATION_iterate_sections (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_SectionIterator iter, void *iter_cls)
 Iterate over all sections in the configuration. More...
 
void GNUNET_CONFIGURATION_remove_section (struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
 Remove the given section and all options in it. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
 Get a configuration value that should be a number. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_float (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, float *number)
 Get a configuration value that should be a floating point number. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
 Get a configuration value that should be a relative time. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_size (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *size)
 Get a configuration value that should be a size in bytes. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_have_value (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
 Test if we have a value for a particular option. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
 Get a configuration value that should be a string. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
 Get a configuration value that should be the name of a file or directory. More...
 
int GNUNET_CONFIGURATION_iterate_value_filenames (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, GNUNET_FileNameCallback cb, void *cb_cls)
 Iterate over the set of filenames stored in a configuration value. More...
 
void GNUNET_CONFIGURATION_iterate_section_values (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, GNUNET_CONFIGURATION_Iterator iter, void *iter_cls)
 Iterate over values of a section in the configuration. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_choice (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *const *choices, const char **value)
 Get a configuration value that should be in a set of predefined strings. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
 Get a configuration value that should be in a set of "YES" or "NO". More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_data (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, void *buf, size_t buf_size)
 Get Crockford32-encoded fixed-size binary data from a configuration. More...
 
char * GNUNET_CONFIGURATION_expand_dollar (const struct GNUNET_CONFIGURATION_Handle *cfg, char *orig)
 Expand an expression of the form "$FOO/BAR" to "DIRECTORY/BAR" where either in the "PATHS" section or the environment "FOO" is set to "DIRECTORY". More...
 
void GNUNET_CONFIGURATION_set_value_number (struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long number)
 Set a configuration value that should be a number. More...
 
void GNUNET_CONFIGURATION_set_value_string (struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
 Set a configuration value that should be a string. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_remove_value_filename (struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
 Remove a filename from a configuration value that represents a list of filenames. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_append_value_filename (struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
 Append a filename to a configuration value that represents a list of filenames. More...
 
void GNUNET_CONFIGURATION_config_settings_free (struct GNUNET_CONFIGURATION_ConfigSettings *cs)
 Free resources associated with cs. More...
 
void GNUNET_CONFIGURATION_config_tool_run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Main task to run to perform operations typical for gnunet-config as per the configuration settings given in cls. More...
 

Detailed Description

Configuration management.

Macro Definition Documentation

◆ GNUNET_CONFIGURATION_CONFIG_OPTIONS

#define GNUNET_CONFIGURATION_CONFIG_OPTIONS (   cs)

Macro that expands to a set of GNUNET-getopt directives to initialize a struct GNUNET_CONFIGURATION_ConfigSettings from the command line.

Parameters
csconfiguration settings to initialize

Definition at line 728 of file gnunet_configuration_lib.h.

Typedef Documentation

◆ GNUNET_CONFIGURATION_Callback

typedef enum GNUNET_GenericReturnValue(* GNUNET_CONFIGURATION_Callback) (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)

Signature of a function to be run with a configuration.

Parameters
clsclosure
cfgthe configuration
Returns
status code

Definition at line 245 of file gnunet_configuration_lib.h.

◆ GNUNET_CONFIGURATION_Iterator

typedef void(* GNUNET_CONFIGURATION_Iterator) (void *cls, const char *section, const char *option, const char *value)

Function to iterate over options.

Parameters
clsclosure
sectionname of the section
optionname of the option
valuevalue of the option

Definition at line 298 of file gnunet_configuration_lib.h.

◆ GNUNET_CONFIGURATION_SectionIterator

typedef void(* GNUNET_CONFIGURATION_SectionIterator) (void *cls, const char *section)

Function to iterate over section.

Parameters
clsclosure
sectionname of the section

Definition at line 311 of file gnunet_configuration_lib.h.

Function Documentation

◆ GNUNET_CONFIGURATION_create()

struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create ( void  )

Create a new configuration object.

Returns
fresh configuration object

Definition at line 222 of file configuration.c.

223{
225 char *p;
226
228 /* make certain values from the project data available
229 as PATHS */
231 if (NULL != p)
232 {
234 "PATHS",
235 "DATADIR",
236 p);
237 GNUNET_free (p);
238 }
240 if (NULL != p)
241 {
243 "PATHS",
244 "LIBDIR",
245 p);
246 GNUNET_free (p);
247 }
249 if (NULL != p)
250 {
252 "PATHS",
253 "BINDIR",
254 p);
255 GNUNET_free (p);
256 }
258 if (NULL != p)
259 {
261 "PATHS",
262 "PREFIX",
263 p);
264 GNUNET_free (p);
265 }
267 if (NULL != p)
268 {
270 "PATHS",
271 "LOCALEDIR",
272 p);
273 GNUNET_free (p);
274 }
276 if (NULL != p)
277 {
279 "PATHS",
280 "ICONDIR",
281 p);
282 GNUNET_free (p);
283 }
285 if (NULL != p)
286 {
288 "PATHS",
289 "DOCDIR",
290 p);
291 GNUNET_free (p);
292 }
294 if (NULL != p)
295 {
297 "PATHS",
298 "LIBEXECDIR",
299 p);
300 GNUNET_free (p);
301 }
302 return cfg;
303}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-uri.c:38
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
char * GNUNET_OS_installation_get_path(enum GNUNET_OS_InstallationPathKind dirkind)
Get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX,...
@ GNUNET_OS_IPK_ICONDIR
Return the prefix of the path with application icons (share/icons/).
@ GNUNET_OS_IPK_DATADIR
Return the directory where data is installed (share/gnunet/)
@ GNUNET_OS_IPK_DOCDIR
Return the prefix of the path with documentation files, including the license (share/doc/gnunet/).
@ GNUNET_OS_IPK_LOCALEDIR
Return the directory where translations are installed (share/locale/)
@ GNUNET_OS_IPK_LIBDIR
Return the directory where libraries are installed.
@ GNUNET_OS_IPK_PREFIX
Return the "PREFIX" directory given to configure.
@ GNUNET_OS_IPK_BINDIR
Return the directory where the program binaries are installed.
@ GNUNET_OS_IPK_LIBEXECDIR
Return the directory where helper binaries are installed (lib/gnunet/libexec/)

References cfg, GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_new, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_BINDIR, GNUNET_OS_IPK_DATADIR, GNUNET_OS_IPK_DOCDIR, GNUNET_OS_IPK_ICONDIR, GNUNET_OS_IPK_LIBDIR, GNUNET_OS_IPK_LIBEXECDIR, GNUNET_OS_IPK_LOCALEDIR, GNUNET_OS_IPK_PREFIX, and p.

Referenced by auto_config_cb(), create_unique_cfgs(), gg_load_configuration(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_default(), GNUNET_CONFIGURATION_dup(), GNUNET_CONFIGURATION_get_diff(), GNUNET_CONFIGURATION_parse_and_run(), GNUNET_CRYPTO_eddsa_setup_key(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_main(), GNUNET_SERVICE_run_(), GNUNET_TESTING_get_topo_from_string_(), GNUNET_TRANSPORT_TESTING_start_peer(), GNUNET_TRANSPORT_TESTING_transport_communicator_service_start(), handle_auto_result(), handle_autoconfig_request(), handle_inline(), iter_check_config(), load_member(), load_member_session(), load_member_session_next(), load_operation(), main(), run(), save_member(), save_member_session(), save_operation(), and start_peer_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_dup()

struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_dup ( const struct GNUNET_CONFIGURATION_Handle cfg)

Duplicate an existing configuration object.

Parameters
cfgconfiguration to duplicate
Returns
duplicate configuration

Definition at line 1531 of file configuration.c.

1532{
1534
1537 return ret;
1538}
static void copy_entry(void *cls, const char *section, const char *option, const char *value)
Copy a configuration value to the given target configuration.
static int ret
Final status code.
Definition: gnunet-arm.c:94
void GNUNET_CONFIGURATION_iterate(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Iterator iter, void *iter_cls)
Iterate over all options in the configuration.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create()
Create a new configuration object.

References cfg, copy_entry(), GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_iterate(), and ret.

Referenced by auto_config_cb(), create_unique_cfgs(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_NAT_autoconfig_start(), handle_autoconfig_request(), run(), and set_cont().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_destroy()

void GNUNET_CONFIGURATION_destroy ( struct GNUNET_CONFIGURATION_Handle cfg)

Destroy configuration object.

Parameters
cfgconfiguration to destroy

Definition at line 307 of file configuration.c.

308{
309 struct ConfigSection *sec;
310 struct ConfigFile *cf;
311
312 while (NULL != (sec = cfg->sections))
314 while (NULL != (cf = cfg->loaded_files_head))
315 {
320 cf);
321 GNUNET_free (cf);
322 }
325}
void GNUNET_CONFIGURATION_remove_section(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Remove the given section and all options in it.
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
char * hint_restrict_section
Was this configuration file parsed via @inline-secret@?
char * source_filename
Source filename.
configuration section
Definition: configuration.c:71
char * name
name of the section
Definition: configuration.c:85
struct ConfigFile * loaded_files_tail
Linked list of loaded files.
struct ConfigSection * sections
Configuration sections.
struct ConfigFile * loaded_files_head
Linked list of loaded files.
char * main_filename
Name of the entry point configuration file.

References cfg, GNUNET_CONFIGURATION_remove_section(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, ConfigFile::hint_restrict_section, GNUNET_CONFIGURATION_Handle::loaded_files_head, GNUNET_CONFIGURATION_Handle::loaded_files_tail, GNUNET_CONFIGURATION_Handle::main_filename, ConfigSection::name, GNUNET_CONFIGURATION_Handle::sections, and ConfigFile::source_filename.

Referenced by auto_config_cb(), clean_node(), conclude_autoconfig_request(), create_unique_cfgs(), do_shutdown(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_default(), GNUNET_CONFIGURATION_parse_and_run(), GNUNET_CONFIGURATION_write_diffs(), GNUNET_CRYPTO_eddsa_setup_key(), GNUNET_NAT_autoconfig_cancel(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_main(), GNUNET_SERVICE_run_(), GNUNET_TESTING_get_topo_from_string_(), GNUNET_TRANSPORT_TESTING_start_peer(), GNUNET_TRANSPORT_TESTING_stop_peer(), GNUNET_TRANSPORT_TESTING_transport_communicator_service_start(), GNUNET_TRANSPORT_TESTING_transport_communicator_service_stop(), handle_auto_result(), handle_autoconfig_request(), handle_inline(), load_member(), load_member_session(), load_member_session_next(), load_operation(), main(), next_phase(), save_member(), save_member_session(), save_operation(), shutdown_task(), start_peer_cleanup(), and start_peer_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_load()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  filename 
)

Load configuration.

This function will first parse the defaults and then parse the specific configuration file to overwrite the defaults.

Parameters
cfgconfiguration to update
filenamename of the configuration file, NULL to load defaults
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Load configuration.

Parameters
cfgconfiguration to update
filenamename of the configuration file, NULL to load defaults
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 2498 of file configuration.c.

2500{
2501 char *baseconfig;
2502 const char *base_config_varname;
2503
2504 if (cfg->load_called)
2505 {
2506 /* FIXME: Make this a GNUNET_assert later */
2507 GNUNET_break (0);
2509 }
2510 cfg->load_called = true;
2511 if (NULL != filename)
2512 {
2515 }
2516
2517 base_config_varname = GNUNET_OS_project_data_get ()->base_config_varname;
2518
2519 if ((NULL != base_config_varname)
2520 && (NULL != (baseconfig = getenv (base_config_varname))))
2521 {
2522 baseconfig = GNUNET_strdup (baseconfig);
2523 }
2524 else
2525 {
2526 char *ipath;
2527
2529 if (NULL == ipath)
2530 {
2531 GNUNET_break (0);
2532 return GNUNET_SYSERR;
2533 }
2534 GNUNET_asprintf (&baseconfig, "%s%s", ipath, "config.d");
2535 GNUNET_free (ipath);
2536 }
2537
2538 char *dname = GNUNET_STRINGS_filename_expand (baseconfig);
2539 GNUNET_free (baseconfig);
2540
2541 if ((GNUNET_YES ==
2543 GNUNET_YES)) &&
2544 (GNUNET_SYSERR ==
2546 dname)))
2547 {
2549 "Failed to load base configuration from '%s'\n",
2550 filename);
2551 GNUNET_free (dname);
2552 return GNUNET_SYSERR; /* no configuration at all found */
2553 }
2554 GNUNET_free (dname);
2555 if ((NULL != filename) &&
2556 (GNUNET_OK !=
2558 filename)))
2559 {
2560 /* specified configuration not found */
2562 "Failed to load configuration from file '%s'\n",
2563 filename);
2564 return GNUNET_SYSERR;
2565 }
2566 if (((GNUNET_YES !=
2568 "PATHS",
2569 "DEFAULTCONFIG"))) &&
2570 (filename != NULL))
2572 "PATHS",
2573 "DEFAULTCONFIG",
2574 filename);
2575 return GNUNET_OK;
2576}
#define LOG(kind,...)
Definition: configuration.c:30
char * getenv()
static char * filename
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Parse a configuration file, add all of the options in the file to the configuration environment.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load_from(struct GNUNET_CONFIGURATION_Handle *cfg, const char *defaults_d)
Load default configuration.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_have_value(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Test if we have a value for a particular option.
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_test(const char *fil, int is_readable)
Test if fil is a directory and listable.
Definition: disk.c:403
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_SYSERR
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
char * GNUNET_STRINGS_filename_expand(const char *fil)
Complete filename (a la shell) from abbrevition.
Definition: strings.c:495
bool load_called
Was the configuration ever loaded via GNUNET_CONFIGURATION_load?
const char * base_config_varname
Name of an environment variable that can be used to override the location from which default configur...

References GNUNET_OS_ProjectData::base_config_varname, cfg, filename, getenv(), GNUNET_asprintf(), GNUNET_break, GNUNET_CONFIGURATION_have_value(), GNUNET_CONFIGURATION_load_from(), GNUNET_CONFIGURATION_parse(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_DISK_directory_test(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_OK, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_DATADIR, GNUNET_OS_project_data_get(), GNUNET_strdup, GNUNET_STRINGS_filename_expand(), GNUNET_SYSERR, GNUNET_YES, GNUNET_CONFIGURATION_Handle::load_called, LOG, and GNUNET_CONFIGURATION_Handle::main_filename.

Referenced by auto_config_cb(), create_unique_cfgs(), gg_load_configuration(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_default(), GNUNET_CONFIGURATION_parse_and_run(), GNUNET_CRYPTO_eddsa_setup_key(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_main(), GNUNET_SERVICE_run_(), GNUNET_TRANSPORT_TESTING_start_peer(), GNUNET_TRANSPORT_TESTING_transport_communicator_service_start(), iter_check_config(), main(), and start_peer_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_load_from()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load_from ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  defaults_d 
)

Load default configuration.

This function will parse the defaults from the given defaults_d directory.

Parameters
cfgconfiguration to update
defaults_ddirectory with the defaults
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 2333 of file configuration.c.

2335{
2336 struct CollectFilesContext files_context = {
2337 .files = NULL,
2338 .files_length = 0,
2339 };
2340 enum GNUNET_GenericReturnValue fun_ret;
2341
2342 if (GNUNET_SYSERR ==
2344 &files_context))
2345 return GNUNET_SYSERR; /* no configuration at all found */
2346 qsort (files_context.files,
2347 files_context.files_length,
2348 sizeof (char *),
2349 pstrcmp);
2350 for (unsigned int i = 0; i < files_context.files_length; i++)
2351 {
2352 char *ext;
2353 const char *filename = files_context.files[i];
2354
2355 /* Examine file extension */
2356 ext = strrchr (filename, '.');
2357 if ((NULL == ext) || (0 != strcmp (ext, ".conf")))
2358 {
2359 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Skipping file `%s'\n", filename);
2360 fun_ret = GNUNET_OK;
2361 goto cleanup;
2362 }
2364 if (fun_ret != GNUNET_OK)
2365 break;
2366 }
2367cleanup:
2368 if (files_context.files_length > 0)
2369 {
2370 for (size_t i = 0; i < files_context.files_length; i++)
2371 GNUNET_free (files_context.files[i]);
2372 GNUNET_array_grow (files_context.files,
2373 files_context.files_length,
2374 0);
2375 }
2376 return fun_ret;
2377}
static int pstrcmp(const void *a, const void *b)
static enum GNUNET_GenericReturnValue collect_files_cb(void *cls, const char *filename)
Function called with a filename.
static void cleanup(void *cls)
Disconnect and shutdown.
Definition: gnunet-did.c:131
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:814
#define GNUNET_log(kind,...)
GNUNET_GenericReturnValue
Named constants for return values.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
Closure to collect_files_cb.
char ** files
Collected files from globbing.
unsigned int files_length
Size of the files array.

References cfg, cleanup(), collect_files_cb(), filename, CollectFilesContext::files, CollectFilesContext::files_length, GNUNET_array_grow, GNUNET_CONFIGURATION_parse(), GNUNET_DISK_directory_scan(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, and pstrcmp().

Referenced by GNUNET_CONFIGURATION_load().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_default()

struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_default ( void  )

Return GNUnet's default configuration.

A new configuration is allocated each time and it's up to the caller to destroy it when done. This function returns GNUnet's configuration even when GNUNET_OS_init has been called with a value different from GNUNET_OS_project_data_default.

Returns
a freshly allocated configuration

Definition at line 2423 of file configuration.c.

2424{
2427 const char *xdg = getenv ("XDG_CONFIG_HOME");
2428 char *cfgname = NULL;
2430
2431 /* Makes sure function implicitly looking at the installation directory (for
2432 example GNUNET_CONFIGURATION_load further down) use GNUnet's environment
2433 instead of the caller's. It's done at the start to make sure as many
2434 functions as possible are directed to the proper paths. */
2435 GNUNET_OS_init (dpd);
2436
2438
2439 /* First, try user configuration. */
2440 if (NULL != xdg)
2441 GNUNET_asprintf (&cfgname, "%s/%s", xdg, dpd->config_file);
2442 else
2443 cfgname = GNUNET_strdup (dpd->user_config_file);
2444
2445 /* If user config doesn't exist, try in
2446 /etc/<projdir>/<cfgfile> and /etc/<cfgfile> */
2447 if (GNUNET_OK != GNUNET_DISK_file_test (cfgname))
2448 {
2449 GNUNET_free (cfgname);
2450 GNUNET_asprintf (&cfgname, "/etc/%s", dpd->config_file);
2451 }
2452 if (GNUNET_OK != GNUNET_DISK_file_test (cfgname))
2453 {
2454 GNUNET_free (cfgname);
2455 GNUNET_asprintf (&cfgname,
2456 "/etc/%s/%s",
2457 dpd->project_dirname,
2458 dpd->config_file);
2459 }
2460 if (GNUNET_OK != GNUNET_DISK_file_test (cfgname))
2461 {
2463 "Unable to top-level configuration file.\n");
2464 GNUNET_OS_init (pd);
2466 GNUNET_free (cfgname);
2467 return NULL;
2468 }
2469
2470 /* We found a configuration file that looks good, try to load it. */
2471
2473 "Loading top-level configuration from '%s'\n",
2474 cfgname);
2475 if (GNUNET_OK !=
2476 GNUNET_CONFIGURATION_load (cfg, cfgname))
2477 {
2478 GNUNET_OS_init (pd);
2480 GNUNET_free (cfgname);
2481 return NULL;
2482 }
2483 GNUNET_free (cfgname);
2484 GNUNET_OS_init (pd);
2485 return cfg;
2486}
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration (starts with defaults, then loads system-specific configuration).
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition: disk.c:482
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_default(void)
Return default project data used by 'libgnunetutil' for GNUnet.
void GNUNET_OS_init(const struct GNUNET_OS_ProjectData *pd)
Setup OS subsystem with project data.
Project-specific data used to help the OS subsystem find installation paths.
const char * project_dirname
Name of the project that is used in the "libexec" prefix, For example, "gnunet".
const char * user_config_file
Configuration file name to use (if $XDG_CONFIG_HOME is not set).
const char * config_file
Configuration file name (in $XDG_CONFIG_HOME) to use.

References cfg, GNUNET_OS_ProjectData::config_file, getenv(), GNUNET_asprintf(), GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_load(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_OK, GNUNET_OS_init(), GNUNET_OS_project_data_default(), GNUNET_OS_project_data_get(), GNUNET_strdup, LOG, GNUNET_OS_ProjectData::project_dirname, and GNUNET_OS_ProjectData::user_config_file.

Here is the call graph for this function:

◆ GNUNET_CONFIGURATION_default_filename()

char * GNUNET_CONFIGURATION_default_filename ( void  )

Return the filename of the default configuration filename that is used when no explicit configuration entry point has been specified.

Returns
NULL if no default configuration file can be located, a newly allocated string otherwise

Definition at line 2381 of file configuration.c.

2382{
2383 char *cfg_fn;
2385 const char *xdg = getenv ("XDG_CONFIG_HOME");
2386
2387 if (NULL != xdg)
2388 GNUNET_asprintf (&cfg_fn,
2389 "%s%s%s",
2390 xdg,
2392 pd->config_file);
2393 else
2394 cfg_fn = GNUNET_strdup (pd->user_config_file);
2395
2396 if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn))
2397 return cfg_fn;
2398 GNUNET_free (cfg_fn);
2399
2400 /* Fall back to /etc/ for the default configuration.
2401 Should be okay to use forward slashes here. */
2402
2403 GNUNET_asprintf (&cfg_fn,
2404 "/etc/%s",
2405 pd->config_file);
2406 if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn))
2407 return cfg_fn;
2408 GNUNET_free (cfg_fn);
2409
2410 GNUNET_asprintf (&cfg_fn,
2411 "/etc/%s/%s",
2412 pd->project_dirname,
2413 pd->config_file);
2414 if (GNUNET_OK == GNUNET_DISK_file_test_read (cfg_fn))
2415 return cfg_fn;
2416
2417 GNUNET_free (cfg_fn);
2418 return NULL;
2419}
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test_read(const char *fil)
Check that fil corresponds to a filename and the file has read permissions.
Definition: disk.c:489
#define DIR_SEPARATOR_STR
Definition: platform.h:166

References GNUNET_OS_ProjectData::config_file, DIR_SEPARATOR_STR, getenv(), GNUNET_asprintf(), GNUNET_DISK_file_test_read(), GNUNET_free, GNUNET_OK, GNUNET_OS_project_data_get(), GNUNET_strdup, GNUNET_OS_ProjectData::project_dirname, and GNUNET_OS_ProjectData::user_config_file.

Referenced by GNUNET_PROGRAM_run2(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_parse()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  filename 
)

Parse a configuration file, add all of the options in the file to the configuration environment.

Parameters
cfgconfiguration to update
filenamename of the configuration file
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 970 of file configuration.c.

972{
973 uint64_t fs64;
974 size_t fs;
975 char *fn;
976 char *mem;
977 int dirty;
979 ssize_t sret;
980
982 LOG (GNUNET_ERROR_TYPE_DEBUG, "Asked to parse config file `%s'\n", fn);
983 if (NULL == fn)
984 return GNUNET_SYSERR;
985
986
987 /* Check for cycles */
988 {
989 unsigned int lvl = cfg->current_nest_level;
990 struct ConfigFile *cf = cfg->loaded_files_tail;
991 struct ConfigFile *parent = NULL;
992
993
994 for (; NULL != cf; parent = cf, cf = cf->prev)
995 {
996 /* Check parents based on level, skipping children of siblings. */
997 if (cf->level >= lvl)
998 continue;
999 lvl = cf->level;
1000 if ( (NULL == cf->source_filename) || (NULL == filename))
1001 continue;
1002 if (0 == strcmp (cf->source_filename, filename))
1003 {
1004 if (NULL == parent)
1005 {
1007 "Forbidden direct cyclic configuration import (%s -> %s)\n",
1008 cf->source_filename,
1009 filename);
1010 }
1011 else
1013 "Forbidden indirect cyclic configuration import (%s -> ... -> %s -> %s)\n",
1014 cf->source_filename,
1015 parent->source_filename,
1016 filename);
1017 GNUNET_free (fn);
1018 return GNUNET_SYSERR;
1019 }
1020 }
1021
1022 }
1023
1024 /* Keep track of loaded files.*/
1025 {
1026 struct ConfigFile *cf = GNUNET_new (struct ConfigFile);
1027
1029 cf->source_filename = GNUNET_strdup (filename ? filename : "<input>");
1032 cf);
1033 }
1034
1035 dirty = cfg->dirty; /* back up value! */
1036 if (GNUNET_SYSERR ==
1038 &fs64,
1039 GNUNET_YES,
1040 GNUNET_YES))
1041 {
1043 "Error while determining the file size of `%s'\n",
1044 fn);
1045 GNUNET_free (fn);
1046 return GNUNET_SYSERR;
1047 }
1048 if (fs64 > SIZE_MAX)
1049 {
1050 GNUNET_break (0); /* File size is more than the heap size */
1051 GNUNET_free (fn);
1052 return GNUNET_SYSERR;
1053 }
1054 fs = fs64;
1055 mem = GNUNET_malloc (fs);
1056 sret = GNUNET_DISK_fn_read (fn, mem, fs);
1057 if ((sret < 0) || (fs != (size_t) sret))
1058 {
1060 "Error while reading file `%s'\n",
1061 fn);
1062 GNUNET_free (fn);
1063 GNUNET_free (mem);
1064 return GNUNET_SYSERR;
1065 }
1067 "Deserializing contents of file `%s'\n",
1068 fn);
1070 mem,
1071 fs,
1072 fn);
1073 if (GNUNET_SYSERR == ret)
1074 {
1076 _ ("Failed to parse configuration file `%s'\n"),
1077 fn);
1078 }
1079 GNUNET_free (fn);
1080 GNUNET_free (mem);
1081 /* restore dirty flag - anything we set in the meantime
1082 * came from disk */
1083 cfg->dirty = dirty;
1084 return ret;
1085}
static struct GNUNET_FS_Handle * fs
Handle to FS service.
Definition: gnunet-fs.c:37
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_deserialize(struct GNUNET_CONFIGURATION_Handle *cfg, const char *mem, size_t size, const char *source_filename)
De-serializes configuration.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_size(const char *filename, uint64_t *size, int include_symbolic_links, int single_file_mode)
Get the size of the file (or directory) of the given file (in bytes).
Definition: disk.c:221
ssize_t GNUNET_DISK_fn_read(const char *fn, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition: disk.c:664
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
#define SIZE_MAX
Definition: platform.h:208
struct ConfigFile * prev
unsigned int level
Level in the tree of loaded config files.
unsigned int current_nest_level
Current nesting level of file loading.
enum GNUNET_GenericReturnValue dirty
Modification indication since last save GNUNET_NO if clean, GNUNET_YES if dirty, GNUNET_SYSERR on err...

References _, cfg, GNUNET_CONFIGURATION_Handle::current_nest_level, GNUNET_CONFIGURATION_Handle::dirty, filename, fs, GNUNET_break, GNUNET_CONFIGURATION_deserialize(), GNUNET_CONTAINER_DLL_insert_tail, GNUNET_DISK_file_size(), GNUNET_DISK_fn_read(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_malloc, GNUNET_new, GNUNET_strdup, GNUNET_STRINGS_filename_expand(), GNUNET_SYSERR, GNUNET_YES, ConfigFile::level, GNUNET_CONFIGURATION_Handle::loaded_files_head, GNUNET_CONFIGURATION_Handle::loaded_files_tail, LOG, ConfigFile::prev, ret, SIZE_MAX, and ConfigFile::source_filename.

Referenced by GNUNET_CONFIGURATION_load(), GNUNET_CONFIGURATION_load_from(), handle_inline(), load_member(), load_member_session(), load_member_session_next(), load_operation(), main(), and run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_serialize()

char * GNUNET_CONFIGURATION_serialize ( const struct GNUNET_CONFIGURATION_Handle cfg,
size_t *  size 
)

Serializes the given configuration.

Parameters
cfgconfiguration to serialize
sizewill be set to the size of the serialized memory block
Returns
the memory block where the serialized configuration is present. This memory should be freed by the caller

Definition at line 1131 of file configuration.c.

1133{
1134 char *mem;
1135 char *cbuf;
1136 char *val;
1137 char *pos;
1138 size_t m_size;
1139 size_t c_size;
1140
1141 /* Pass1 : calculate the buffer size required */
1142 m_size = 0;
1143 for (struct ConfigSection *sec = cfg->sections;
1144 NULL != sec;
1145 sec = sec->next)
1146 {
1147 if (sec->inaccessible)
1148 continue;
1149 /* For each section we need to add 3 characters: {'[',']','\n'} */
1150 m_size += strlen (sec->name) + 3;
1151 for (struct ConfigEntry *ent = sec->entries;
1152 NULL != ent;
1153 ent = ent->next)
1154 {
1155 if (do_skip (sec->name,
1156 ent->key))
1157 continue;
1158 if (NULL != ent->val)
1159 {
1160 /* if val has any '\n' then they occupy +1 character as '\n'->'\\','n' */
1161 pos = ent->val;
1162 while (NULL != (pos = strstr (pos, "\n")))
1163 {
1164 m_size++;
1165 pos++;
1166 }
1167 /* For each key = value pair we need to add 4 characters (2
1168 spaces and 1 equal-to character and 1 new line) */
1169 m_size += strlen (ent->key) + strlen (ent->val) + 4;
1170 }
1171 }
1172 /* A new line after section end */
1173 m_size++;
1174 }
1175
1176 /* Pass2: Allocate memory and write the configuration to it */
1177 mem = GNUNET_malloc (m_size);
1178 c_size = 0;
1179 *size = c_size;
1180 for (struct ConfigSection *sec = cfg->sections;
1181 NULL != sec;
1182 sec = sec->next)
1183 {
1184 int len;
1185
1186 len = GNUNET_asprintf (&cbuf,
1187 "[%s]\n",
1188 sec->name);
1189 GNUNET_assert (0 < len);
1190 GNUNET_memcpy (mem + c_size,
1191 cbuf,
1192 len);
1193 c_size += len;
1194 GNUNET_free (cbuf);
1195 for (struct ConfigEntry *ent = sec->entries;
1196 NULL != ent;
1197 ent = ent->next)
1198 {
1199 if (do_skip (sec->name,
1200 ent->key))
1201 continue;
1202 if (NULL != ent->val)
1203 {
1204 val = GNUNET_malloc (strlen (ent->val) * 2 + 1);
1205 strcpy (val, ent->val);
1206 while (NULL != (pos = strstr (val, "\n")))
1207 {
1208 memmove (&pos[2], &pos[1], strlen (&pos[1]));
1209 pos[0] = '\\';
1210 pos[1] = 'n';
1211 }
1212 len = GNUNET_asprintf (&cbuf, "%s = %s\n", ent->key, val);
1213 GNUNET_free (val);
1214 GNUNET_memcpy (mem + c_size, cbuf, len);
1215 c_size += len;
1216 GNUNET_free (cbuf);
1217 }
1218 }
1219 GNUNET_memcpy (mem + c_size, "\n", 1);
1220 c_size++;
1221 }
1222 GNUNET_assert (c_size == m_size);
1223 *size = c_size;
1224 return mem;
1225}
static bool do_skip(const char *sec, const char *key)
Should we skip this configuration entry when serializing?
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static unsigned int size
Size of the "table".
Definition: peer.c:68
configuration entry
Definition: configuration.c:39
struct ConfigEntry * next
This is a linked list.
Definition: configuration.c:43
struct ConfigSection * next
This is a linked list.
Definition: configuration.c:75

References cfg, do_skip(), GNUNET_asprintf(), GNUNET_assert, GNUNET_free, GNUNET_malloc, GNUNET_memcpy, ConfigEntry::next, ConfigSection::next, GNUNET_CONFIGURATION_Handle::sections, and size.

Referenced by conclude_autoconfig_request(), GNUNET_CONFIGURATION_write(), and GNUNET_NAT_AUTO_autoconfig_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_serialize_diagnostics()

char * GNUNET_CONFIGURATION_serialize_diagnostics ( const struct GNUNET_CONFIGURATION_Handle cfg)

Serializes the given configuration with diagnostics information.

Diagnostics information will only be available if diagnostics have been enabled before parsing.

Parameters
cfgconfiguration to serialize
Returns
the memory block where the serialized configuration is present. This memory should be freed by the caller

Definition at line 1229 of file configuration.c.

1231{
1232 struct GNUNET_Buffer buf = { 0 };
1233
1235 "#\n# Configuration file diagnostics\n#\n");
1237 "# Entry point: %s\n",
1239 "<none>");
1241 "#\n# Files Loaded:\n");
1242
1243 for (struct ConfigFile *cfil = cfg->loaded_files_head;
1244 NULL != cfil;
1245 cfil = cfil->next)
1246 {
1248 "# ");
1249 for (unsigned int i = 0; i < cfil->level; i++)
1251 "+");
1252 if (0 != cfil->level)
1254 " ");
1255
1257 "%s",
1258 cfil->source_filename);
1259
1260 if (NULL != cfil->hint_restrict_section)
1262 " (%s secret section %s)",
1263 cfil->hint_inaccessible
1264 ? "inaccessible"
1265 : "loaded",
1266 cfil->hint_restrict_section);
1267
1269 "\n");
1270 }
1271
1273 "#\n\n");
1274
1275 for (struct ConfigSection *sec = cfg->sections;
1276 NULL != sec;
1277 sec = sec->next)
1278 {
1279 if (sec->hint_secret_filename)
1281 "# secret section from %s\n# secret file stat %s\n",
1282 sec->hint_secret_filename,
1283 sec->hint_secret_stat);
1284 if (sec->hint_inlined_from_filename)
1285 {
1287 "# inlined from %s:%u\n",
1288 sec->hint_inlined_from_filename,
1289 sec->hint_inlined_from_line);
1290 }
1292 "[%s]\n\n",
1293 sec->name);
1294 if (sec->inaccessible)
1295 {
1297 "# <section contents inaccessible>\n\n\n");
1298 continue;
1299 }
1300 for (struct ConfigEntry *ent = sec->entries;
1301 NULL != ent;
1302 ent = ent->next)
1303 {
1304 if (do_skip (sec->name,
1305 ent->key))
1306 continue;
1307 if (NULL != ent->val)
1308 {
1309 char *pos;
1310 char *val = GNUNET_malloc (strlen (ent->val) * 2 + 1);
1311 strcpy (val, ent->val);
1312 while (NULL != (pos = strstr (val, "\n")))
1313 {
1314 memmove (&pos[2], &pos[1], strlen (&pos[1]));
1315 pos[0] = '\\';
1316 pos[1] = 'n';
1317 }
1318 if (NULL != ent->hint_filename)
1319 {
1321 "# %s:%u\n",
1322 ent->hint_filename,
1323 ent->hint_lineno);
1324 }
1326 "%s = %s\n",
1327 ent->key,
1328 val);
1329 GNUNET_free (val);
1330 }
1331 GNUNET_buffer_write_str (&buf, "\n");
1332 }
1333 GNUNET_buffer_write_str (&buf, "\n");
1334 }
1335 return GNUNET_buffer_reap_str (&buf);
1336}
char * GNUNET_buffer_reap_str(struct GNUNET_Buffer *buf)
Clear the buffer and return the string it contained.
Definition: buffer.c:123
void GNUNET_buffer_write_fstr(struct GNUNET_Buffer *buf, const char *fmt,...) __attribute__((format(printf
Write a 0-terminated formatted string to a buffer, excluding the 0-terminator.
void GNUNET_buffer_write_str(struct GNUNET_Buffer *buf, const char *str)
Write a 0-terminated string to a buffer, excluding the 0-terminator.
Definition: buffer.c:103
struct ConfigFile * next
Dynamically growing buffer.

References cfg, do_skip(), GNUNET_buffer_reap_str(), GNUNET_buffer_write_fstr(), GNUNET_buffer_write_str(), GNUNET_free, GNUNET_malloc, GNUNET_CONFIGURATION_Handle::loaded_files_head, GNUNET_CONFIGURATION_Handle::main_filename, ConfigEntry::next, ConfigSection::next, ConfigFile::next, and GNUNET_CONFIGURATION_Handle::sections.

Referenced by GNUNET_CONFIGURATION_config_tool_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_deserialize()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_deserialize ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  mem,
size_t  size,
const char *  source_filename 
)

De-serializes configuration.

Parameters
cfgconfiguration to update
memthe memory block of serialized configuration
sizethe size of the memory block
source_filenamesource filename, will be used to resolve relative @INLINE@ statements
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 703 of file configuration.c.

707{
708 size_t line_size;
709 unsigned int nr;
710 size_t r_bytes;
711 size_t to_read;
713 char *section;
714 char *eq;
715 char *tag;
716 char *value;
717 char *line_orig = NULL;
718
719 ret = GNUNET_OK;
720 section = NULL;
721 nr = 0;
722 r_bytes = 0;
723 while (r_bytes < size)
724 {
725 char *pos;
726 char *line;
727 bool emptyline;
728
729 GNUNET_free (line_orig);
730 /* fgets-like behaviour on buffer */
731 to_read = size - r_bytes;
732 pos = memchr (&mem[r_bytes], '\n', to_read);
733 if (NULL == pos)
734 {
735 line_orig = GNUNET_strndup (&mem[r_bytes],
736 line_size = to_read);
737 r_bytes += line_size;
738 }
739 else
740 {
741 line_orig = GNUNET_strndup (&mem[r_bytes],
742 line_size = (pos - &mem[r_bytes]));
743 r_bytes += line_size + 1;
744 }
745 line = line_orig;
746 /* increment line number */
747 nr++;
748 /* tabs and '\r' are whitespace */
749 emptyline = GNUNET_YES;
750 for (size_t i = 0; i < line_size; i++)
751 {
752 if (line[i] == '\t')
753 line[i] = ' ';
754 if (line[i] == '\r')
755 line[i] = ' ';
756 if (' ' != line[i])
757 emptyline = GNUNET_NO;
758 }
759 /* ignore empty lines */
760 if (GNUNET_YES == emptyline)
761 continue;
762
763 /* remove tailing whitespace */
764 for (size_t i = line_size - 1;
765 (i >= 1) && (isspace ((unsigned char) line[i]));
766 i--)
767 line[i] = '\0';
768
769 /* remove leading whitespace */
770 for (; line[0] != '\0' && (isspace ((unsigned char) line[0])); line++)
771 ;
772
773 /* ignore comments */
774 if ( ('#' == line[0]) ||
775 ('%' == line[0]) )
776 continue;
777
778 /* Handle special directives. */
779 if ('@' == line[0])
780 {
781 char *end = strchr (line + 1, '@');
782 char *directive;
783 enum GNUNET_GenericReturnValue directive_ret;
784
785 if (NULL != cfg->restrict_section)
786 {
788 "Illegal directive in line %u (parsing restricted section %s)\n",
789 nr,
792 break;
793 }
794
795 if (NULL == end)
796 {
798 "Bad directive in line %u\n",
799 nr);
801 break;
802 }
803 *end = '\0';
804 directive = line + 1;
805
806 if (0 == strcasecmp (directive,
807 "INLINE"))
808 {
809 const char *path = end + 1;
810
811 /* Skip space before path */
812 for (; isspace (*path); path++)
813 ;
814
815 directive_ret = handle_inline (cfg,
816 path,
817 false,
818 NULL,
819 source_filename,
820 nr);
821 }
822 else if (0 == strcasecmp (directive,
823 "INLINE-MATCHING"))
824 {
825 const char *path = end + 1;
826
827 /* Skip space before path */
828 for (; isspace (*path); path++)
829 ;
830
831 directive_ret = handle_inline (cfg,
832 path,
833 true,
834 NULL,
835 source_filename,
836 nr);
837 }
838 else if (0 == strcasecmp (directive,
839 "INLINE-SECRET"))
840 {
841 char *secname = end + 1;
842 char *secname_end;
843 const char *path;
844
845 /* Skip space before secname */
846 for (; isspace (*secname); secname++)
847 ;
848
849 secname_end = strchr (secname, ' ');
850
851 if (NULL == secname_end)
852 {
854 "Bad inline-secret directive in line %u\n",
855 nr);
857 break;
858 }
859 *secname_end = '\0';
860 path = secname_end + 1;
861
862 /* Skip space before path */
863 for (; isspace (*path); path++)
864 ;
865
866 directive_ret = handle_inline (cfg,
867 path,
868 false,
869 secname,
870 source_filename,
871 nr);
872 }
873 else
874 {
876 "Unknown or malformed directive '%s' in line %u\n",
877 directive,
878 nr);
880 break;
881 }
882 if (GNUNET_OK != directive_ret)
883 {
884 ret = directive_ret;
885 break;
886 }
887 continue;
888 }
889 if ( ('[' == line[0]) &&
890 (']' == line[line_size - 1]) )
891 {
892 /* [value] */
893 line[line_size - 1] = '\0';
894 value = &line[1];
895 GNUNET_free (section);
896 section = GNUNET_strdup (value);
897 continue;
898 }
899 if (NULL != (eq = strchr (line, '=')))
900 {
901 size_t i;
902
903 if (NULL == section)
904 {
906 "Syntax error while deserializing in line %u (option without section)\n",
907 nr);
909 break;
910 }
911
912 /* tag = value */
913 tag = GNUNET_strndup (line, eq - line);
914 /* remove tailing whitespace */
915 for (i = strlen (tag) - 1;
916 (i >= 1) && (isspace ((unsigned char) tag[i]));
917 i--)
918 tag[i] = '\0';
919
920 /* Strip whitespace */
921 value = eq + 1;
922 while (isspace ((unsigned char) value[0]))
923 value++;
924 for (i = strlen (value) - 1;
925 (i >= 1) && (isspace ((unsigned char) value[i]));
926 i--)
927 value[i] = '\0';
928
929 /* remove quotes */
930 i = 0;
931 if ( ('"' == value[0]) &&
932 ('"' == value[strlen (value) - 1]) )
933 {
934 value[strlen (value) - 1] = '\0';
935 value++;
936 }
938 section,
939 tag,
940 &value[i]);
941 if (cfg->diagnostics)
942 {
944 section,
945 tag,
946 source_filename
947 ? source_filename
948 : "<input>",
949 nr);
950 }
951 GNUNET_free (tag);
952 continue;
953 }
954 /* parse error */
956 "Syntax error while deserializing in line %u\n",
957 nr);
959 break;
960 }
961 GNUNET_free (line_orig);
962 GNUNET_free (section);
963 GNUNET_assert ( (GNUNET_OK != ret) ||
964 (r_bytes == size) );
965 return ret;
966}
enum GNUNET_GenericReturnValue handle_inline(struct GNUNET_CONFIGURATION_Handle *cfg, const char *path_or_glob, bool path_is_glob, const char *restrict_section, const char *source_filename, unsigned int source_lineno)
Handle an inline directive.
static void set_entry_hint(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *hint_filename, unsigned int hint_line)
Set a configuration hint.
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static char * line
Desired phone line (string to be converted to a hash).
static char * value
Value of the record to add/remove.
@ GNUNET_NO
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
bool diagnostics
Enable diagnostics.
const char * restrict_section
When parsing into this configuration, and this value is non-NULL, only parse sections of the same nam...

References cfg, GNUNET_CONFIGURATION_Handle::diagnostics, end, GNUNET_assert, GNUNET_CONFIGURATION_set_value_string(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_NO, GNUNET_OK, GNUNET_strdup, GNUNET_strndup, GNUNET_SYSERR, GNUNET_YES, handle_inline(), line, LOG, GNUNET_CONFIGURATION_Handle::restrict_section, ret, set_entry_hint(), size, and value.

Referenced by GNUNET_CONFIGURATION_parse(), GNUNET_TESTING_get_topo_from_string_(), handle_auto_result(), handle_autoconfig_request(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_write()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  filename 
)

Write configuration file.

Parameters
cfgconfiguration to write
filenamewhere to write the configuration
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1340 of file configuration.c.

1342{
1343 char *fn;
1344 char *cfg_buf;
1345 size_t size;
1346
1348 if (fn == NULL)
1349 return GNUNET_SYSERR;
1351 {
1352 GNUNET_free (fn);
1353 return GNUNET_SYSERR;
1354 }
1356 &size);
1357 {
1358 struct GNUNET_DISK_FileHandle *h;
1359
1368 if (NULL == h)
1369 {
1370 GNUNET_free (fn);
1371 GNUNET_free (cfg_buf);
1372 return GNUNET_SYSERR;
1373 }
1374 if (((ssize_t) size) !=
1376 cfg_buf,
1377 size))
1378 {
1380 "write",
1381 fn);
1383 (void) GNUNET_DISK_directory_remove (fn);
1384 GNUNET_free (fn);
1385 GNUNET_free (cfg_buf);
1386 cfg->dirty = GNUNET_SYSERR; /* last write failed */
1387 return GNUNET_SYSERR;
1388 }
1391 }
1392 GNUNET_free (fn);
1393 GNUNET_free (cfg_buf);
1394 cfg->dirty = GNUNET_NO; /* last write succeeded */
1395 return GNUNET_OK;
1396}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
char * GNUNET_CONFIGURATION_serialize(const struct GNUNET_CONFIGURATION_Handle *cfg, size_t *size)
Serializes the given configuration.
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1237
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:686
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_remove(const char *filename)
Remove all files in a directory (rm -rf).
Definition: disk.c:1087
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1308
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:582
@ GNUNET_DISK_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_TRUNCATE
Truncate file if it exists.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_GROUP_READ
Group can read.
@ GNUNET_DISK_PERM_GROUP_WRITE
Group can write.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
Handle used to access files (and pipes).

References cfg, GNUNET_CONFIGURATION_Handle::dirty, filename, GNUNET_assert, GNUNET_CONFIGURATION_serialize(), GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_directory_remove(), GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_write(), GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_TRUNCATE, GNUNET_DISK_OPEN_WRITE, GNUNET_DISK_PERM_GROUP_READ, GNUNET_DISK_PERM_GROUP_WRITE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log_strerror_file, GNUNET_NO, GNUNET_OK, GNUNET_STRINGS_filename_expand(), GNUNET_SYSERR, h, and size.

Referenced by create_unique_cfgs(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_write_diffs(), handle_delete_message(), handle_rename_message(), save_member(), save_member_session(), save_operation(), set_cont(), and start_peer_run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_write_diffs()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write_diffs ( const struct GNUNET_CONFIGURATION_Handle cfg_default,
const struct GNUNET_CONFIGURATION_Handle cfg_new,
const char *  filename 
)

Write only configuration entries that have been changed to configuration file.

Parameters
cfg_defaultdefault configuration
cfg_newnew configuration
filenamewhere to write the configuration diff between default and new
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1586 of file configuration.c.

1590{
1591 int ret;
1592 struct GNUNET_CONFIGURATION_Handle *diff;
1593
1594 diff = GNUNET_CONFIGURATION_get_diff (cfg_default, cfg_new);
1597 return ret;
1598}
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_get_diff(const struct GNUNET_CONFIGURATION_Handle *cfg_default, const struct GNUNET_CONFIGURATION_Handle *cfg_new)
Compute configuration with only entries that have been changed.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.

References filename, GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_diff(), GNUNET_CONFIGURATION_write(), and ret.

Referenced by auto_config_cb(), GNUNET_CONFIGURATION_config_tool_run(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_diff()

struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_get_diff ( const struct GNUNET_CONFIGURATION_Handle cfg_default,
const struct GNUNET_CONFIGURATION_Handle cfg_new 
)

Compute configuration with only entries that have been changed.

Parameters
cfg_defaultoriginal configuration
cfg_newnew configuration
Returns
configuration with only the differences, never NULL

Definition at line 1572 of file configuration.c.

1575{
1576 struct DiffHandle diffHandle;
1577
1578 diffHandle.cfgDiff = GNUNET_CONFIGURATION_create ();
1579 diffHandle.cfg_default = cfg_default;
1580 GNUNET_CONFIGURATION_iterate (cfg_new, &compare_entries, &diffHandle);
1581 return diffHandle.cfgDiff;
1582}
static void compare_entries(void *cls, const char *section, const char *option, const char *value)
A callback function, compares entries from two configurations (default against a new configuration) a...
Used for diffing a configuration object against the default one.
const struct GNUNET_CONFIGURATION_Handle * cfg_default
struct GNUNET_CONFIGURATION_Handle * cfgDiff

References DiffHandle::cfg_default, DiffHandle::cfgDiff, compare_entries(), GNUNET_CONFIGURATION_create(), and GNUNET_CONFIGURATION_iterate().

Referenced by conclude_autoconfig_request(), GNUNET_CONFIGURATION_write_diffs(), and next_phase().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_is_dirty()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_is_dirty ( const struct GNUNET_CONFIGURATION_Handle cfg)

Test if there are configuration options that were changed since the last save.

Parameters
cfgconfiguration to inspect
Returns
GNUNET_NO if clean, GNUNET_YES if dirty, GNUNET_SYSERR on error (i.e. last save failed)

Definition at line 1089 of file configuration.c.

1090{
1091 return cfg->dirty;
1092}

References cfg, and GNUNET_CONFIGURATION_Handle::dirty.

Referenced by auto_config_cb().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_parse_and_run()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse_and_run ( const char *  filename,
GNUNET_CONFIGURATION_Callback  cb,
void *  cb_cls 
)

Parse a configuration file filename and run the function cb with the resulting configuration object.

Then free the configuration object and return the status value from cb.

Parameters
filenameconfiguration to parse, NULL for "default"
cbfunction to run
cb_clsclosure for cb
Returns
GNUNET_SYSERR if parsing the configuration failed, otherwise return value from cb.

Definition at line 329 of file configuration.c.

332{
335
337 if (GNUNET_OK !=
339 filename))
340 {
341 GNUNET_break (0);
343 return GNUNET_SYSERR;
344 }
345 ret = cb (cb_cls, cfg);
347 return ret;
348}

References cfg, filename, GNUNET_break, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_load(), GNUNET_OK, GNUNET_SYSERR, and ret.

Referenced by GNUNET_DISK_purge_cfg_dir().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_enable_diagnostics()

void GNUNET_CONFIGURATION_enable_diagnostics ( struct GNUNET_CONFIGURATION_Handle cfg)

Enable extra diagnostics.

Will produce more log output and allocate more memory.

Parameters
cfgconfiguration handle

Definition at line 214 of file configuration.c.

216{
217 cfg->diagnostics = true;
218}

References cfg, and GNUNET_CONFIGURATION_Handle::diagnostics.

Referenced by GNUNET_CONFIGURATION_config_tool_run().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_iterate()

void GNUNET_CONFIGURATION_iterate ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_CONFIGURATION_Iterator  iter,
void *  iter_cls 
)

Iterate over all options in the configuration.

Parameters
cfgconfiguration to inspect
iterfunction to call on each option
iter_clsclosure for iter

Definition at line 1400 of file configuration.c.

1403{
1404 for (struct ConfigSection *spos = cfg->sections;
1405 NULL != spos;
1406 spos = spos->next)
1407 for (struct ConfigEntry *epos = spos->entries;
1408 NULL != epos;
1409 epos = epos->next)
1410 if (NULL != epos->val)
1411 iter (iter_cls,
1412 spos->name,
1413 epos->key,
1414 epos->val);
1415}

References cfg, ConfigEntry::next, ConfigSection::next, and GNUNET_CONFIGURATION_Handle::sections.

Referenced by get_cont(), GNUNET_CONFIGURATION_dup(), GNUNET_CONFIGURATION_get_diff(), and GNUNET_TESTBED_configuration_create().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_iterate_sections()

void GNUNET_CONFIGURATION_iterate_sections ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_CONFIGURATION_SectionIterator  iter,
void *  iter_cls 
)

Iterate over all sections in the configuration.

Parameters
cfgconfiguration to inspect
iterfunction to call on each section
iter_clsclosure for iter

Definition at line 1448 of file configuration.c.

1452{
1453 struct ConfigSection *spos;
1454 struct ConfigSection *next;
1455
1456 next = cfg->sections;
1457 while (next != NULL)
1458 {
1459 spos = next;
1460 next = spos->next;
1461 iter (iter_cls, spos->name);
1462 }
1463}

References cfg, ConfigSection::name, ConfigSection::next, and GNUNET_CONFIGURATION_Handle::sections.

Referenced by GNUNET_CONFIGURATION_config_tool_run(), GNUNET_TESTBED_configuration_create(), handle_delete_message(), handle_rename_message(), and run().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_remove_section()

void GNUNET_CONFIGURATION_remove_section ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section 
)

Remove the given section and all options in it.

Parameters
cfgconfiguration to inspect
sectionname of the section to remove

Definition at line 1467 of file configuration.c.

1469{
1470 struct ConfigSection *spos;
1471 struct ConfigSection *prev;
1472 struct ConfigEntry *ent;
1473
1474 prev = NULL;
1475 spos = cfg->sections;
1476 while (NULL != spos)
1477 {
1478 if (0 == strcasecmp (section, spos->name))
1479 {
1480 if (NULL == prev)
1481 cfg->sections = spos->next;
1482 else
1483 prev->next = spos->next;
1484 while (NULL != (ent = spos->entries))
1485 {
1486 spos->entries = ent->next;
1487 GNUNET_free (ent->key);
1488 GNUNET_free (ent->val);
1490 GNUNET_free (ent);
1491 cfg->dirty = GNUNET_YES;
1492 }
1493 GNUNET_free (spos->name);
1497 GNUNET_free (spos);
1498 return;
1499 }
1500 prev = spos;
1501 spos = spos->next;
1502 }
1503}
char * hint_filename
Diagnostics information for the filename.
Definition: configuration.c:58
char * key
key for this entry
Definition: configuration.c:48
char * val
current, committed value
Definition: configuration.c:53
char * hint_inlined_from_filename
For secret sections: Where was this inlined from?
struct ConfigEntry * entries
entries in the section
Definition: configuration.c:80
char * hint_secret_filename
Diagnostics hint for the secret file.
Definition: configuration.c:98
char * hint_secret_stat
Extra information regarding permissions of the secret file.

References cfg, GNUNET_CONFIGURATION_Handle::dirty, ConfigSection::entries, GNUNET_free, GNUNET_YES, ConfigEntry::hint_filename, ConfigSection::hint_inlined_from_filename, ConfigSection::hint_secret_filename, ConfigSection::hint_secret_stat, ConfigEntry::key, ConfigSection::name, ConfigEntry::next, ConfigSection::next, GNUNET_CONFIGURATION_Handle::sections, and ConfigEntry::val.

Referenced by GNUNET_CONFIGURATION_destroy().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_number()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
unsigned long long *  number 
)

Get a configuration value that should be a number.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
numberwhere to store the numeric value of the option
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1663 of file configuration.c.

1668{
1669 struct ConfigEntry *e;
1670 char dummy[2];
1671
1672 if (NULL == (e = find_entry (cfg, section, option)))
1673 return GNUNET_SYSERR;
1674 if (NULL == e->val)
1675 return GNUNET_SYSERR;
1676 if (1 != sscanf (e->val, "%llu%1s", number, dummy))
1677 return GNUNET_SYSERR;
1678 return GNUNET_OK;
1679}
static struct ConfigEntry * find_entry(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *key)
Find an entry from a configuration.
static struct in_addr dummy
Target "dummy" address of the packet we pretend to respond to.
uint32_t number

References cfg, dummy, find_entry(), GNUNET_OK, GNUNET_SYSERR, number, and ConfigEntry::val.

Referenced by create_service(), create_subnets(), DHTU_ip_init(), GCD_init(), GCO_init(), GDS_NEIGHBOURS_init(), get_server_addresses(), GNUNET_CLIENT_connect(), GNUNET_CLIENT_test(), GNUNET_HOSTLIST_server_start(), GNUNET_NAT_AUTO_test_start(), GNUNET_PROGRAM_run2(), GNUNET_REVOCATION_revoke(), GNUNET_SERVICE_run_(), GNUNET_SOCKS_do_connect(), GNUNET_TESTING_get_topo_from_string_(), GNUNET_TRANSPORT_communicator_connect(), GSF_cadet_start_server(), GSF_pending_request_init_(), libgnunet_plugin_block_revocation_init(), libgnunet_plugin_datastore_heap_init(), load_member_session(), load_operation(), run(), setup_exit_helper_args(), test_service_configuration(), test_stun(), and update_config().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_float()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_float ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
float *  number 
)

Get a configuration value that should be a floating point number.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
numberwhere to store the floating value of the option
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1683 of file configuration.c.

1688{
1689 struct ConfigEntry *e;
1690 char dummy[2];
1691
1692 if (NULL == (e = find_entry (cfg, section, option)))
1693 return GNUNET_SYSERR;
1694 if (NULL == e->val)
1695 return GNUNET_SYSERR;
1696 if (1 != sscanf (e->val, "%f%1s", number, dummy))
1697 return GNUNET_SYSERR;
1698 return GNUNET_OK;
1699}

References cfg, dummy, find_entry(), GNUNET_OK, GNUNET_SYSERR, number, and ConfigEntry::val.

Referenced by GNUNET_RPS_connect().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_time()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
struct GNUNET_TIME_Relative time 
)

Get a configuration value that should be a relative time.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
timeset to the time value stored in the configuration
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1703 of file configuration.c.

1708{
1709 struct ConfigEntry *e;
1710 int ret;
1711
1712 if (NULL == (e = find_entry (cfg, section, option)))
1713 return GNUNET_SYSERR;
1714 if (NULL == e->val)
1715 return GNUNET_SYSERR;
1717 if (GNUNET_OK != ret)
1719 section,
1720 option,
1721 _ ("Not a valid relative time specification"));
1722 return ret;
1723}
void GNUNET_log_config_invalid(enum GNUNET_ErrorType kind, const char *section, const char *option, const char *required)
Log error message about invalid configuration option value.
enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_time_to_relative(const char *fancy_time, struct GNUNET_TIME_Relative *rtime)
Convert a given fancy human-readable time to our internal representation.
Definition: strings.c:260

References _, cfg, find_entry(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log_config_invalid(), GNUNET_OK, GNUNET_STRINGS_fancy_time_to_relative(), GNUNET_SYSERR, ret, and ConfigEntry::val.

Referenced by GCD_init(), GNUNET_REVOCATION_revoke(), GNUNET_SPEEDUP_start_(), GSF_push_init_(), libgnunet_plugin_block_revocation_init(), RECLAIM_TICKETS_init(), REST_openid_init(), run(), and token_endpoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_size()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_size ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
unsigned long long *  size 
)

Get a configuration value that should be a size in bytes.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
sizeset to the size in bytes as stored in the configuration
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1727 of file configuration.c.

1732{
1733 struct ConfigEntry *e;
1734
1735 if (NULL == (e = find_entry (cfg, section, option)))
1736 return GNUNET_SYSERR;
1737 if (NULL == e->val)
1738 return GNUNET_SYSERR;
1740}
enum GNUNET_GenericReturnValue GNUNET_STRINGS_fancy_size_to_bytes(const char *fancy_size, unsigned long long *size)
Convert a given fancy human-readable size to bytes.
Definition: strings.c:236

References cfg, find_entry(), GNUNET_STRINGS_fancy_size_to_bytes(), GNUNET_SYSERR, size, and ConfigEntry::val.

Referenced by GNUNET_DATACACHE_create(), and run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_have_value()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_have_value ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option 
)

Test if we have a value for a particular option.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
Returns
GNUNET_YES if so, GNUNET_NO if not.

Definition at line 1836 of file configuration.c.

1839{
1840 struct ConfigEntry *e;
1841
1842 if ((NULL == (e = find_entry (cfg, section, option))) || (NULL == e->val))
1843 return GNUNET_NO;
1844 return GNUNET_YES;
1845}

References cfg, find_entry(), GNUNET_NO, GNUNET_YES, and ConfigEntry::val.

Referenced by check_config(), get_server_addresses(), GNUNET_CLIENT_connect(), GNUNET_CLIENT_test(), GNUNET_CONFIGURATION_load(), GNUNET_HOSTLIST_server_start(), GNUNET_PROGRAM_run2(), GNUNET_SERVICE_run_(), GNUNET_SOCKS_check_service(), process_acl4(), process_acl6(), setup_service(), start_arm_service(), test_service_configuration(), and update_config_sections().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_string()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
char **  value 
)

Get a configuration value that should be a string.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
valuewill be set to a freshly allocated configuration value, or NULL if option is not specified
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1754 of file configuration.c.

1759{
1760 struct ConfigEntry *e;
1761
1762 if ((NULL == (e = find_entry (cfg, section, option))) || (NULL == e->val))
1763 {
1764 *value = NULL;
1765 return GNUNET_SYSERR;
1766 }
1767 *value = GNUNET_strdup (e->val);
1768 return GNUNET_OK;
1769}

References cfg, find_entry(), GNUNET_OK, GNUNET_strdup, GNUNET_SYSERR, ConfigEntry::val, and value.

Referenced by advertise_dns_exit(), check_authorization(), check_config(), client_connect_cb(), communicator_start(), DHTU_ip_init(), expand_dollar(), get_bootstrap_server(), get_server_addresses(), gg_load_configuration(), GNUNET_CLIENT_connect(), GNUNET_CLIENT_test(), GNUNET_CONFIGURATION_append_value_filename(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_get_data(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_iterate_value_filenames(), GNUNET_CONFIGURATION_remove_value_filename(), GNUNET_CONVERSATION_phone_create(), GNUNET_DATACACHE_create(), GNUNET_FS_unindex_do_extract_keywords_(), GNUNET_GNS_lookup_with_tld(), GNUNET_HOSTLIST_client_start(), GNUNET_HOSTLIST_server_start(), GNUNET_OS_get_suid_binary_path(), GNUNET_PQ_connect_with_cfg2(), GNUNET_SERVICE_run_(), GNUNET_SOCKS_do_connect(), GNUNET_TESTING_get_topo_from_string_(), handle_ego_delete(), handle_ego_rename(), handle_register(), handle_uri(), identity_continuation(), load_member_session(), load_member_session_next(), login_redirect(), mq_init(), plugins_load(), process_acl4(), process_acl6(), read_service_conf(), run(), setup_exit_helper_args(), setup_service(), sock_read(), start_arm_service(), start_peer_run(), start_process(), test_icmp_client(), test_icmp_server(), test_service_configuration(), token_endpoint(), and update_config_sections().

Here is the call graph for this function:

◆ GNUNET_CONFIGURATION_get_value_filename()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
char **  value 
)

Get a configuration value that should be the name of a file or directory.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
valuewill be set to a freshly allocated configuration value, or NULL if option is not specified
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 2044 of file configuration.c.

2049{
2050 char *tmp;
2051
2052 if (GNUNET_OK !=
2053 GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &tmp))
2054 {
2055 LOG (GNUNET_ERROR_TYPE_DEBUG, "Failed to retrieve filename\n");
2056 *value = NULL;
2057 return GNUNET_SYSERR;
2058 }
2061 GNUNET_free (tmp);
2062 if (*value == NULL)
2063 return GNUNET_SYSERR;
2064 return GNUNET_OK;
2065}
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
char * GNUNET_CONFIGURATION_expand_dollar(const struct GNUNET_CONFIGURATION_Handle *cfg, char *orig)
Expand an expression of the form "$FOO/BAR" to "DIRECTORY/BAR" where either in the "PATHS" section or...

References cfg, GNUNET_CONFIGURATION_expand_dollar(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_OK, GNUNET_STRINGS_filename_expand(), GNUNET_SYSERR, LOG, and value.

Referenced by create_service(), database_connect(), database_setup(), get_oidc_dir_path(), get_pid_file_name(), get_serialization_file_name(), get_serialization_file_name_in_dir(), get_server_addresses(), get_update_information_directory(), get_user_name(), GNUNET_CLIENT_test(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CRYPTO_eddsa_key_create_from_configuration(), GNUNET_HOSTLIST_client_start(), GNUNET_PQ_connect_with_cfg2(), GNUNET_TIME_absolute_get_monotonic(), load(), load_hostlist_file(), main_init(), new_sub(), print_filename_option(), purge_cfg_dir(), read_index_list(), run(), save(), save_hostlist_file(), setup_service(), start_arm_service(), start_peer_run(), test_service_configuration(), try_unixpath(), write_index_list(), and write_proof().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_iterate_value_filenames()

int GNUNET_CONFIGURATION_iterate_value_filenames ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
GNUNET_FileNameCallback  cb,
void *  cb_cls 
)

Iterate over the set of filenames stored in a configuration value.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
cbfunction to call on each filename
cb_clsclosure for cb
Returns
number of filenames iterated over, -1 on error

Definition at line 2089 of file configuration.c.

2095{
2096 char *list;
2097 char *pos;
2098 char *end;
2099 char old;
2100 int ret;
2101
2102 if (GNUNET_OK !=
2103 GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &list))
2104 return 0;
2105 GNUNET_assert (list != NULL);
2106 ret = 0;
2107 pos = list;
2108 while (1)
2109 {
2110 while (pos[0] == ' ')
2111 pos++;
2112 if (strlen (pos) == 0)
2113 break;
2114 end = pos + 1;
2115 while ((end[0] != ' ') && (end[0] != '\0'))
2116 {
2117 if (end[0] == '\\')
2118 {
2119 switch (end[1])
2120 {
2121 case '\\':
2122 case ' ':
2123 memmove (end, &end[1], strlen (&end[1]) + 1);
2124
2125 case '\0':
2126 /* illegal, but just keep it */
2127 break;
2128
2129 default:
2130 /* illegal, but just ignore that there was a '/' */
2131 break;
2132 }
2133 }
2134 end++;
2135 }
2136 old = end[0];
2137 end[0] = '\0';
2138 if (strlen (pos) > 0)
2139 {
2140 ret++;
2141 if ((cb != NULL) && (GNUNET_OK != cb (cb_cls, pos)))
2142 {
2144 break;
2145 }
2146 }
2147 if (old == '\0')
2148 break;
2149 pos = end + 1;
2150 }
2151 GNUNET_free (list);
2152 return ret;
2153}
static int list
Set if we should print a list of currently running services.
Definition: gnunet-arm.c:69

References cfg, end, GNUNET_assert, GNUNET_CONFIGURATION_get_value_string(), GNUNET_free, GNUNET_OK, GNUNET_SYSERR, list, and ret.

Referenced by GNUNET_CONFIGURATION_append_value_filename().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_iterate_section_values()

void GNUNET_CONFIGURATION_iterate_section_values ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
GNUNET_CONFIGURATION_Iterator  iter,
void *  iter_cls 
)

Iterate over values of a section in the configuration.

Parameters
cfgconfiguration to inspect
sectionthe section
iterfunction to call on each option
iter_clsclosure for iter

Definition at line 1419 of file configuration.c.

1424{
1425 struct ConfigSection *spos;
1426 struct ConfigEntry *epos;
1427
1428 spos = cfg->sections;
1429 while ((spos != NULL) && (0 != strcasecmp (spos->name, section)))
1430 spos = spos->next;
1431 if (NULL == spos)
1432 return;
1433 if (spos->inaccessible)
1434 {
1436 "Section '%s' is marked as inaccessible, because the configuration "
1437 " file that contains the section can't be read.\n",
1438 section);
1439 return;
1440 }
1441 for (epos = spos->entries; NULL != epos; epos = epos->next)
1442 if (NULL != epos->val)
1443 iter (iter_cls, spos->name, epos->key, epos->val);
1444}
bool inaccessible
Is the configuration section marked as inaccessible?
Definition: configuration.c:93

References cfg, ConfigSection::entries, GNUNET_ERROR_TYPE_WARNING, ConfigSection::inaccessible, ConfigEntry::key, LOG, ConfigSection::name, ConfigEntry::next, ConfigSection::next, GNUNET_CONFIGURATION_Handle::sections, and ConfigEntry::val.

Referenced by authorize_endpoint(), auto_config_cb(), get_cont(), GNUNET_CONFIGURATION_config_tool_run(), and run().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_choice()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_choice ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
const char *const *  choices,
const char **  value 
)

Get a configuration value that should be in a set of predefined strings.

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
choicesNULL-terminated list of legal values
valuewill be set to an entry in the legal list, or NULL if option is not specified and no default given
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 1773 of file configuration.c.

1779{
1780 struct ConfigEntry *e;
1781 unsigned int i;
1782
1783 if (NULL == (e = find_entry (cfg, section, option)))
1784 return GNUNET_SYSERR;
1785 for (i = 0; NULL != choices[i]; i++)
1786 if (0 == strcasecmp (choices[i], e->val))
1787 break;
1788 if (NULL == choices[i])
1789 {
1791 _ ("Configuration value '%s' for '%s'"
1792 " in section '%s' is not in set of legal choices\n"),
1793 e->val,
1794 option,
1795 section);
1796 return GNUNET_SYSERR;
1797 }
1798 *value = choices[i];
1799 return GNUNET_OK;
1800}

References _, cfg, warningfilter::choices, find_entry(), GNUNET_ERROR_TYPE_ERROR, GNUNET_OK, GNUNET_SYSERR, LOG, ConfigEntry::val, and value.

Referenced by GNUNET_CONFIGURATION_get_value_yesno(), and start_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_value_yesno()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option 
)

Get a configuration value that should be in a set of "YES" or "NO".

Parameters
cfgconfiguration to inspect
sectionsection of interest
optionoption of interest
Returns
GNUNET_YES, GNUNET_NO or if option has no valid value, GNUNET_SYSERR

Definition at line 2069 of file configuration.c.

2073{
2074 static const char *yesno[] = { "YES", "NO", NULL };
2075 const char *val;
2076 int ret;
2077
2078 ret =
2079 GNUNET_CONFIGURATION_get_value_choice (cfg, section, option, yesno, &val);
2080 if (ret == GNUNET_SYSERR)
2081 return ret;
2082 if (val == yesno[0])
2083 return GNUNET_YES;
2084 return GNUNET_NO;
2085}
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_choice(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *const *choices, const char **value)
Get a configuration value that should be in a set of predefined strings.

References cfg, GNUNET_CONFIGURATION_get_value_choice(), GNUNET_NO, GNUNET_SYSERR, GNUNET_YES, ret, and ConfigEntry::val.

Referenced by advertise_dns_exit(), create_listen_socket(), create_service(), database_connect(), GDS_NEIGHBOURS_init(), get_server_addresses(), gg_load_configuration(), GNS_resolver_init(), GNUNET_DATACACHE_create(), GNUNET_STATISTICS_create(), GNUNET_TRANSPORT_TESTING_transport_communicator_service_start(), GSF_pending_request_init_(), GSF_push_init_(), libgnunet_plugin_datacache_sqlite_init(), load_underlay(), main_init(), parse_ip_options(), run(), setup_service(), sign_ephemeral_key(), start_arm_service(), start_process(), test_icmp_client(), test_icmp_server(), test_master(), udp_address_to_sockaddr(), and update_config().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_get_data()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_data ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
void *  buf,
size_t  buf_size 
)

Get Crockford32-encoded fixed-size binary data from a configuration.

Parameters
cfgconfiguration to access
sectionsection to access
optionoption to access
bufwhere to store the decoded binary result
buf_sizeexact number of bytes to store in buf
Returns
GNUNET_OK on success GNUNET_NO is the value does not exist GNUNET_SYSERR on decoding error

Definition at line 1804 of file configuration.c.

1809{
1810 char *enc;
1811 int res;
1812 size_t data_size;
1813
1814 if (GNUNET_OK !=
1815 (res =
1816 GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &enc)))
1817 return res;
1818 data_size = (strlen (enc) * 5) / 8;
1819 if (data_size != buf_size)
1820 {
1821 GNUNET_free (enc);
1822 return GNUNET_SYSERR;
1823 }
1824 if (GNUNET_OK !=
1825 GNUNET_STRINGS_string_to_data (enc, strlen (enc), buf, buf_size))
1826 {
1827 GNUNET_free (enc);
1828 return GNUNET_SYSERR;
1829 }
1830 GNUNET_free (enc);
1831 return GNUNET_OK;
1832}
static OpusEncoder * enc
OPUS encoder.
static char * res
Currently read line or NULL on EOF.
static size_t data_size
Number of bytes in data.
enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data(const char *enc, size_t enclen, void *out, size_t out_size)
Convert CrockfordBase32 encoding back to data.
Definition: strings.c:789

References cfg, data_size, enc, GNUNET_CONFIGURATION_get_value_string(), GNUNET_free, GNUNET_OK, GNUNET_STRINGS_string_to_data(), GNUNET_SYSERR, and res.

Referenced by load_member(), load_member_session_next(), and load_operation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_expand_dollar()

char * GNUNET_CONFIGURATION_expand_dollar ( const struct GNUNET_CONFIGURATION_Handle cfg,
char *  orig 
)

Expand an expression of the form "$FOO/BAR" to "DIRECTORY/BAR" where either in the "PATHS" section or the environment "FOO" is set to "DIRECTORY".

We also support default expansion, i.e. ${VARIABLE:-default} will expand to $VARIABLE if VARIABLE is set in PATHS or the environment, and otherwise to "default". Note that "default" itself can also be a $-expression, thus "${VAR1:-{$VAR2}}" will expand to VAR1 and if that is not defined to VAR2.

Parameters
cfgconfiguration to use for path expansion
origstring to $-expand (will be freed!) Note that multiple $-expressions can be present in this string. They will all be $-expanded.
Returns
$-expanded string

Definition at line 2019 of file configuration.c.

2022{
2023 char *dup;
2024 size_t i;
2025 size_t len;
2026
2027 for (i = 0; '\0' != orig[i]; i++)
2028 {
2029 if ('$' != orig[i])
2030 continue;
2031 dup = GNUNET_strdup (orig + i);
2032 dup = expand_dollar (cfg, dup, 0);
2033 GNUNET_assert (NULL != dup); /* make compiler happy */
2034 len = strlen (dup) + 1;
2035 orig = GNUNET_realloc (orig, i + len);
2036 GNUNET_memcpy (orig + i, dup, len);
2037 GNUNET_free (dup);
2038 }
2039 return orig;
2040}
static char * expand_dollar(const struct GNUNET_CONFIGURATION_Handle *cfg, char *orig, unsigned int depth)
Expand an expression of the form "$FOO/BAR" to "DIRECTORY/BAR" where either in the "PATHS" section or...
#define GNUNET_realloc(ptr, size)
Wrapper around realloc.

References cfg, expand_dollar(), GNUNET_assert, GNUNET_free, GNUNET_memcpy, GNUNET_realloc, and GNUNET_strdup.

Referenced by expand_dollar(), GNUNET_CONFIGURATION_get_value_filename(), run(), start_arm_service(), and start_process().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_set_value_number()

void GNUNET_CONFIGURATION_set_value_number ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
unsigned long long  number 
)

Set a configuration value that should be a number.

Parameters
cfgconfiguration to update
sectionsection of interest
optionoption of interest
numbervalue to set

Definition at line 1644 of file configuration.c.

1648{
1649 char s[64];
1650
1651 GNUNET_snprintf (s,
1652 64,
1653 "%llu",
1654 number);
1656 section,
1657 option,
1658 s);
1659}
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.

References cfg, GNUNET_CONFIGURATION_set_value_string(), GNUNET_snprintf(), and number.

Referenced by next_phase(), run(), save_member_session(), save_operation(), and set_value().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_set_value_string()

void GNUNET_CONFIGURATION_set_value_string ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
const char *  value 
)

Set a configuration value that should be a string.

Parameters
cfgconfiguration to update
sectionsection of interest
optionoption of interest
valuevalue to set

Definition at line 1602 of file configuration.c.

1606{
1607 struct ConfigSection *sec;
1608 struct ConfigEntry *e;
1609 char *nv;
1610
1611 e = find_entry (cfg, section, option);
1612 if (NULL != e)
1613 {
1614 if (NULL == value)
1615 {
1616 GNUNET_free (e->val);
1617 e->val = NULL;
1618 }
1619 else
1620 {
1621 nv = GNUNET_strdup (value);
1622 GNUNET_free (e->val);
1623 e->val = nv;
1624 }
1625 return;
1626 }
1627 sec = find_section (cfg, section);
1628 if (sec == NULL)
1629 {
1630 sec = GNUNET_new (struct ConfigSection);
1631 sec->name = GNUNET_strdup (section);
1632 sec->next = cfg->sections;
1633 cfg->sections = sec;
1634 }
1635 e = GNUNET_new (struct ConfigEntry);
1636 e->key = GNUNET_strdup (option);
1637 e->val = GNUNET_strdup (value);
1638 e->next = sec->entries;
1639 sec->entries = e;
1640}
static struct ConfigSection * find_section(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Find a section entry from a configuration.

References cfg, ConfigSection::entries, find_entry(), find_section(), GNUNET_free, GNUNET_new, GNUNET_strdup, ConfigEntry::key, ConfigSection::name, ConfigEntry::next, ConfigSection::next, GNUNET_CONFIGURATION_Handle::sections, ConfigEntry::val, and value.

Referenced by auto_conf_iter(), auto_config_cb(), compare_entries(), copy_entry(), GNUNET_CONFIGURATION_append_value_filename(), GNUNET_CONFIGURATION_config_tool_run(), GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_deserialize(), GNUNET_CONFIGURATION_load(), GNUNET_CONFIGURATION_remove_value_filename(), GNUNET_CONFIGURATION_set_value_number(), GNUNET_NAT_autoconfig_start(), GNUNET_PROGRAM_run2(), GNUNET_TESTBED_configuration_create(), handle_ego_delete(), handle_ego_rename(), handle_inline(), identity_cb(), next_phase(), process_if(), result_callback(), run(), save_member(), save_member_session(), save_operation(), set_external_ipv4(), set_value(), start_peer_run(), test_local_ip(), test_upnpc(), update_config(), update_config_sections(), and update_enable_upnpc_option().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_remove_value_filename()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_remove_value_filename ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
const char *  value 
)

Remove a filename from a configuration value that represents a list of filenames.

Parameters
cfgconfiguration to update
sectionsection of interest
optionoption of interest
valuefilename to remove
Returns
GNUNET_OK on success, GNUNET_SYSERR if the filename is not in the list

Definition at line 2249 of file configuration.c.

2254{
2255 char *list;
2256 char *pos;
2257 char *end;
2258 char *match;
2259 char old;
2260
2261 if (GNUNET_OK !=
2263 section,
2264 option,
2265 &list))
2266 return GNUNET_NO;
2267 match = escape_name (value);
2268 pos = list;
2269 while (1)
2270 {
2271 while (pos[0] == ' ')
2272 pos++;
2273 if (strlen (pos) == 0)
2274 break;
2275 end = pos + 1;
2276 while ((end[0] != ' ') && (end[0] != '\0'))
2277 {
2278 if (end[0] == '\\')
2279 {
2280 switch (end[1])
2281 {
2282 case '\\':
2283 case ' ':
2284 end++;
2285 break;
2286
2287 case '\0':
2288 /* illegal, but just keep it */
2289 break;
2290
2291 default:
2292 /* illegal, but just ignore that there was a '/' */
2293 break;
2294 }
2295 }
2296 end++;
2297 }
2298 old = end[0];
2299 end[0] = '\0';
2300 if (0 == strcmp (pos, match))
2301 {
2302 if (old != '\0')
2303 memmove (pos,
2304 &end[1],
2305 strlen (&end[1]) + 1);
2306 else
2307 {
2308 if (pos != list)
2309 pos[-1] = '\0';
2310 else
2311 pos[0] = '\0';
2312 }
2314 section,
2315 option,
2316 list);
2317 GNUNET_free (list);
2318 GNUNET_free (match);
2319 return GNUNET_OK;
2320 }
2321 if (old == '\0')
2322 break;
2323 end[0] = old;
2324 pos = end + 1;
2325 }
2326 GNUNET_free (list);
2327 GNUNET_free (match);
2328 return GNUNET_NO;
2329}
static char * escape_name(const char *value)
FIXME.

References cfg, end, escape_name(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_NO, GNUNET_OK, list, and value.

Here is the call graph for this function:

◆ GNUNET_CONFIGURATION_append_value_filename()

enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_append_value_filename ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
const char *  value 
)

Append a filename to a configuration value that represents a list of filenames.

Parameters
cfgconfiguration to update
sectionsection of interest
optionoption of interest
valuefilename to append
Returns
GNUNET_OK on success, GNUNET_SYSERR if the filename already in the list

Definition at line 2211 of file configuration.c.

2216{
2217 char *escaped;
2218 char *old;
2219 char *nw;
2220
2221 if (GNUNET_SYSERR ==
2223 section,
2224 option,
2225 &test_match,
2226 (void *) value))
2227 return GNUNET_NO; /* already exists */
2228 if (GNUNET_OK !=
2229 GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &old))
2230 old = GNUNET_strdup ("");
2231 escaped = escape_name (value);
2232 nw = GNUNET_malloc (strlen (old) + strlen (escaped) + 2);
2233 strcpy (nw, old);
2234 if (strlen (old) > 0)
2235 strcat (nw, " ");
2236 strcat (nw, escaped);
2238 section,
2239 option,
2240 nw);
2241 GNUNET_free (old);
2242 GNUNET_free (nw);
2243 GNUNET_free (escaped);
2244 return GNUNET_OK;
2245}
static enum GNUNET_GenericReturnValue test_match(void *cls, const char *fn)
FIXME.
int GNUNET_CONFIGURATION_iterate_value_filenames(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, GNUNET_FileNameCallback cb, void *cb_cls)
Iterate over the set of filenames stored in a configuration value.

References cfg, escape_name(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_iterate_value_filenames(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_malloc, GNUNET_NO, GNUNET_OK, GNUNET_strdup, GNUNET_SYSERR, test_match(), and value.

Here is the call graph for this function:

◆ GNUNET_CONFIGURATION_config_settings_free()

void GNUNET_CONFIGURATION_config_settings_free ( struct GNUNET_CONFIGURATION_ConfigSettings cs)

Free resources associated with cs.

Parameters
[in]cssettings to free (actual memory of cs itself is not released)

Definition at line 294 of file configuration_helper.c.

296{
297 GNUNET_free (cs->option);
298 GNUNET_free (cs->section);
299 GNUNET_free (cs->value);
300}

References GNUNET_free, GNUNET_CONFIGURATION_ConfigSettings::option, GNUNET_CONFIGURATION_ConfigSettings::section, and GNUNET_CONFIGURATION_ConfigSettings::value.

Referenced by main().

Here is the caller graph for this function:

◆ GNUNET_CONFIGURATION_config_tool_run()

void GNUNET_CONFIGURATION_config_tool_run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)

Main task to run to perform operations typical for gnunet-config as per the configuration settings given in cls.

Parameters
clsclosure with the struct GNUNET_CONFIGURATION_ConfigSettings
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 108 of file configuration_helper.c.

113{
115 struct GNUNET_CONFIGURATION_Handle *out = NULL;
116 struct GNUNET_CONFIGURATION_Handle *ncfg = NULL;
117
118 (void) args;
119 if (cs->diagnostics)
120 {
121 /* Re-parse the configuration with diagnostics enabled. */
125 cfgfile);
126 cfg = ncfg;
127 }
128
129 if (cs->full)
130 cs->rewrite = GNUNET_YES;
131 if (cs->list_sections)
132 {
133 fprintf (stderr,
134 _ ("The following sections are available:\n"));
137 NULL);
138 return;
139 }
140 if ( (! cs->rewrite) &&
141 (NULL == cs->section) )
142 {
143 char *serialization;
144
145 if (! cs->diagnostics)
146 {
147 fprintf (stderr,
148 _ ("%s, %s or %s argument is required\n"),
149 "--section",
150 "--list-sections",
151 "--diagnostics");
153 return;
154 }
156 fprintf (stdout,
157 "%s",
158 serialization);
159 GNUNET_free (serialization);
160 }
161 else if ( (NULL != cs->section) &&
162 (NULL == cs->value) )
163 {
164 if (NULL == cs->option)
165 {
167 cfg,
168 cs->section,
169 cs->is_filename
171 : &print_option,
172 (void *) cfg);
173 }
174 else
175 {
176 char *value;
177
178 if (cs->is_filename)
179 {
180 if (GNUNET_OK !=
182 cs->section,
183 cs->option,
184 &value))
185 {
187 cs->section,
188 cs->option);
190 return;
191 }
192 }
193 else
194 {
195 if (GNUNET_OK !=
197 cs->section,
198 cs->option,
199 &value))
200 {
202 cs->section,
203 cs->option);
205 return;
206 }
207 }
208 fprintf (stdout,
209 "%s\n",
210 value);
212 }
213 }
214 else if (NULL != cs->section)
215 {
216 if (NULL == cs->option)
217 {
218 fprintf (stderr,
219 _ ("--option argument required to set value\n"));
221 return;
222 }
225 cs->section,
226 cs->option,
227 cs->value);
228 cs->rewrite = GNUNET_YES;
229 }
230 if (cs->rewrite)
231 {
232 char *cfg_fn = NULL;
233
234 if (NULL == out)
236
237 if (NULL == cfgfile)
238 {
239 const char *xdg = getenv ("XDG_CONFIG_HOME");
240
241 if (NULL != xdg)
242 GNUNET_asprintf (&cfg_fn,
243 "%s%s%s",
244 xdg,
247 else
248 cfg_fn = GNUNET_strdup (
249 GNUNET_OS_project_data_get ()->user_config_file);
250 cfgfile = cfg_fn;
251 }
252
253 if (! cs->full)
254 {
255 struct GNUNET_CONFIGURATION_Handle *def;
256
258 if (GNUNET_OK !=
260 NULL))
261 {
262 fprintf (stderr,
263 _ ("failed to load configuration defaults"));
264 cs->global_ret = 1;
267 GNUNET_free (cfg_fn);
268 return;
269 }
270 if (GNUNET_OK !=
272 out,
273 cfgfile))
274 cs->global_ret = 2;
276 }
277 else
278 {
279 if (GNUNET_OK !=
281 cfgfile))
282 cs->global_ret = 2;
283 }
284 GNUNET_free (cfg_fn);
285 }
286 if (NULL != out)
288 if (NULL != ncfg)
290}
static void print_filename_option(void *cls, const char *section, const char *option, const char *value)
Print each option in a given section as a filename.
static void print_section_name(void *cls, const char *section)
Print out given section name.
static void print_option(void *cls, const char *section, const char *option, const char *value)
Print each option in a given section.
static char * config_file
Set to the name of the config file used.
Definition: gnunet-arm.c:84
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_dup(const struct GNUNET_CONFIGURATION_Handle *cfg)
Duplicate an existing configuration object.
void GNUNET_CONFIGURATION_iterate_sections(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_SectionIterator iter, void *iter_cls)
Iterate over all sections in the configuration.
void GNUNET_CONFIGURATION_iterate_section_values(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, GNUNET_CONFIGURATION_Iterator iter, void *iter_cls)
Iterate over values of a section in the configuration.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write_diffs(const struct GNUNET_CONFIGURATION_Handle *cfg_default, const struct GNUNET_CONFIGURATION_Handle *cfg_new, const char *filename)
Write only configuration entries that have been changed to configuration file.
char * GNUNET_CONFIGURATION_serialize_diagnostics(const struct GNUNET_CONFIGURATION_Handle *cfg)
Serializes the given configuration with diagnostics information.
void GNUNET_CONFIGURATION_enable_diagnostics(struct GNUNET_CONFIGURATION_Handle *cfg)
Enable extra diagnostics.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
#define EXIT_INVALIDARGUMENT
Definition: platform.h:253
#define EXIT_NOTCONFIGURED
Definition: platform.h:269
Closure for GNUNET_CONFIGURATION_config_tool_run() with settings for what should be done with the con...
int full
Should the generated configuration file contain the whole configuration?
int global_ret
Return value from the operation, to be returned from 'main'.
int diagnostics
Should we give extra diagnostics?
int list_sections
Whether to show the sections.
int rewrite
Should we write out the configuration file, even if no value was changed?
int is_filename
Treat option as a filename.

References _, consensus-simulation::args, cfg, config_file, GNUNET_CONFIGURATION_ConfigSettings::diagnostics, DIR_SEPARATOR_STR, EXIT_INVALIDARGUMENT, EXIT_NOTCONFIGURED, GNUNET_CONFIGURATION_ConfigSettings::full, getenv(), GNUNET_CONFIGURATION_ConfigSettings::global_ret, GNUNET_asprintf(), GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_dup(), GNUNET_CONFIGURATION_enable_diagnostics(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_iterate_section_values(), GNUNET_CONFIGURATION_iterate_sections(), GNUNET_CONFIGURATION_load(), GNUNET_CONFIGURATION_serialize_diagnostics(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_CONFIGURATION_write_diffs(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log_config_missing(), GNUNET_OK, GNUNET_OS_project_data_get(), GNUNET_strdup, GNUNET_YES, GNUNET_CONFIGURATION_ConfigSettings::is_filename, GNUNET_CONFIGURATION_ConfigSettings::list_sections, GNUNET_CONFIGURATION_ConfigSettings::option, print_filename_option(), print_option(), print_section_name(), GNUNET_CONFIGURATION_ConfigSettings::rewrite, GNUNET_CONFIGURATION_ConfigSettings::section, value, and GNUNET_CONFIGURATION_ConfigSettings::value.

Referenced by main().

Here is the call graph for this function:
Here is the caller graph for this function: