summaryrefslogtreecommitdiffstats
path: root/common/ini/ini_configobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/ini/ini_configobj.c')
-rw-r--r--common/ini/ini_configobj.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/common/ini/ini_configobj.c b/common/ini/ini_configobj.c
index 4da9a7c..44b8d32 100644
--- a/common/ini/ini_configobj.c
+++ b/common/ini/ini_configobj.c
@@ -113,3 +113,133 @@ int ini_config_create(struct ini_cfgobj **ini_config)
TRACE_FLOW_EXIT();
return error;
}
+
+/* Callback to set the boundary */
+int ini_boundary_cb(const char *property,
+ int property_len,
+ int type,
+ void *data,
+ int length,
+ void *custom_data,
+ int *dummy)
+{
+ int error = EOK;
+ struct value_obj *vo = NULL;
+ uint32_t boundary;
+
+ TRACE_FLOW_ENTRY();
+
+ boundary = *((uint32_t *)(custom_data));
+ /* Banary items are the values */
+ if(type == COL_TYPE_BINARY) {
+ vo = *((struct value_obj **)(data));
+ error = value_set_boundary(vo, boundary);
+ }
+
+ TRACE_FLOW_EXIT();
+ return error;
+}
+
+/* Set the folding boundary for multiline values.
+ * Use before serializing and saving to a file if the
+ * default boundary of 80 characters does not work for you.
+ */
+int ini_config_set_wrap(struct ini_cfgobj *ini_config,
+ uint32_t boundary)
+{
+ int error = EOK;
+
+ TRACE_FLOW_ENTRY();
+
+ if (!ini_config) {
+ TRACE_ERROR_NUMBER("Invalid argument", EINVAL);
+ return EINVAL;
+ }
+
+ ini_config->boundary = boundary;
+ error = col_traverse_collection(ini_config->cfg,
+ COL_TRAVERSE_DEFAULT,
+ ini_boundary_cb,
+ (void *)(&(ini_config->boundary)));
+ if (error) {
+ TRACE_ERROR_NUMBER("Failed to set wrapping boundary", error);
+ return error;
+ }
+
+
+ TRACE_FLOW_EXIT();
+ return error;
+}
+
+/* Configuration copy callback */
+static int ini_copy_cb(struct collection_item *item,
+ void *ext_data,
+ int *skip)
+{
+ int error = EOK;
+ struct value_obj *vo = NULL;
+ struct value_obj *new_vo = NULL;
+
+ TRACE_FLOW_ENTRY();
+
+ ext_data = NULL;
+ *skip = 0;
+
+ /* Banary items are the values */
+ if(type == COL_TYPE_BINARY) {
+ vo = *((struct value_obj **)(col_get_item_data(item)));
+ error = value_copy(vo, &new_vo);
+ if (error) {
+ TRACE_ERROR_NUMBER("Failed to copy value", error);
+ return error;
+ }
+ }
+
+ TRACE_FLOW_EXIT();
+ return error;
+}
+
+/* Copy configuration */
+int ini_config_copy(struct ini_cfgobj *ini_config,
+ struct ini_cfgobj **ini_new)
+{
+ int error = EOK;
+ struct ini_cfgobj *new_co;
+
+ TRACE_FLOW_ENTRY();
+
+ if ((!ini_config) ||
+ (!ini_new)) {
+ TRACE_ERROR_NUMBER("Invalid argument", EINVAL);
+ return EINVAL;
+ }
+
+ /* Create a new configuration object */
+ errno = 0;
+ new_co = malloc(sizeof(struct ini_cfgobj));
+ if (!new_co) {
+ error = errno;
+ TRACE_ERROR_NUMBER("Failed to allocate memory", ENOMEM);
+ return ENOMEM;
+ }
+
+ new_co->cfg = NULL;
+ new_co->boundary = ini_config->boundary;
+
+ error = col_copy_collection_with_cb(&(new_cfg->cfg),
+ ini_config->cfg,
+ INI_CONFIG_NAME,
+ COL_COPY_NORMAL,
+ ini_copy_cb,
+ NULL);
+ if (error) {
+ TRACE_ERROR_NUMBER("Failed to copy collection", error);
+ ini_config_destroy(new_co);
+ return error;
+ }
+
+ *ini_new = new_co;
+
+ TRACE_FLOW_EXIT();
+ return error;
+}