summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 45aa67e)
raw | patch | inline | side by side (parent: 45aa67e)
author | Gerrie Roos <groos@xiplink.com> | |
Wed, 25 May 2011 16:28:55 +0000 (18:28 +0200) | ||
committer | Florian Forster <octo@collectd.org> | |
Sun, 19 Feb 2012 10:29:40 +0000 (11:29 +0100) |
Change-Id: I91dc04fbd0a8e982ce09a766f12d024bdbef634f
src/target_scale.c | patch | blob | history |
diff --git a/src/target_scale.c b/src/target_scale.c
index af224f109d6bb8de19066b8c472a6557d6058d3e..6bcbb05580a3be2f9184f67f1e12ddf25b88fcdf 100644 (file)
--- a/src/target_scale.c
+++ b/src/target_scale.c
{
double factor;
double offset;
+
+ char **data_sources;
+ size_t data_sources_num;
};
typedef struct ts_data_s ts_data_t;
return (0);
} /* }}} int ts_config_set_double */
+static int ts_config_add_data_source(ts_data_t *data, /* {{{ */
+ oconfig_item_t *ci)
+{
+ size_t new_data_sources_num;
+ char **temp;
+ int i;
+
+ /* Check number of arbuments. */
+ if (ci->values_num < 1)
+ {
+ ERROR ("`value' match: `%s' needs at least one argument.",
+ ci->key);
+ return (-1);
+ }
+
+ /* Check type of arguments */
+ for (i = 0; i < ci->values_num; i++)
+ {
+ if (ci->values[i].type == OCONFIG_TYPE_STRING)
+ continue;
+
+ ERROR ("`value' match: `%s' accepts only string arguments "
+ "(argument %i is a %s).",
+ ci->key, i + 1,
+ (ci->values[i].type == OCONFIG_TYPE_BOOLEAN)
+ ? "truth value" : "number");
+ return (-1);
+ }
+
+ /* Allocate space for the char pointers */
+ new_data_sources_num = data->data_sources_num + ((size_t) ci->values_num);
+ temp = (char **) realloc (data->data_sources,
+ new_data_sources_num * sizeof (char *));
+ if (temp == NULL)
+ {
+ ERROR ("`value' match: realloc failed.");
+ return (-1);
+ }
+ data->data_sources = temp;
+
+ /* Copy the strings, allocating memory as needed. */
+ for (i = 0; i < ci->values_num; i++)
+ {
+ size_t j;
+
+ /* If we get here, there better be memory for us to write to. */
+ assert (data->data_sources_num < new_data_sources_num);
+
+ j = data->data_sources_num;
+ data->data_sources[j] = sstrdup (ci->values[i].value.string);
+ if (data->data_sources[j] == NULL)
+ {
+ ERROR ("`value' match: sstrdup failed.");
+ continue;
+ }
+ data->data_sources_num++;
+ }
+
+ return (0);
+} /* }}} int ts_config_add_data_source */
+
static int ts_destroy (void **user_data) /* {{{ */
{
ts_data_t **data;
data = (ts_data_t **) user_data;
+ if (*data && (*data)->data_sources) {
+ size_t i;
+ for (i = 0; i < (*data)->data_sources_num; i++)
+ free((*data)->data_sources[i]);
+ free((*data)->data_sources);
+ }
+
free (*data);
*data = NULL;
status = ts_config_set_double (&data->factor, child);
else if (strcasecmp ("Offset", child->key) == 0)
status = ts_config_set_double (&data->offset, child);
+ else if (strcasecmp ("DataSource", child->key) == 0)
+ status = ts_config_add_data_source(data, child);
else
{
ERROR ("Target `scale': The `%s' configuration option is not understood "
for (i = 0; i < ds->ds_num; i++)
{
+ /* If we've got a list of data sources, is it in the list? */
+ if (data->data_sources) {
+ size_t j;
+ for (j = 0; j < data->data_sources_num; j++)
+ if (strcasecmp(ds->ds[i].name, data->data_sources[j]) == 0)
+ break;
+
+ /* No match, ignore */
+ if (j >= data->data_sources_num)
+ continue;
+ }
+
if (ds->ds[i].type == DS_TYPE_COUNTER)
ts_invoke_counter (ds, vl, data, i);
else if (ds->ds[i].type == DS_TYPE_GAUGE)