+
+/**
+ * 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.
+ *
+ * @param cfg configuration to update
+ * @param section section of interest
+ * @param option option of interest
+ * @param value value to set
+ */