示例#1
0
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 */
示例#2
0
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 */
示例#3
0
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 */