X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fcsv.c;h=e008ecfe0f6fdeafe10caa20b9d7ca2eaf44c2f6;hb=e5b10d0175c7f6c1db0567a103ae61c54d946e9d;hp=02d62c1e014e89f98becd7993ea14a646287b31b;hpb=efa4700ad47969749b0fca622294fd006b2d7cb8;p=collectd.git diff --git a/src/csv.c b/src/csv.c index 02d62c1e..e008ecfe 100644 --- a/src/csv.c +++ b/src/csv.c @@ -17,15 +17,15 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * Authors: - * Florian octo Forster + * Florian octo Forster * Doug MacEachern **/ #include "collectd.h" + #include "plugin.h" #include "common.h" #include "utils_cache.h" -#include "utils_parse_option.h" /* * Private variables @@ -46,7 +46,6 @@ static int value_list_to_string (char *buffer, int buffer_len, { int offset; int status; - int i; gauge_t *rates = NULL; assert (0 == strcmp (ds->type, vl->type)); @@ -59,19 +58,22 @@ static int value_list_to_string (char *buffer, int buffer_len, return (-1); offset = status; - for (i = 0; i < ds->ds_num; i++) + for (size_t i = 0; i < ds->ds_num; i++) { if ((ds->ds[i].type != DS_TYPE_COUNTER) && (ds->ds[i].type != DS_TYPE_GAUGE) && (ds->ds[i].type != DS_TYPE_DERIVE) && (ds->ds[i].type != DS_TYPE_ABSOLUTE)) + { + sfree (rates); return (-1); + } - if (ds->ds[i].type == DS_TYPE_GAUGE) + if (ds->ds[i].type == DS_TYPE_GAUGE) { status = ssnprintf (buffer + offset, buffer_len - offset, ",%lf", vl->values[i].gauge); - } + } else if (store_rates != 0) { if (rates == NULL) @@ -121,65 +123,62 @@ static int value_list_to_string (char *buffer, int buffer_len, return (0); } /* int value_list_to_string */ -static int value_list_to_filename (char *buffer, int buffer_len, - const data_set_t *ds, const value_list_t *vl) +static int value_list_to_filename (char *buffer, size_t buffer_size, + value_list_t const *vl) { - int offset = 0; int status; - assert (0 == strcmp (ds->type, vl->type)); + char *ptr = buffer; + size_t ptr_size = buffer_size; + time_t now; + struct tm struct_tm; if (datadir != NULL) { - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", datadir); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + size_t len = strlen (datadir) + 1; + + if (len >= ptr_size) + return (ENOBUFS); + + memcpy (ptr, datadir, len); + ptr[len-1] = '/'; + ptr_size -= len; + ptr += len; } - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->host); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + status = FORMAT_VL (ptr, ptr_size, vl); + if (status != 0) + return (status); - if (strlen (vl->plugin_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s/", vl->plugin, vl->plugin_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s/", vl->plugin); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + /* Skip all the time formatting stuff when printing to STDOUT or + * STDERR. */ + if (use_stdio) + return (0); - if (strlen (vl->type_instance) > 0) - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s-%s", vl->type, vl->type_instance); - else - status = ssnprintf (buffer + offset, buffer_len - offset, - "%s", vl->type); - if ((status < 1) || (status >= buffer_len - offset)) - return (-1); - offset += status; + ptr_size -= strlen (ptr); + ptr += strlen (ptr); - if (!use_stdio) + /* "-2013-07-12" => 11 bytes */ + if (ptr_size < 12) { - time_t now; - struct tm stm; + ERROR ("csv plugin: Buffer too small."); + return (ENOMEM); + } - /* TODO: Find a way to minimize the calls to `localtime_r', - * since they are pretty expensive.. */ - now = time (NULL); - if (localtime_r (&now, &stm) == NULL) - { - ERROR ("csv plugin: localtime_r failed"); - return (1); - } + /* TODO: Find a way to minimize the calls to `localtime_r', + * since they are pretty expensive.. */ + now = time (NULL); + if (localtime_r (&now, &struct_tm) == NULL) + { + ERROR ("csv plugin: localtime_r failed"); + return (-1); + } - strftime (buffer + offset, buffer_len - offset, - "-%Y-%m-%d", &stm); + status = strftime (ptr, ptr_size, "-%Y-%m-%d", &struct_tm); + if (status == 0) /* yep, it returns zero on error. */ + { + ERROR ("csv plugin: strftime failed"); + return (-1); } return (0); @@ -188,7 +187,6 @@ static int value_list_to_filename (char *buffer, int buffer_len, static int csv_create_file (const char *filename, const data_set_t *ds) { FILE *csv; - int i; if (check_create_dir (filename)) return (-1); @@ -204,7 +202,7 @@ static int csv_create_file (const char *filename, const data_set_t *ds) } fprintf (csv, "epoch"); - for (i = 0; i < ds->ds_num; i++) + for (size_t i = 0; i < ds->ds_num; i++) fprintf (csv, ",%s", ds->ds[i].name); fprintf (csv, "\n"); @@ -218,7 +216,10 @@ static int csv_config (const char *key, const char *value) if (strcasecmp ("DataDir", key) == 0) { if (datadir != NULL) + { free (datadir); + datadir = NULL; + } if (strcasecmp ("stdout", value) == 0) { use_stdio = 1; @@ -267,7 +268,7 @@ static int csv_write (const data_set_t *ds, const value_list_t *vl, char values[4096]; FILE *csv; int csv_fd; - struct flock fl; + struct flock fl = { 0 }; int status; if (0 != strcmp (ds->type, vl->type)) { @@ -275,7 +276,8 @@ static int csv_write (const data_set_t *ds, const value_list_t *vl, return -1; } - if (value_list_to_filename (filename, sizeof (filename), ds, vl) != 0) + status = value_list_to_filename (filename, sizeof (filename), vl); + if (status != 0) return (-1); DEBUG ("csv plugin: csv_write: filename = %s;", filename); @@ -285,12 +287,10 @@ static int csv_write (const data_set_t *ds, const value_list_t *vl, if (use_stdio) { - size_t i; - escape_string (filename, sizeof (filename)); /* Replace commas by colons for PUTVAL compatible output. */ - for (i = 0; i < sizeof (values); i++) + for (size_t i = 0; i < sizeof (values); i++) { if (values[i] == 0) break; @@ -339,9 +339,6 @@ static int csv_write (const data_set_t *ds, const value_list_t *vl, } csv_fd = fileno (csv); - memset (&fl, '\0', sizeof (fl)); - fl.l_start = 0; - fl.l_len = 0; /* till end of file */ fl.l_pid = getpid (); fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET;