GNUnet 0.21.2
configuration.c File Reference
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_configuration_lib.h"
Include dependency graph for configuration.c:

Go to the source code of this file.

Data Structures

struct  ConfigEntry
 configuration entry More...
 
struct  ConfigSection
 configuration section More...
 
struct  ConfigFile
 
struct  GNUNET_CONFIGURATION_Handle
 configuration data More...
 
struct  DiffHandle
 Used for diffing a configuration object against the default one. More...
 
struct  CollectFilesContext
 Closure to collect_files_cb. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "util", __VA_ARGS__)
 
#define LOG_STRERROR_FILE(kind, syscall, filename)    GNUNET_log_from_strerror_file (kind, "util", syscall, filename)
 

Functions

void GNUNET_CONFIGURATION_enable_diagnostics (struct GNUNET_CONFIGURATION_Handle *cfg)
 Enable extra diagnostics. More...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_create ()
 Create a new configuration object. More...
 
void GNUNET_CONFIGURATION_destroy (struct GNUNET_CONFIGURATION_Handle *cfg)
 Destroy configuration object. 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...
 
static enum GNUNET_GenericReturnValue collect_files_cb (void *cls, const char *filename)
 Function called with a filename. More...
 
static struct ConfigSectionfind_section (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
 Find a section entry from a configuration. More...
 
static int pstrcmp (const void *a, const void *b)
 
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. More...
 
static struct ConfigEntryfind_entry (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *key)
 Find an entry from a configuration. More...
 
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. 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_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...
 
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...
 
static bool do_skip (const char *sec, const char *key)
 Should we skip this configuration entry when serializing? 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_write (struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
 Write configuration file. 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_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...
 
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...
 
static void copy_entry (void *cls, const char *section, const char *option, const char *value)
 Copy a configuration value to the given target configuration. More...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_dup (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Duplicate an existing configuration object. More...
 
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) and write the diffs in a diff-configuration object (the callback object). 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_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...
 
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...
 
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...
 
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_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_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_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...
 
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...
 
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 the environment "FOO" is set to "DIRECTORY". 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...
 
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...
 
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...
 
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...
 
static char * escape_name (const char *value)
 FIXME. More...
 
static enum GNUNET_GenericReturnValue test_match (void *cls, const char *fn)
 FIXME. 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...
 
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_load_from (struct GNUNET_CONFIGURATION_Handle *cfg, const char *defaults_d)
 Load 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...
 
struct GNUNET_CONFIGURATION_HandleGNUNET_CONFIGURATION_default (void)
 Return GNUnet's default configuration. More...
 
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
 Load configuration (starts with defaults, then loads system-specific configuration). More...
 

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "util", __VA_ARGS__)

Definition at line 30 of file configuration.c.

◆ LOG_STRERROR_FILE

#define LOG_STRERROR_FILE (   kind,
  syscall,
  filename 
)     GNUNET_log_from_strerror_file (kind, "util", syscall, filename)

Definition at line 32 of file configuration.c.

Function Documentation

◆ collect_files_cb()

static enum GNUNET_GenericReturnValue collect_files_cb ( void *  cls,
const char *  filename 
)
static

Function called with a filename.

Parameters
clsclosure
filenamecomplete filename (absolute path)
Returns
GNUNET_OK to continue to iterate, GNUNET_NO to stop iteration with no error, GNUNET_SYSERR to abort iteration with error!

Definition at line 378 of file configuration.c.

380{
381 struct CollectFilesContext *igc = cls;
382
384 igc->files_length,
386 return GNUNET_OK;
387}
static char * filename
@ GNUNET_OK
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
Closure to collect_files_cb.
char ** files
Collected files from globbing.
unsigned int files_length
Size of the files array.

References filename, CollectFilesContext::files, CollectFilesContext::files_length, GNUNET_array_append, GNUNET_OK, and GNUNET_strdup.

Referenced by GNUNET_CONFIGURATION_load_from(), and handle_inline().

Here is the caller graph for this function:

◆ find_section()

static struct ConfigSection * find_section ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section 
)
static

Find a section entry from a configuration.

Parameters
cfgconfiguration to search in
sectionname of the section to look for
Returns
matching entry, NULL if not found

Definition at line 398 of file configuration.c.

400{
401 struct ConfigSection *pos;
402
403 if (NULL == cfg)
404 return NULL;
405
406 pos = cfg->sections;
407 while ((pos != NULL) && (0 != strcasecmp (section, pos->name)))
408 pos = pos->next;
409 return pos;
410}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
configuration section
Definition: configuration.c:71
char * name
name of the section
Definition: configuration.c:85
struct ConfigSection * next
This is a linked list.
Definition: configuration.c:75
struct ConfigSection * sections
Configuration sections.

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

Referenced by find_entry(), GNUNET_CONFIGURATION_set_value_string(), and handle_inline().

Here is the caller graph for this function:

◆ pstrcmp()

static int pstrcmp ( const void *  a,
const void *  b 
)
static

Definition at line 414 of file configuration.c.

415{
416 return strcmp (*((const char **) a), *((const char **) b));
417}

Referenced by GNUNET_CONFIGURATION_load_from(), and handle_inline().

Here is the caller graph for this function:

◆ handle_inline()

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.

Returns
GNUNET_SYSERR on error, GNUNET_OK otherwise

Definition at line 426 of file configuration.c.

432{
433 char *inline_path = NULL;
434 struct GNUNET_CONFIGURATION_Handle *other_cfg = NULL;
435 struct CollectFilesContext igc = {
436 .files = NULL,
437 .files_length = 0,
438 };
439 enum GNUNET_GenericReturnValue fun_ret;
440 unsigned int old_nest_level = cfg->current_nest_level++;
441
442 /* We support the section restriction only for non-globs */
443 GNUNET_assert (! (path_is_glob && (NULL != restrict_section)));
444
445 if (NULL == source_filename)
446 {
448 "Refusing to parse inline configurations, "
449 "not allowed without source filename!\n");
450 fun_ret = GNUNET_SYSERR;
451 goto cleanup;
452 }
453
454 if ('/' == *path_or_glob)
455 inline_path = GNUNET_strdup (path_or_glob);
456 else
457 {
458 /* We compute the canonical, absolute path first,
459 so that relative imports resolve properly with symlinked
460 config files. */
461 char *source_realpath;
462 char *endsep;
463
464 source_realpath = realpath (source_filename,
465 NULL);
466 if (NULL == source_realpath)
467 {
468 /* Couldn't even resolve path of base dir. */
469 GNUNET_break (0);
470 /* failed to parse included config */
471 fun_ret = GNUNET_SYSERR;
472 goto cleanup;
473 }
474 endsep = strrchr (source_realpath, '/');
475 GNUNET_assert (NULL != endsep);
476 *endsep = '\0';
477 GNUNET_asprintf (&inline_path,
478 "%s/%s",
479 source_realpath,
480 path_or_glob);
481 free (source_realpath);
482 }
483
484 if (path_is_glob)
485 {
486 int nret;
487
489 "processing config glob '%s'\n",
490 inline_path);
491
492 nret = GNUNET_DISK_glob (inline_path, collect_files_cb, &igc);
493 if (-1 == nret)
494 {
495 fun_ret = GNUNET_SYSERR;
496 goto cleanup;
497 }
498 GNUNET_assert (nret == igc.files_length);
499 qsort (igc.files, igc.files_length, sizeof (char *), pstrcmp);
500 for (int i = 0; i < nret; i++)
501 {
502 if (GNUNET_OK !=
504 igc.files[i]))
505 {
506 fun_ret = GNUNET_SYSERR;
507 goto cleanup;
508 }
509 }
510 fun_ret = GNUNET_OK;
511 }
512 else if (NULL != restrict_section)
513 {
514 enum GNUNET_GenericReturnValue inner_ret;
515 struct ConfigSection *cs;
516 struct ConfigFile *cf = GNUNET_new (struct ConfigFile);
517
518 inner_ret = GNUNET_DISK_file_test_read (inline_path);
519
520 cs = find_section (cfg, restrict_section);
521
522 if (NULL == cs)
523 {
524 cs = GNUNET_new (struct ConfigSection);
525 cs->name = GNUNET_strdup (restrict_section);
526 cs->next = cfg->sections;
527 cfg->sections = cs;
528 cs->entries = NULL;
529 }
530 if (cfg->diagnostics)
531 {
532 char *sfn = GNUNET_STRINGS_filename_expand (inline_path);
533 struct stat istat;
534
535 cs->hint_secret_filename = sfn;
536 if (0 == stat (sfn, &istat))
537 {
538 struct passwd *pw = getpwuid (istat.st_uid);
539 struct group *gr = getgrgid (istat.st_gid);
540 char *pwname = (NULL == pw) ? "<unknown>" : pw->pw_name;
541 char *grname = (NULL == gr) ? "<unknown>" : gr->gr_name;
542
544 "%s:%s %o",
545 pwname,
546 grname,
547 istat.st_mode);
548 }
549 else
550 {
551 cs->hint_secret_stat = GNUNET_strdup ("<can't stat file>");
552 }
553 if (source_filename)
554 {
555 /* Possible that this secret section has been inlined before */
557 cs->hint_inlined_from_filename = GNUNET_strdup (source_filename);
558 cs->hint_inlined_from_line = source_lineno;
559 }
560 }
561
562 /* Put file in the load list for diagnostics, even if we can't access it. */
563 {
565 cf->source_filename = GNUNET_strdup (inline_path);
566 cf->hint_restrict_section = GNUNET_strdup (restrict_section);
569 cf);
570 }
571
572 if (GNUNET_OK != inner_ret)
573 {
574 cs->inaccessible = true;
575 cf->hint_inaccessible = true;
576 /* File can't be accessed, but that's okay. */
577 fun_ret = GNUNET_OK;
578 goto cleanup;
579 }
580
581 other_cfg = GNUNET_CONFIGURATION_create ();
582 other_cfg->restrict_section = restrict_section;
583 inner_ret = GNUNET_CONFIGURATION_parse (other_cfg,
584 inline_path);
585 if (GNUNET_OK != inner_ret)
586 {
587 cf->hint_inaccessible = true;
588 fun_ret = inner_ret;
589 goto cleanup;
590 }
591
592 cs = find_section (other_cfg, restrict_section);
593 if (NULL == cs)
594 {
596 "Configuration file '%s' loaded with @inline-secret@ "
597 "does not contain section '%s'.\n",
598 inline_path,
599 restrict_section);
600 /* Inlined onfiguration is accessible but doesn't contain any values.
601 We treat this as if the inlined section was empty, and do not
602 consider it an error. */
603 fun_ret = GNUNET_OK;
604 goto cleanup;
605 }
606 for (struct ConfigEntry *ce = cs->entries;
607 NULL != ce;
608 ce = ce->next)
610 restrict_section,
611 ce->key,
612 ce->val);
613 fun_ret = GNUNET_OK;
614 }
615 else if (GNUNET_OK !=
617 inline_path))
618 {
619 fun_ret = GNUNET_SYSERR;
620 goto cleanup;
621 }
622 else
623 {
624 fun_ret = GNUNET_OK;
625 }
626cleanup:
627 cfg->current_nest_level = old_nest_level;
628 if (NULL != other_cfg)
630 GNUNET_free (inline_path);
631 if (igc.files_length > 0)
632 {
633 for (size_t i = 0; i < igc.files_length; i++)
634 GNUNET_free (igc.files[i]);
636 }
637 return fun_ret;
638}
static struct ConfigSection * find_section(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Find a section entry from a configuration.
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.
#define LOG(kind,...)
Definition: configuration.c:30
static void cleanup(void *cls)
Disconnect and shutdown.
Definition: gnunet-did.c:131
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.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create()
Create a new configuration object.
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.
int GNUNET_DISK_glob(const char *glob_pattern, GNUNET_FileNameCallback callback, void *callback_cls)
Find all files matching a glob pattern.
Definition: disk.c:1009
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 GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
char * GNUNET_STRINGS_filename_expand(const char *fil)
Complete filename (a la shell) from abbrevition.
Definition: strings.c:495
configuration entry
Definition: configuration.c:39
struct ConfigEntry * next
This is a linked list.
Definition: configuration.c:43
char * hint_restrict_section
Was this configuration file parsed via @inline-secret@?
char * source_filename
Source filename.
bool hint_inaccessible
Was this configuration file inaccessible?
unsigned int level
Level in the tree of loaded config files.
char * hint_inlined_from_filename
For secret sections: Where was this inlined from?
struct ConfigEntry * entries
entries in the section
Definition: configuration.c:80
bool inaccessible
Is the configuration section marked as inaccessible?
Definition: configuration.c:93
char * hint_secret_filename
Diagnostics hint for the secret file.
Definition: configuration.c:98
unsigned int hint_inlined_from_line
For secret sections: Where was this inlined from?
char * hint_secret_stat
Extra information regarding permissions of the secret file.
struct ConfigFile * loaded_files_tail
Linked list of loaded files.
unsigned int current_nest_level
Current nesting level of file loading.
struct ConfigFile * loaded_files_head
Linked list of loaded files.
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, cleanup(), collect_files_cb(), GNUNET_CONFIGURATION_Handle::current_nest_level, GNUNET_CONFIGURATION_Handle::diagnostics, ConfigSection::entries, CollectFilesContext::files, CollectFilesContext::files_length, find_section(), GNUNET_array_grow, GNUNET_asprintf(), GNUNET_assert, GNUNET_break, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_parse(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONTAINER_DLL_insert_tail, GNUNET_DISK_file_test_read(), GNUNET_DISK_glob(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_new, GNUNET_OK, GNUNET_strdup, GNUNET_STRINGS_filename_expand(), GNUNET_SYSERR, ConfigFile::hint_inaccessible, ConfigSection::hint_inlined_from_filename, ConfigSection::hint_inlined_from_line, ConfigFile::hint_restrict_section, ConfigSection::hint_secret_filename, ConfigSection::hint_secret_stat, ConfigSection::inaccessible, ConfigFile::level, GNUNET_CONFIGURATION_Handle::loaded_files_head, GNUNET_CONFIGURATION_Handle::loaded_files_tail, LOG, ConfigSection::name, ConfigEntry::next, ConfigSection::next, pstrcmp(), GNUNET_CONFIGURATION_Handle::restrict_section, GNUNET_CONFIGURATION_Handle::sections, and ConfigFile::source_filename.

Referenced by GNUNET_CONFIGURATION_deserialize().

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

◆ find_entry()

static struct ConfigEntry * find_entry ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  key 
)
static

Find an entry from a configuration.

Parameters
cfghandle to the configuration
sectionsection the option is in
keythe option
Returns
matching entry, NULL if not found

Definition at line 650 of file configuration.c.

653{
654 struct ConfigSection *sec;
655 struct ConfigEntry *pos;
656
657 if (NULL == (sec = find_section (cfg, section)))
658 return NULL;
659 if (sec->inaccessible)
660 {
662 "Section '%s' is marked as inaccessible, because the configuration "
663 " file that contains the section can't be read. Attempts to use "
664 "option '%s' will fail.\n",
665 section,
666 key);
667 return NULL;
668 }
669 pos = sec->entries;
670 while ((pos != NULL) && (0 != strcasecmp (key, pos->key)))
671 pos = pos->next;
672 return pos;
673}
struct GNUNET_HashCode key
The key used in the DHT.
@ GNUNET_ERROR_TYPE_WARNING
char * key
key for this entry
Definition: configuration.c:48

References cfg, ConfigSection::entries, find_section(), GNUNET_ERROR_TYPE_WARNING, ConfigSection::inaccessible, key, ConfigEntry::key, LOG, and ConfigEntry::next.

Referenced by compare_entries(), GNUNET_CONFIGURATION_get_value_choice(), GNUNET_CONFIGURATION_get_value_float(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_size(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_get_value_time(), GNUNET_CONFIGURATION_have_value(), GNUNET_CONFIGURATION_set_value_string(), and set_entry_hint().

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

◆ set_entry_hint()

static void set_entry_hint ( struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section,
const char *  option,
const char *  hint_filename,
unsigned int  hint_line 
)
static

Set a configuration hint.

Parameters
cfgconfiguration handle
sectionsection
optionconfig option
hint_filename
hint_line

Definition at line 686 of file configuration.c.

691{
692 struct ConfigEntry *e = find_entry (cfg, section, option);
693 if (! cfg->diagnostics)
694 return;
695 if (! e)
696 return;
698 e->hint_lineno = hint_line;
699}
static struct ConfigEntry * find_entry(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *key)
Find an entry from a configuration.
char * hint_filename
Diagnostics information for the filename.
Definition: configuration.c:58
unsigned int hint_lineno
Diagnostics information for the line number.
Definition: configuration.c:63

References cfg, GNUNET_CONFIGURATION_Handle::diagnostics, find_entry(), GNUNET_strdup, ConfigEntry::hint_filename, and ConfigEntry::hint_lineno.

Referenced by GNUNET_CONFIGURATION_deserialize().

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

◆ do_skip()

static bool do_skip ( const char *  sec,
const char *  key 
)
static

Should we skip this configuration entry when serializing?

Parameters
secsection name
keykey
Returns
true if we should skip it

Definition at line 1103 of file configuration.c.

1105{
1106 if (0 != strcasecmp ("PATHS",
1107 sec))
1108 return false;
1109 return ( (0 == strcasecmp ("DATADIR",
1110 key)) ||
1111 (0 == strcasecmp ("LIBDIR",
1112 key)) ||
1113 (0 == strcasecmp ("BINDIR",
1114 key)) ||
1115 (0 == strcasecmp ("PREFIX",
1116 key)) ||
1117 (0 == strcasecmp ("LOCALEDIR",
1118 key)) ||
1119 (0 == strcasecmp ("ICONDIR",
1120 key)) ||
1121 (0 == strcasecmp ("DOCDIR",
1122 key)) ||
1123 (0 == strcasecmp ("DEFAULTCONFIG",
1124 key)) ||
1125 (0 == strcasecmp ("LIBEXECDIR",
1126 key)) );
1127}

References key.

Referenced by GNUNET_CONFIGURATION_serialize(), and GNUNET_CONFIGURATION_serialize_diagnostics().

Here is the caller graph for this function:

◆ copy_entry()

static void copy_entry ( void *  cls,
const char *  section,
const char *  option,
const char *  value 
)
static

Copy a configuration value to the given target configuration.

Overwrites existing entries.

Parameters
clsthe destination configuration (struct GNUNET_CONFIGURATION_Handle *)
sectionsection for the value
optionoption name of the value
valuevalue to copy

Definition at line 1516 of file configuration.c.

1520{
1521 struct GNUNET_CONFIGURATION_Handle *dst = cls;
1522
1524 section,
1525 option,
1526 value);
1527}
static char * value
Value of the record to add/remove.

References GNUNET_CONFIGURATION_set_value_string(), and value.

Referenced by GNUNET_CONFIGURATION_dup().

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

◆ compare_entries()

static void compare_entries ( void *  cls,
const char *  section,
const char *  option,
const char *  value 
)
static

A callback function, compares entries from two configurations (default against a new configuration) and write the diffs in a diff-configuration object (the callback object).

Parameters
clsthe diff configuration (struct DiffHandle *)
sectionsection for the value (of the default conf.)
optionoption name of the value (of the default conf.)
valuevalue to copy (of the default conf.)

Definition at line 1552 of file configuration.c.

1556{
1557 struct DiffHandle *dh = cls;
1558 struct ConfigEntry *entNew;
1559
1560 entNew = find_entry (dh->cfg_default, section, option);
1561 if ((NULL != entNew) && (NULL != entNew->val) &&
1562 (0 == strcmp (entNew->val, value)))
1563 return;
1565 section,
1566 option,
1567 value);
1568}
char * val
current, committed value
Definition: configuration.c:53
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, find_entry(), GNUNET_CONFIGURATION_set_value_string(), ConfigEntry::val, and value.

Referenced by GNUNET_CONFIGURATION_get_diff().

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

◆ expand_dollar()

static char * expand_dollar ( const struct GNUNET_CONFIGURATION_Handle cfg,
char *  orig,
unsigned int  depth 
)
static

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!)
depthrecursion depth, used to detect recursive expansions
Returns
$-expanded string, never NULL unless orig was NULL

Definition at line 1864 of file configuration.c.

1867{
1868 char *prefix;
1869 char *result;
1870 char *start;
1871 const char *post;
1872 const char *env;
1873 char *def;
1874 char *end;
1875 unsigned int lopen;
1876 char erased_char;
1877 char *erased_pos;
1878 size_t len;
1879
1880 if (NULL == orig)
1881 return NULL;
1882 if (depth > 128)
1883 {
1885 "Recursive expansion suspected, aborting $-expansion for term `%s'\n",
1886 orig);
1887 return orig;
1888 }
1890 "Asked to $-expand %s\n",
1891 orig);
1892 if ('$' != orig[0])
1893 {
1895 "Doesn't start with $ - not expanding\n");
1896 return orig;
1897 }
1898 erased_char = 0;
1899 erased_pos = NULL;
1900 if ('{' == orig[1])
1901 {
1902 start = &orig[2];
1903 lopen = 1;
1904 end = &orig[1];
1905 while (lopen > 0)
1906 {
1907 end++;
1908 switch (*end)
1909 {
1910 case '}':
1911 lopen--;
1912 break;
1913
1914 case '{':
1915 lopen++;
1916 break;
1917
1918 case '\0':
1920 "Missing closing `}' in option `%s'\n",
1921 orig);
1922 return orig;
1923
1924 default:
1925 break;
1926 }
1927 }
1928 erased_char = *end;
1929 erased_pos = end;
1930 *end = '\0';
1931 post = end + 1;
1932 def = strchr (orig, ':');
1933 if (NULL != def)
1934 {
1935 *def = '\0';
1936 def++;
1937 if (('-' == *def) || ('=' == *def))
1938 def++;
1939 def = GNUNET_strdup (def);
1940 }
1941 }
1942 else
1943 {
1944 int i;
1945
1946 start = &orig[1];
1947 def = NULL;
1948 i = 0;
1949 while ( (orig[i] != '/') &&
1950 (orig[i] != '\\') &&
1951 (orig[i] != '\0') &&
1952 (orig[i] != ' ') )
1953 i++;
1954 if (orig[i] == '\0')
1955 {
1956 post = "";
1957 }
1958 else
1959 {
1960 erased_char = orig[i];
1961 erased_pos = &orig[i];
1962 orig[i] = '\0';
1963 post = &orig[i + 1];
1964 }
1965 }
1967 "Split into `%s' and `%s' with default %s\n",
1968 start,
1969 post,
1970 def);
1971 if (GNUNET_OK !=
1973 "PATHS",
1974 start,
1975 &prefix))
1976 {
1977 if (NULL == (env = getenv (start)))
1978 {
1979 /* try default */
1980 def = expand_dollar (cfg,
1981 def,
1982 depth + 1);
1983 env = def;
1984 }
1985 if (NULL == env)
1986 {
1988 if (erased_pos)
1989 *erased_pos = erased_char;
1991 "Failed to expand `%s' in `%s' as it is neither found in [PATHS] nor defined as an environmental variable\n",
1992 start,
1993 orig);
1995 return orig;
1996 }
1998 }
2000 prefix);
2001 if ((erased_pos) && ('}' != erased_char))
2002 {
2003 len = strlen (prefix) + 1;
2004 prefix = GNUNET_realloc (prefix, len + 1);
2005 prefix[len - 1] = erased_char;
2006 prefix[len] = '\0';
2007 }
2008 result = GNUNET_malloc (strlen (prefix) + strlen (post) + 1);
2009 strcpy (result, prefix);
2010 strcat (result, post);
2011 GNUNET_free (def);
2013 GNUNET_free (orig);
2014 return result;
2015}
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
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...
char * getenv()
static int start
Set if we are to start default services (including ARM).
Definition: gnunet-arm.c:39
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static int prefix
If printing the value of PREFIX has been requested.
Definition: gnunet-config.c:66
static int result
Global testing status.
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...
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_realloc(ptr, size)
Wrapper around realloc.

References cfg, end, env, expand_dollar(), getenv(), GNUNET_CONFIGURATION_expand_dollar(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_malloc, GNUNET_OK, GNUNET_realloc, GNUNET_strdup, LOG, prefix, result, and start.

Referenced by expand_dollar(), and GNUNET_CONFIGURATION_expand_dollar().

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

◆ escape_name()

static char * escape_name ( const char *  value)
static

FIXME.

Parameters
valueFIXME
Returns
FIXME

Definition at line 2163 of file configuration.c.

2164{
2165 char *escaped;
2166 const char *rpos;
2167 char *wpos;
2168
2169 escaped = GNUNET_malloc (strlen (value) * 2 + 1);
2170 memset (escaped, 0, strlen (value) * 2 + 1);
2171 rpos = value;
2172 wpos = escaped;
2173 while (rpos[0] != '\0')
2174 {
2175 switch (rpos[0])
2176 {
2177 case '\\':
2178 case ' ':
2179 wpos[0] = '\\';
2180 wpos[1] = rpos[0];
2181 wpos += 2;
2182 break;
2183
2184 default:
2185 wpos[0] = rpos[0];
2186 wpos++;
2187 }
2188 rpos++;
2189 }
2190 return escaped;
2191}

References GNUNET_malloc, and value.

Referenced by GNUNET_CONFIGURATION_append_value_filename(), and GNUNET_CONFIGURATION_remove_value_filename().

Here is the caller graph for this function:

◆ test_match()

static enum GNUNET_GenericReturnValue test_match ( void *  cls,
const char *  fn 
)
static

FIXME.

Parameters
clsstring we compare with (const char*)
fnfilename we are currently looking at
Returns
GNUNET_OK if the names do not match, GNUNET_SYSERR if they do

Definition at line 2202 of file configuration.c.

2203{
2204 const char *of = cls;
2205
2206 return (0 == strcmp (of, fn)) ? GNUNET_SYSERR : GNUNET_OK;
2207}

References GNUNET_OK, and GNUNET_SYSERR.

Referenced by GNUNET_CONFIGURATION_append_value_filename().

Here is the caller graph for this function: