X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fconfiguration.c;h=85c17cb7d2d1f407d6eb119b3bebf99a4531c530;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=250f9d3d513014dca06a4977383ed6fdddbad696;hpb=660c6da4fcbca6bd2cb15599dfe3c6d53b890c7f;p=oweals%2Fgnunet.git diff --git a/src/util/configuration.c b/src/util/configuration.c index 250f9d3d5..85c17cb7d 100644 --- a/src/util/configuration.c +++ b/src/util/configuration.c @@ -98,13 +98,14 @@ struct GNUNET_CONFIGURATION_Handle }; + /** * Used for diffing a configuration object against * the default one */ -struct GNUNNET_CONFIGURATION_Diff_Handle +struct DiffHandle { - struct GNUNET_CONFIGURATION_Handle *cfgNew; + const struct GNUNET_CONFIGURATION_Handle *cfgDefault; struct GNUNET_CONFIGURATION_Handle *cfgDiff; }; @@ -175,6 +176,8 @@ GNUNET_CONFIGURATION_parse (struct GNUNET_CONFIGURATION_Handle *cfg, char *fn; fn = GNUNET_STRINGS_filename_expand (filename); + if (fn == NULL) + return GNUNET_SYSERR; dirty = cfg->dirty; /* back up value! */ if (NULL == (fp = FOPEN (fn, "r"))) { @@ -203,12 +206,12 @@ GNUNET_CONFIGURATION_parse (struct GNUNET_CONFIGURATION_Handle *cfg, if (emptyline == 1) continue; /* remove tailing whitespace */ - for (i = strlen (line) - 1; (i >= 0) && (isspace (line[i])); i--) + for (i = strlen (line) - 1; (i >= 0) && (isspace ( (unsigned char) line[i])); i--) line[i] = '\0'; if (1 == sscanf (line, "@INLINE@ %191[^\n]", value)) { /* @INLINE@ value */ - if (0 != GNUNET_CONFIGURATION_parse (cfg, value)) + if (GNUNET_OK != GNUNET_CONFIGURATION_parse (cfg, value)) ret = GNUNET_SYSERR; /* failed to parse included config */ } else if (1 == sscanf (line, "[%99[^]]]", value)) @@ -222,7 +225,7 @@ GNUNET_CONFIGURATION_parse (struct GNUNET_CONFIGURATION_Handle *cfg, /* tag = value */ /* Strip LF */ i = strlen (value) - 1; - while ((i >= 0) && (isspace (value[i]))) + while ((i >= 0) && (isspace ( (unsigned char) value[i]))) value[i--] = '\0'; /* remove quotes */ i = 0; @@ -301,6 +304,8 @@ GNUNET_CONFIGURATION_write (struct GNUNET_CONFIGURATION_Handle *cfg, char *pos; fn = GNUNET_STRINGS_filename_expand (filename); + if (fn == NULL) + return GNUNET_SYSERR; GNUNET_DISK_directory_create_for_file (fn); if (NULL == (fp = FOPEN (fn, "w"))) { @@ -473,88 +478,30 @@ findEntry (const struct GNUNET_CONFIGURATION_Handle *cfg, /** - * 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). - * @param cls the diff configuration (ConfigurationDiffHandle*) + * 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). + * + * @param cls the diff configuration (struct DiffHandle*) * @param section section for the value (of the default conf.) * @param option option name of the value (of the default conf.) * @param value value to copy (of the default conf.) */ -void +static void compareEntries (void *cls, const char *section, const char *option, const char *value) { - struct ConfigSection *secNew; + struct DiffHandle *dh = cls; struct ConfigEntry *entNew; - struct GNUNNET_CONFIGURATION_Diff_Handle *cfgDiff = - (struct GNUNNET_CONFIGURATION_Diff_Handle *) cls; - - secNew = findSection (cfgDiff->cfgNew, section); - entNew = findEntry (cfgDiff->cfgNew, section, option); - if (secNew && strcmp (entNew->val, value) != 0) - { - /* Value in the new configuration has been changed */ - /* Add the changed value to the diff configuration object */ - struct ConfigEntry *diffEntry = NULL; - struct ConfigSection *diffSection = NULL; - - diffSection = cfgDiff->cfgDiff->sections; - if (diffSection == NULL) - { - /* First section */ - diffSection = GNUNET_malloc (sizeof (struct ConfigSection)); - memcpy (diffSection, secNew, sizeof (struct ConfigSection)); - cfgDiff->cfgDiff->sections = diffSection; - diffSection->entries = NULL; - diffSection->next = NULL; - } - else - { - while ((strcmp (diffSection->name, secNew->name) != 0) - && (diffSection->next != NULL)) - { - diffSection = diffSection->next; - } - if (strcmp (diffSection->name, secNew->name) != 0) - { - /* Section not found in diffs configuration */ - diffSection->next = - GNUNET_malloc (sizeof (struct ConfigSection)); - memcpy (diffSection->next, secNew, - sizeof (struct ConfigSection)); - diffSection->next->entries = NULL; - diffSection->next->next = NULL; - } - else - { - diffEntry = diffSection->entries; - } - } - - if (diffEntry == NULL) - { - /* First Entry */ - diffEntry = GNUNET_malloc (sizeof (struct ConfigEntry)); - memcpy (diffEntry, entNew, sizeof (struct ConfigEntry)); - if (diffSection->next == NULL) - /* The first Entry of the first Section */ - diffSection->entries = diffEntry; - else - /* The first entry of the non-first Section */ - diffSection->next->entries = diffEntry; - diffEntry->next = NULL; - } - else - { - while (diffEntry->next != NULL) - { - diffEntry = diffEntry->next; - } - diffEntry->next = GNUNET_malloc (sizeof (struct ConfigEntry)); - memcpy (diffEntry->next, entNew, sizeof (struct ConfigEntry)); - diffEntry->next->next = NULL; - } - } + + entNew = findEntry (dh->cfgDefault, section, option); + if ( (entNew != NULL) && + (strcmp (entNew->val, value) == 0) ) + return; + GNUNET_CONFIGURATION_set_value_string (dh->cfgDiff, + section, + option, + value); } @@ -566,21 +513,18 @@ compareEntries (void *cls, * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int -GNUNET_CONFIGURATION_write_diffs (struct GNUNET_CONFIGURATION_Handle +GNUNET_CONFIGURATION_write_diffs (const struct GNUNET_CONFIGURATION_Handle *cfgDefault, - struct GNUNET_CONFIGURATION_Handle *cfgNew, + const struct GNUNET_CONFIGURATION_Handle *cfgNew, const char *filename) { int ret; - struct GNUNNET_CONFIGURATION_Diff_Handle diffHandle; - diffHandle.cfgDiff = GNUNET_CONFIGURATION_create (); - diffHandle.cfgDiff->sections = NULL; - diffHandle.cfgNew = cfgNew; - GNUNET_CONFIGURATION_iterate (cfgDefault, compareEntries, &diffHandle); + struct DiffHandle diffHandle; + diffHandle.cfgDiff = GNUNET_CONFIGURATION_create (); + diffHandle.cfgDefault = cfgDefault; + GNUNET_CONFIGURATION_iterate (cfgNew, compareEntries, &diffHandle); ret = GNUNET_CONFIGURATION_write (diffHandle.cfgDiff, filename); - - /* Housekeeping */ GNUNET_CONFIGURATION_destroy (diffHandle.cfgDiff); return ret; } @@ -825,9 +769,9 @@ GNUNET_CONFIGURATION_expand_dollar (const struct GNUNET_CONFIGURATION_Handle orig[i] = '\0'; post = &orig[i + 1]; } - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, - "PATHS", - &orig[1], &prefix)) + if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, + "PATHS", + &orig[1], &prefix)) { if (NULL == (env = getenv (&orig[1]))) { @@ -864,26 +808,20 @@ GNUNET_CONFIGURATION_get_value_filename (const struct const char *section, const char *option, char **value) { - int ret; char *tmp; - tmp = NULL; - ret = GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &tmp); - if (ret == GNUNET_SYSERR) - return ret; - if (tmp != NULL) - { - tmp = GNUNET_CONFIGURATION_expand_dollar (cfg, tmp); - *value = GNUNET_STRINGS_filename_expand (tmp); - GNUNET_free (tmp); - if (*value == NULL) - ret = GNUNET_SYSERR; - } - else + if (GNUNET_OK != + GNUNET_CONFIGURATION_get_value_string (cfg, section, option, &tmp)) { *value = NULL; + return GNUNET_SYSERR; } - return ret; + tmp = GNUNET_CONFIGURATION_expand_dollar (cfg, tmp); + *value = GNUNET_STRINGS_filename_expand (tmp); + GNUNET_free (tmp); + if (*value == NULL) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -1204,6 +1142,14 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, return GNUNET_SYSERR; } GNUNET_free (baseconfig); + if ( ((GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg, + "PATHS", + "DEFAULTCONFIG"))) && + (filename != NULL) ) + GNUNET_CONFIGURATION_set_value_string (cfg, + "PATHS", + "DEFAULTCONFIG", + filename); if ((GNUNET_YES == GNUNET_CONFIGURATION_have_value (cfg, "TESTING", "WEAKRANDOM")) &&