};
+/**
+ * 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.
*
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))
}
+/**
+ * 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.)
+ */
+static void
+compareEntries (void *cls,
+ const char *section, const char *option, const char *value)
+{
+ 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);
+}
+
+
+/**
+ * Write only configuration entries that have been changed to configuration file
+ * @param cfgDefault default configuration
+ * @param cfgNew new configuration
+ * @param filename where to write the configuration diff between default and new
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
+ */
+int
+GNUNET_CONFIGURATION_write_diffs (const struct GNUNET_CONFIGURATION_Handle
+ *cfgDefault,
+ const struct GNUNET_CONFIGURATION_Handle *cfgNew,
+ const char *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;
+}
+
+
/**
* Set a configuration value that should be a string.
*
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])))
{
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")) &&