X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fconfiguration.c;h=85c17cb7d2d1f407d6eb119b3bebf99a4531c530;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=e35dfacfe8026305515eaad617d8ef638aedd038;hpb=8518be376f51fc3e682597a97157914d4745d5bc;p=oweals%2Fgnunet.git diff --git a/src/util/configuration.c b/src/util/configuration.c index e35dfacfe..85c17cb7d 100644 --- a/src/util/configuration.c +++ b/src/util/configuration.c @@ -99,6 +99,18 @@ struct GNUNET_CONFIGURATION_Handle }; +/** + * Used for diffing a configuration object against + * the default one + */ +struct DiffHandle +{ + const struct GNUNET_CONFIGURATION_Handle *cfgDefault; + struct GNUNET_CONFIGURATION_Handle *cfgDiff; +}; + + + /** * Create a GNUNET_CONFIGURATION_Handle. * @@ -164,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"))) { @@ -192,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)) @@ -211,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; @@ -290,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"))) { @@ -462,78 +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 -compareEntries( - void *cls, - const char *section, - const char *option, - const char *value) +static void +compareEntries (void *cls, + const char *section, const char *option, const char *value) { - struct ConfigSection *secNew; - struct ConfigEntry *entNew; - GNUNNET_CONFIGURATION_Diff_Handle* cfgDiff = (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; - } - } + struct DiffHandle *dh = cls; + struct ConfigEntry *entNew; + + 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); } @@ -545,20 +513,20 @@ compareEntries( * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int -GNUNET_CONFIGURATION_write_diffs( - struct GNUNET_CONFIGURATION_Handle *cfgDefault, - struct GNUNET_CONFIGURATION_Handle *cfgNew, - const char* filename - ) +GNUNET_CONFIGURATION_write_diffs (const struct GNUNET_CONFIGURATION_Handle + *cfgDefault, + const struct GNUNET_CONFIGURATION_Handle *cfgNew, + const char *filename) { - GNUNNET_CONFIGURATION_Diff_Handle *diffHandle = - GNUNET_malloc(sizeof(GNUNNET_CONFIGURATION_Diff_Handle)); - diffHandle->cfgDiff = GNUNET_CONFIGURATION_create(); - diffHandle->cfgDiff->sections = NULL; - diffHandle->cfgNew = cfgNew; - GNUNET_CONFIGURATION_iterate(cfgDefault, compareEntries, diffHandle); - - return GNUNET_CONFIGURATION_write(diffHandle->cfgDiff, filename); + int ret; + struct DiffHandle diffHandle; + + diffHandle.cfgDiff = GNUNET_CONFIGURATION_create (); + diffHandle.cfgDefault = cfgDefault; + GNUNET_CONFIGURATION_iterate (cfgNew, compareEntries, &diffHandle); + ret = GNUNET_CONFIGURATION_write (diffHandle.cfgDiff, filename); + GNUNET_CONFIGURATION_destroy (diffHandle.cfgDiff); + return ret; } @@ -801,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]))) { @@ -840,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; } @@ -1180,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")) &&