+
+static int mb_config_add_datagroup (oconfig_item_t *ci) /* {{{ */
+{
+ mb_datagroup_t *datagroup;
+ int status;
+ int i;
+
+ datagroup = malloc (sizeof (*datagroup));
+ if (datagroup == NULL)
+ return (ENOMEM);
+ memset (datagroup, 0, sizeof (*datagroup));
+ datagroup->name = NULL;
+ datagroup->collect = NULL;
+ datagroup->next = NULL;
+
+ status = cf_util_get_string (ci, &datagroup->name);
+
+ for (i = 0; i < ci->children_num; i++)
+ {
+ oconfig_item_t *child = ci->children + i;
+ status = 0;
+
+ if (strcasecmp ("Collect", child->key) == 0)
+ {
+ char buffer[1024];
+ status = cf_util_get_string_buffer (child, buffer, sizeof (buffer));
+ if (status == 0) {
+ data_copy_by_name (&datagroup->collect, data_definitions, buffer);
+ }
+ status = 0; /* continue after failure. */
+ }
+ else
+ {
+ ERROR ("Modbus plugin: Unknown configuration option: %s", child->key);
+ status = -1;
+ }
+
+ if (status != 0)
+ break;
+ } /* for (i = 0; i < ci->children_num; i++) */
+
+ if ((status == 0) && (datagroup->collect == NULL))
+ status = ENOENT;
+
+ if (status == 0)
+ {
+ datagroup_append (&data_groups, datagroup);
+ }
+ else /* if (status != 0) */
+ {
+ sfree (datagroup->name);
+ data_free_all (datagroup->collect);
+ assert (datagroup->next == NULL);
+ sfree (datagroup);
+ }
+
+ return (status);
+} /* }}} int mb_config_add_datagroup */
+