X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Frrdtool.c;h=e093f2b27f5395c7ec304044d84fc305af6e0fef;hb=ef07224d5a3e24ccbc71765194d91a8e00ce16fc;hp=71da54749fe1d1a6377bbe450551e04658e433bb;hpb=affac33e83584e7538c358e3bd0a587d0c692bc3;p=collectd.git diff --git a/src/rrdtool.c b/src/rrdtool.c index 71da5474..e093f2b2 100644 --- a/src/rrdtool.c +++ b/src/rrdtool.c @@ -198,13 +198,13 @@ static int srrd_update (char *filename, char *template, } /* int srrd_update */ #endif /* !HAVE_THREADSAFE_LIBRRD */ -static int value_list_to_string (char *buffer, int buffer_len, +static int value_list_to_string_multiple (char *buffer, int buffer_len, const data_set_t *ds, const value_list_t *vl) { int offset; int status; time_t tt; - int i; + size_t i; memset (buffer, '\0', buffer_len); @@ -227,7 +227,7 @@ static int value_list_to_string (char *buffer, int buffer_len, ":%llu", vl->values[i].counter); else if (ds->ds[i].type == DS_TYPE_GAUGE) status = ssnprintf (buffer + offset, buffer_len - offset, - ":%lf", vl->values[i].gauge); + ":"GAUGE_FORMAT, vl->values[i].gauge); else if (ds->ds[i].type == DS_TYPE_DERIVE) status = ssnprintf (buffer + offset, buffer_len - offset, ":%"PRIi64, vl->values[i].derive); @@ -242,6 +242,45 @@ static int value_list_to_string (char *buffer, int buffer_len, } /* for ds->ds_num */ return (0); +} /* int value_list_to_string_multiple */ + +static int value_list_to_string (char *buffer, int buffer_len, + const data_set_t *ds, const value_list_t *vl) +{ + int status; + time_t tt; + + if (ds->ds_num != 1) + return (value_list_to_string_multiple (buffer, buffer_len, + ds, vl)); + + tt = CDTIME_T_TO_TIME_T (vl->time); + switch (ds->ds[0].type) + { + case DS_TYPE_DERIVE: + status = ssnprintf (buffer, buffer_len, "%u:%"PRIi64, + (unsigned) tt, vl->values[0].derive); + break; + case DS_TYPE_GAUGE: + status = ssnprintf (buffer, buffer_len, "%u:"GAUGE_FORMAT, + (unsigned) tt, vl->values[0].gauge); + break; + case DS_TYPE_COUNTER: + status = ssnprintf (buffer, buffer_len, "%u:%llu", + (unsigned) tt, vl->values[0].counter); + break; + case DS_TYPE_ABSOLUTE: + status = ssnprintf (buffer, buffer_len, "%u:%"PRIu64, + (unsigned) tt, vl->values[0].absolute); + break; + default: + return (EINVAL); + } + + if ((status < 1) || (status >= buffer_len)) + return (ENOMEM); + + return (0); } /* int value_list_to_string */ static int value_list_to_filename (char *buffer, size_t buffer_size, @@ -694,7 +733,10 @@ static int rrd_cache_insert (const char *filename, { rc = malloc (sizeof (*rc)); if (rc == NULL) + { + pthread_mutex_unlock (&cache_lock); return (-1); + } rc->values_num = 0; rc->values = NULL; rc->first_value = 0; @@ -704,6 +746,7 @@ static int rrd_cache_insert (const char *filename, new_rc = 1; } + assert (value_time > 0); /* plugin_dispatch() ensures this. */ if (rc->last_value >= value_time) { pthread_mutex_unlock (&cache_lock);