X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftarget_set.c;h=6b44bcc4c78f7bb7ef0997d2951d1004b2ec4b85;hb=bf70b5ba18d3fc58f976f2923ecf7135900537a7;hp=55ce2283cb5a2550df8590766fedc1e78856783d;hpb=89c6aa454f70fa7088db97736bf188ee199a3ad4;p=collectd.git diff --git a/src/target_set.c b/src/target_set.c index 55ce2283..6b44bcc4 100644 --- a/src/target_set.c +++ b/src/target_set.c @@ -43,12 +43,12 @@ static void ts_key_list_free (ts_key_list_t *l) /* {{{ */ if (l == NULL) return; - free (l->key); + sfree (l->key); if (l->next != NULL) ts_key_list_free (l->next); - free (l); + sfree (l); } /* }}} void ts_name_list_free */ struct ts_data_s @@ -145,29 +145,27 @@ static int ts_config_add_meta_delete (ts_key_list_t **dest, /* {{{ */ { ts_key_list_t *entry = NULL; - if ((ci->values_num != 1) - || (ci->values[0].type != OCONFIG_TYPE_STRING)) + entry = calloc (1, sizeof (*entry)); + if (entry == NULL) { - ERROR ("ts_config_add_meta_delete: The %s option requires " - "exactly one string argument.", ci->key); - return (-1); + ERROR ("ts_config_add_meta_delete: calloc failed."); + return (-ENOMEM); } - if (strlen (ci->values[0].value.string) == 0) + if (cf_util_get_string (ci, &entry->key) != 0) { - ERROR ("Target `set': The `%s' option does not accept empty string as " - "first argument.", ci->key); - return (-1); + ts_key_list_free (entry); + return (-1); /* An error has already been reported. */ } - entry = calloc (1, sizeof (*entry)); - if (entry == NULL) + if (strlen (entry->key) == 0) { - ERROR ("ts_config_add_meta_delete: calloc failed."); - return (-ENOMEM); + ERROR ("Target `set': The `%s' option does not accept empty string as " + "first argument.", ci->key); + ts_key_list_free (entry); + return (-1); } - entry->key = sstrdup (ci->values[0].value.string); entry->next = *dest; *dest = entry; @@ -178,12 +176,13 @@ static void ts_subst (char *dest, size_t size, const char *string, /* {{{ */ const value_list_t *vl) { char temp[DATA_MAX_NAME_LEN]; - int meta_entries; - char **meta_toc; /* Initialize the field with the template. */ sstrncpy (dest, string, size); + if (strchr (dest, '%') == NULL) + return; + #define REPLACE_FIELD(t, v) \ if (subst_string (temp, sizeof (temp), dest, t, v) != NULL) \ sstrncpy (dest, temp, size); @@ -193,87 +192,25 @@ static void ts_subst (char *dest, size_t size, const char *string, /* {{{ */ REPLACE_FIELD ("%{type}", vl->type); REPLACE_FIELD ("%{type_instance}", vl->type_instance); - meta_entries = meta_data_toc (vl->meta, &meta_toc); - for (int i = 0; i < meta_entries; i++) + if (vl->meta != NULL) { - char meta_name[DATA_MAX_NAME_LEN]; - char value_str[DATA_MAX_NAME_LEN]; - int meta_type; - const char *key = meta_toc[i]; - - ssnprintf (meta_name, sizeof (meta_name), "%%{meta:%s}", key); - - meta_type = meta_data_type (vl->meta, key); - switch (meta_type) + char **meta_toc; + int meta_entries = meta_data_toc (vl->meta, &meta_toc); + for (int i = 0; i < meta_entries; i++) { - case MD_TYPE_STRING: - { - char *meta_value; - if (meta_data_get_string (vl->meta, key, &meta_value)) - { - ERROR ("Target `set': Unable to get string metadata value `%s'.", - key); - continue; - } - sstrncpy (value_str, meta_value, sizeof (value_str)); - } - break; - case MD_TYPE_SIGNED_INT: - { - int64_t meta_value; - if (meta_data_get_signed_int (vl->meta, key, &meta_value)) - { - ERROR ("Target `set': Unable to get signed int metadata value " - "`%s'.", key); - continue; - } - ssnprintf (value_str, sizeof (value_str), "%"PRIi64, meta_value); - } - break; - case MD_TYPE_UNSIGNED_INT: - { - uint64_t meta_value; - if (meta_data_get_unsigned_int (vl->meta, key, &meta_value)) - { - ERROR ("Target `set': Unable to get unsigned int metadata value " - "`%s'.", key); - continue; - } - ssnprintf (value_str, sizeof (value_str), "%"PRIu64, meta_value); - } - break; - case MD_TYPE_DOUBLE: - { - double meta_value; - if (meta_data_get_double (vl->meta, key, &meta_value)) - { - ERROR ("Target `set': Unable to get double metadata value `%s'.", - key); - continue; - } - ssnprintf (value_str, sizeof (value_str), GAUGE_FORMAT, meta_value); - } - break; - case MD_TYPE_BOOLEAN: - { - _Bool meta_value; - if (meta_data_get_boolean (vl->meta, key, &meta_value)) - { - ERROR ("Target `set': Unable to get boolean metadata value `%s'.", - key); - continue; - } - sstrncpy (value_str, meta_value ? "true" : "false", - sizeof (value_str)); - } - break; - default: - ERROR ("Target `set': Unable to retrieve metadata type for `%s'.", - key); + char meta_name[DATA_MAX_NAME_LEN]; + char *value_str; + const char *key = meta_toc[i]; + + ssnprintf (meta_name, sizeof (meta_name), "%%{meta:%s}", key); + if (meta_data_as_string (vl->meta, key, &value_str) != 0) continue; + + REPLACE_FIELD (meta_name, value_str); + sfree (value_str); } - REPLACE_FIELD (meta_name, value_str); + strarray_free (meta_toc, (size_t) meta_entries); } } /* }}} int ts_subst */ @@ -447,6 +384,7 @@ static int ts_invoke (const data_set_t *ds, value_list_t *vl, /* {{{ */ { ERROR ("Target `set': Unable to get replacement metadata value `%s'.", key); + strarray_free (meta_toc, (size_t) meta_entries); return (status); } @@ -455,14 +393,18 @@ static int ts_invoke (const data_set_t *ds, value_list_t *vl, /* {{{ */ DEBUG ("target_set: ts_invoke: setting metadata value for key `%s': " "`%s'.", key, temp); - status = meta_data_add_string (new_meta, key, temp); + sfree (string); + status = meta_data_add_string (new_meta, key, temp); if (status) { ERROR ("Target `set': Unable to set metadata value `%s'.", key); + strarray_free (meta_toc, (size_t) meta_entries); return (status); } } + + strarray_free (meta_toc, (size_t) meta_entries); } #define SUBST_FIELD(f) \