modbus plugin: Fix a small memory leak in mb_config_add_datagroup().
[collectd.git] / src / modbus.c
index 7145c8a..2276572 100644 (file)
@@ -1,6 +1,7 @@
 /**
  * collectd - src/modbus.c
  * Copyright (C) 2010  noris network AG
+ * Copyright (C) 2011  Universiteit Gent
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as published by
@@ -18,6 +19,7 @@
  *
  * Authors:
  *   Florian Forster <octo at noris.net>
+ *   Ivo De Decker <ivo.dedecker at ugent.be>
  **/
 
 #include "collectd.h"
@@ -88,14 +90,14 @@ struct mb_data_s /* {{{ */
   mb_data_t *next;
 }; /* }}} */
 
-struct mb_dataset_s;
-typedef struct mb_dataset_s mb_dataset_t;
-struct mb_dataset_s /* {{{ */
+struct mb_datagroup_s;
+typedef struct mb_datagroup_s mb_datagroup_t;
+struct mb_datagroup_s /* {{{ */
 {
   char *name;
   mb_data_t *collect;
 
-  mb_dataset_t *next;
+  mb_datagroup_t *next;
 }; /* }}} */
 
 struct mb_slave_s /* {{{ */
@@ -141,7 +143,7 @@ struct mb_data_group_s /* {{{ */
  * Global variables
  */
 static mb_data_t *data_definitions = NULL;
-static mb_dataset_t *data_sets = NULL;
+static mb_datagroup_t *data_groups = NULL;
 
 /*
  * Functions
@@ -235,10 +237,10 @@ static int data_copy_by_name (mb_data_t **dst, mb_data_t *src, /* {{{ */
   return (data_copy (dst, ptr));
 } /* }}} int data_copy_by_name */
 
-static mb_dataset_t *dataset_get_by_name (mb_dataset_t *src, /* {{{ */
+static mb_datagroup_t *datagroup_get_by_name (mb_datagroup_t *src, /* {{{ */
     const char *name)
 {
-  mb_dataset_t *ptr;
+  mb_datagroup_t *ptr;
 
   if (name == NULL)
     return (NULL);
@@ -248,11 +250,11 @@ static mb_dataset_t *dataset_get_by_name (mb_dataset_t *src, /* {{{ */
       return (ptr);
 
   return (NULL);
-} /* }}} mb_dataset_t *dataset_get_by_name */
+} /* }}} mb_datagroup_t *datagroup_get_by_name */
 
-static int dataset_append (mb_dataset_t **dst, mb_dataset_t *src) /* {{{ */
+static int datagroup_append (mb_datagroup_t **dst, mb_datagroup_t *src) /* {{{ */
 {
-  mb_dataset_t *ptr;
+  mb_datagroup_t *ptr;
 
   if ((dst == NULL) || (src == NULL))
     return (EINVAL);
@@ -271,41 +273,7 @@ static int dataset_append (mb_dataset_t **dst, mb_dataset_t *src) /* {{{ */
   ptr->next = src;
 
   return (0);
-} /* }}} int dataset_append */
-
-/* Copy a single mb_dataset_t and append it to another list. */
-static int dataset_copy (mb_dataset_t **dst, const mb_dataset_t *src) /* {{{ */
-{
-  mb_dataset_t *tmp;
-  int status;
-
-  if ((dst == NULL) || (src == NULL))
-    return (EINVAL);
-
-  tmp = malloc (sizeof (*tmp));
-  if (tmp == NULL)
-    return (ENOMEM);
-  memcpy (tmp, src, sizeof (*tmp));
-  tmp->name = NULL;
-  tmp->next = NULL;
-
-  tmp->name = strdup (src->name);
-  if (tmp->name == NULL)
-  {
-    sfree (tmp);
-    return (ENOMEM);
-  }
-
-  status = dataset_append (dst, tmp);
-  if (status != 0)
-  {
-    sfree (tmp->name);
-    sfree (tmp);
-    return (status);
-  }
-
-  return (0);
-} /* }}} int dataset_copy */
+} /* }}} int datagroup_append */
 
 /* Read functions */
 
@@ -878,14 +846,14 @@ static int mb_config_add_slave (mb_host_t *host, oconfig_item_t *ci) /* {{{ */
         data_copy_by_name (&slave->collect, data_definitions, buffer);
       status = 0; /* continue after failure. */
     }
-    else if (strcasecmp ("Dataset", child->key) == 0)
+    else if (strcasecmp ("Datagroup", child->key) == 0)
     {
       char buffer[1024];
-      mb_dataset_t *ds;
+      mb_datagroup_t *ds;
 
       status = cf_util_get_string_buffer (child, buffer, sizeof (buffer));
       if (status == 0) {
-        ds = dataset_get_by_name (data_sets, buffer);
+        ds = datagroup_get_by_name (data_groups, buffer);
         if (ds) {
           mb_data_t *data;
           for (data = ds->collect; data != NULL; data = data->next)
@@ -895,7 +863,7 @@ static int mb_config_add_slave (mb_host_t *host, oconfig_item_t *ci) /* {{{ */
         }
       }
       status = 0; /* continue after failure. */
-       }
+    }
     else
     {
       ERROR ("Modbus plugin: Unknown configuration option: %s", child->key);
@@ -1006,18 +974,21 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
 } /* }}} int mb_config_add_host */
 
 
-static int mb_config_add_dataset (oconfig_item_t *ci) /* {{{ */
+static int mb_config_add_datagroup (oconfig_item_t *ci) /* {{{ */
 {
-  mb_dataset_t dataset;
+  mb_datagroup_t *datagroup;
   int status;
   int i;
 
-  memset (&dataset, 0, sizeof (dataset));
-  dataset.name = NULL;
-  dataset.collect = NULL;
-  dataset.next = NULL;
+  datagroup = malloc (sizeof (*datagroup));
+  if (datagroup == NULL)
+    return (ENOMEM);
+  memset (datagroup, 0, sizeof (*datagroup));
+  datagroup->name = NULL;
+  datagroup->collect = NULL;
+  datagroup->next = NULL;
 
-  status = cf_util_get_string (ci, &dataset.name);
+  status = cf_util_get_string (ci, &datagroup->name);
   
   for (i = 0; i < ci->children_num; i++)
   {
@@ -1029,8 +1000,8 @@ static int mb_config_add_dataset (oconfig_item_t *ci) /* {{{ */
       char buffer[1024];
       status = cf_util_get_string_buffer (child, buffer, sizeof (buffer));
       if (status == 0) {
-        data_copy_by_name (&dataset.collect, data_definitions, buffer);
-         }
+        data_copy_by_name (&datagroup->collect, data_definitions, buffer);
+      }
       status = 0; /* continue after failure. */
     }
     else
@@ -1043,14 +1014,23 @@ static int mb_config_add_dataset (oconfig_item_t *ci) /* {{{ */
       break;
   } /* for (i = 0; i < ci->children_num; i++) */
 
-  if ((status == 0) && (dataset.collect == NULL))
-    status = EINVAL;
+  if ((status == 0) && (datagroup->collect == NULL))
+    status = ENOENT;
 
   if (status == 0)
-    dataset_copy (&data_sets, &dataset);
+  {
+    datagroup_append (&data_groups, datagroup);
+  }
+  else /* if (status != 0) */
+  {
+    sfree (datagroup->name);
+    data_free_all (datagroup->collect);
+    assert (datagroup->next == NULL);
+    sfree (datagroup);
+  }
 
   return (status);
-} /* }}} int mb_config_add_dataset */
+} /* }}} int mb_config_add_datagroup */
 
 static int mb_config (oconfig_item_t *ci) /* {{{ */
 {
@@ -1067,8 +1047,8 @@ static int mb_config (oconfig_item_t *ci) /* {{{ */
       mb_config_add_data (child);
     else if (strcasecmp ("Host", child->key) == 0)
       mb_config_add_host (child);
-    else if (strcasecmp ("Dataset", child->key) == 0)
-      mb_config_add_dataset (child);
+    else if (strcasecmp ("Datagroup", child->key) == 0)
+      mb_config_add_datagroup (child);
     else
       ERROR ("Modbus plugin: Unknown configuration option: %s", child->key);
   }