static void ts_subst(char *dest, size_t size, const char *string, /* {{{ */ const value_list_t *vl) { char temp[DATA_MAX_NAME_LEN]; /* 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); REPLACE_FIELD("%{host}", vl->host); REPLACE_FIELD("%{plugin}", vl->plugin); REPLACE_FIELD("%{plugin_instance}", vl->plugin_instance); REPLACE_FIELD("%{type}", vl->type); REPLACE_FIELD("%{type_instance}", vl->type_instance); if (vl->meta != NULL) { char **meta_toc = NULL; int meta_entries = meta_data_toc(vl->meta, &meta_toc); if (meta_entries <= 0) return; for (int i = 0; i < meta_entries; i++) { 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); } strarray_free(meta_toc, (size_t)meta_entries); } } /* }}} int ts_subst */
static int meta_data_to_json(char *buffer, size_t buffer_size, /* {{{ */ meta_data_t *meta) { char **keys = NULL; size_t keys_num; int status; if ((buffer == NULL) || (buffer_size == 0) || (meta == NULL)) return (EINVAL); status = meta_data_toc(meta, &keys); if (status <= 0) return (status); keys_num = (size_t)status; status = meta_data_keys_to_json(buffer, buffer_size, meta, keys, keys_num); for (size_t i = 0; i < keys_num; ++i) sfree(keys[i]); sfree(keys); return status; } /* }}} int meta_data_to_json */
static int meta_data_to_json (char *buffer, size_t buffer_size, /* {{{ */ meta_data_t *meta) { size_t offset = 0; char **keys = NULL; int keys_num; int status; int i; buffer[0] = 0; if (meta == NULL) return (EINVAL); #define BUFFER_ADD(...) do { \ status = ssnprintf (buffer + offset, buffer_size - offset, \ __VA_ARGS__); \ if (status < 1) \ return (-1); \ else if (((size_t) status) >= (buffer_size - offset)) \ return (-ENOMEM); \ else \ offset += ((size_t) status); \ } while (0) keys_num = meta_data_toc (meta, &keys); if (keys_num == 0) { sfree (keys); return (0); } for (i = 0; i < keys_num; ++i) { int type; char *key = keys[i]; type = meta_data_type (meta, key); if (type == MD_TYPE_STRING) { char *value = NULL; if (meta_data_get_string (meta, key, &value) == 0) { char temp[512] = ""; escape_string (temp, sizeof (temp), value); sfree (value); BUFFER_ADD (",\"%s\":%s", key, temp); } } else if (type == MD_TYPE_SIGNED_INT) { int64_t value = 0; if (meta_data_get_signed_int (meta, key, &value) == 0) BUFFER_ADD (",\"%s\":%"PRIi64, key, value); } else if (type == MD_TYPE_UNSIGNED_INT) { uint64_t value = 0; if (meta_data_get_unsigned_int (meta, key, &value) == 0) BUFFER_ADD (",\"%s\":%"PRIu64, key, value); } else if (type == MD_TYPE_DOUBLE) { double value = 0.0; if (meta_data_get_double (meta, key, &value) == 0) BUFFER_ADD (",\"%s\":%f", key, value); } else if (type == MD_TYPE_BOOLEAN) { _Bool value = 0; if (meta_data_get_boolean (meta, key, &value) == 0) BUFFER_ADD (",\"%s\":%s", key, value ? "true" : "false"); } free (key); } /* for (keys) */ free (keys); if (offset <= 0) return (ENOENT); buffer[0] = '{'; /* replace leading ',' */ BUFFER_ADD ("}"); #undef BUFFER_ADD return (0); } /* }}} int meta_data_to_json */