X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fconfiguration.c;h=978765970c80fbb69857b7da4cc21fc0849f805c;hb=46ac0cea02fe1949d76b86c7a0750f9e7854fef6;hp=85c17cb7d2d1f407d6eb119b3bebf99a4531c530;hpb=bed39036b47e1b820ee40d645f743e18520c4f8c;p=oweals%2Fgnunet.git diff --git a/src/util/configuration.c b/src/util/configuration.c index 85c17cb7d..978765970 100644 --- a/src/util/configuration.c +++ b/src/util/configuration.c @@ -132,21 +132,9 @@ void GNUNET_CONFIGURATION_destroy (struct GNUNET_CONFIGURATION_Handle *cfg) { struct ConfigSection *sec; - struct ConfigEntry *ent; while (NULL != (sec = cfg->sections)) - { - cfg->sections = sec->next; - while (NULL != (ent = sec->entries)) - { - sec->entries = ent->next; - GNUNET_free (ent->key); - GNUNET_free_non_null (ent->val); - GNUNET_free (ent); - } - GNUNET_free (sec->name); - GNUNET_free (sec); - } + GNUNET_CONFIGURATION_remove_section (cfg, sec->name); GNUNET_free (cfg); } @@ -306,7 +294,11 @@ GNUNET_CONFIGURATION_write (struct GNUNET_CONFIGURATION_Handle *cfg, fn = GNUNET_STRINGS_filename_expand (filename); if (fn == NULL) return GNUNET_SYSERR; - GNUNET_DISK_directory_create_for_file (fn); + if (GNUNET_OK != GNUNET_DISK_directory_create_for_file (fn)) + { + GNUNET_free (fn); + return GNUNET_SYSERR; + } if (NULL == (fp = FOPEN (fn, "w"))) { GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "fopen", fn); @@ -397,6 +389,72 @@ GNUNET_CONFIGURATION_iterate (const struct GNUNET_CONFIGURATION_Handle *cfg, } +/** + * Iterate over all sections in the configuration. + * + * @param cfg configuration to inspect + * @param iter function to call on each section + * @param iter_cls closure for iter + */ +void +GNUNET_CONFIGURATION_iterate_sections (const struct GNUNET_CONFIGURATION_Handle *cfg, + GNUNET_CONFIGURATION_Section_Iterator iter, + void *iter_cls) +{ + struct ConfigSection *spos; + struct ConfigSection *next; + + next = cfg->sections; + while (next != NULL) + { + spos = next; + next = spos->next; + iter (iter_cls, spos->name); + } +} + +/** + * Remove the given section and all options in it. + * + * @param cfg configuration to inspect + * @param section name of the section to remove + */ +void GNUNET_CONFIGURATION_remove_section (struct GNUNET_CONFIGURATION_Handle *cfg, + const char *section) +{ + struct ConfigSection *spos; + struct ConfigSection *prev; + struct ConfigEntry *ent; + + prev = NULL; + spos = cfg->sections; + while (spos != NULL) + { + if (0 == strcmp (section, + spos->name)) + { + if (prev == NULL) + cfg->sections = spos->next; + else + prev->next = spos->next; + while (NULL != (ent = spos->entries)) + { + spos->entries = ent->next; + GNUNET_free (ent->key); + GNUNET_free_non_null (ent->val); + GNUNET_free (ent); + cfg->dirty = GNUNET_YES; + } + GNUNET_free (spos->name); + GNUNET_free (spos); + return; + } + prev = spos; + spos = spos->next; + } +} + + /** * Copy a configuration value to the given target configuration. * Overwrites existing entries. @@ -453,11 +511,11 @@ findSection (const struct GNUNET_CONFIGURATION_Handle *cfg, /** - * FIXME. + * Find an entry from a configuration. * - * @param cfg FIXME - * @param section FIXME - * @param key FIXME + * @param cfg handle to the configuration + * @param section section the option is in + * @param key the option * @return matching entry, NULL if not found */ static struct ConfigEntry * @@ -632,13 +690,22 @@ GNUNET_CONFIGURATION_get_value_time (const struct GNUNET_CONFIGURATION_Handle const char *option, struct GNUNET_TIME_Relative *time) { + struct ConfigEntry *e; unsigned long long num; - int ret; - ret = GNUNET_CONFIGURATION_get_value_number (cfg, section, option, &num); - if (ret == GNUNET_OK) - time->value = (uint64_t) num; - return ret; + e = findEntry (cfg, section, option); + if (e == NULL) + return GNUNET_SYSERR; + if ( (0 == strcasecmp (e->val, "infinity")) || + (0 == strcasecmp (e->val, "forever")) ) + { + *time = GNUNET_TIME_UNIT_FOREVER_REL; + return GNUNET_OK; + } + if (1 != SSCANF (e->val, "%llu", &num)) + return GNUNET_SYSERR; + time->rel_value = (uint64_t) num; + return GNUNET_OK; } @@ -1017,7 +1084,8 @@ GNUNET_CONFIGURATION_append_value_filename (struct GNUNET_CONFIGURATION_Handle escaped = escape_name (value); nw = GNUNET_malloc (strlen (old) + strlen (escaped) + 2); strcpy (nw, old); - strcat (nw, " "); + if (strlen (old) > 0) + strcat (nw, " "); strcat (nw, escaped); GNUNET_CONFIGURATION_set_value_string (cfg, section, option, nw); GNUNET_free (old); @@ -1086,23 +1154,26 @@ GNUNET_CONFIGURATION_remove_value_filename (struct GNUNET_CONFIGURATION_Handle } old = end[0]; end[0] = '\0'; - if (strlen (pos) > 0) - { - if (0 == strcmp (pos, match)) - { - memmove (pos, &end[1], strlen (&end[1]) + 1); - - if (pos != list) - pos[-1] = ' '; /* previously changed to "\0" */ - GNUNET_CONFIGURATION_set_value_string (cfg, - section, option, list); - GNUNET_free (list); - GNUNET_free (match); - return GNUNET_OK; - } - } + if (0 == strcmp (pos, match)) + { + if (old != '\0') + memmove (pos, &end[1], strlen (&end[1]) + 1); + else + { + if (pos != list) + pos[-1] = '\0'; + else + pos[0] = '\0'; + } + GNUNET_CONFIGURATION_set_value_string (cfg, + section, option, list); + GNUNET_free (list); + GNUNET_free (match); + return GNUNET_OK; + } if (old == '\0') break; + end[0] = old; pos = end + 1; } GNUNET_free (list); @@ -1116,7 +1187,7 @@ GNUNET_CONFIGURATION_remove_value_filename (struct GNUNET_CONFIGURATION_Handle * system-specific configuration). * * @param cfg configuration to update - * @param filename name of the configuration file + * @param filename name of the configuration file, NULL to load defaults * @return GNUNET_OK on success, GNUNET_SYSERR on error */ int @@ -1139,7 +1210,7 @@ GNUNET_CONFIGURATION_load (struct GNUNET_CONFIGURATION_Handle *cfg, (GNUNET_OK == GNUNET_CONFIGURATION_parse (cfg, filename))))) { GNUNET_free (baseconfig); - return GNUNET_SYSERR; + return (filename == NULL) ? GNUNET_OK : GNUNET_SYSERR; } GNUNET_free (baseconfig); if ( ((GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg,