python plugins: return error on more failures
[collectd.git] / src / csv.c
index afb4f83..e008ecf 100644 (file)
--- a/src/csv.c
+++ b/src/csv.c
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  *
  * Authors:
- *   Florian octo Forster <octo at verplant.org>
+ *   Florian octo Forster <octo at collectd.org>
  *   Doug MacEachern <dougm@hyperic.com>
  **/
 
 #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)
@@ -126,12 +128,25 @@ static int value_list_to_filename (char *buffer, size_t buffer_size,
 {
        int status;
 
-       char *ptr;
-       size_t ptr_size;
+       char *ptr = buffer;
+       size_t ptr_size = buffer_size;
        time_t now;
        struct tm struct_tm;
 
-       status = FORMAT_VL (buffer, buffer_size, vl);
+       if (datadir != NULL)
+       {
+               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 = FORMAT_VL (ptr, ptr_size, vl);
        if (status != 0)
                return (status);
 
@@ -140,8 +155,8 @@ static int value_list_to_filename (char *buffer, size_t buffer_size,
        if (use_stdio)
                return (0);
 
-       ptr_size = buffer_size - strlen (buffer);
-       ptr = buffer + strlen (buffer);
+       ptr_size -= strlen (ptr);
+       ptr +=  strlen (ptr);
 
        /* "-2013-07-12" => 11 bytes */
        if (ptr_size < 12)
@@ -172,7 +187,6 @@ static int value_list_to_filename (char *buffer, size_t buffer_size,
 static int csv_create_file (const char *filename, const data_set_t *ds)
 {
        FILE *csv;
-       int i;
 
        if (check_create_dir (filename))
                return (-1);
@@ -188,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");
@@ -202,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;
@@ -251,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)) {
@@ -270,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;
@@ -324,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;