postgresql plugin: Register a new user data pointer with udb_query_set_user_data...
[collectd.git] / src / modbus.c
index b5bd75b..2cef4aa 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <netdb.h>
 
-#include <modbus/modbus.h>
+#include <modbus.h>
 
 #ifndef LIBMODBUS_VERSION_CHECK
 /* Assume version 2.0.3 */
@@ -377,8 +377,6 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
   uint16_t values[2];
   int values_num;
   const data_set_t *ds;
-  struct sockaddr sockaddr;
-  socklen_t saddrlen = sizeof(sockaddr);
   int status;
 
   if ((host == NULL) || (slave == NULL) || (data == NULL))
@@ -416,32 +414,40 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
   else
     values_num = 1;
 
-  if(host->connection == NULL)
-    goto try_connect;
-
-  if(getpeername(modbus_get_socket(host->connection),
-                 &sockaddr, &saddrlen) != 0)
-    switch(errno){
-    case EBADF:
-    case ENOTSOCK:
-    case ENOTCONN:
-    try_connect:
-      status = mb_init_connection (host);
-      if (status != 0)
-      {
-        ERROR ("Modbus plugin: mb_init_connection (%s/%s) failed. ",
-           host->host, host->node);
-        host->is_connected = 0;
-        host->connection = NULL;
-        return (-1);
-      }
-    break;
-    default:
+  if (host->connection == NULL)
+  {
+    status = EBADF;
+  }
+  else
+  {
+    struct sockaddr sockaddr;
+    socklen_t saddrlen = sizeof (sockaddr);
+
+    status = getpeername (modbus_get_socket (host->connection),
+        &sockaddr, &saddrlen);
+    if (status != 0)
+      status = errno;
+  }
+
+  if ((status == EBADF) || (status == ENOTSOCK) || (status == ENOTCONN))
+  {
+    status = mb_init_connection (host);
+    if (status != 0)
+    {
+      ERROR ("Modbus plugin: mb_init_connection (%s/%s) failed. ",
+          host->host, host->node);
+      host->is_connected = 0;
+      host->connection = NULL;
+      return (-1);
+    }
+  }
+  else if (status != 0)
+  {
 #if LEGACY_LIBMODBUS
-      modbus_close (&host->connection);
+    modbus_close (&host->connection);
 #else
-      modbus_close (host->connection);
-      modbus_free (host->connection);
+    modbus_close (host->connection);
+    modbus_free (host->connection);
 #endif
   }
  
@@ -466,8 +472,15 @@ static int mb_read_data (mb_host_t *host, mb_slave_t *slave, /* {{{ */
         /* num_registers = */ values_num, /* buffer = */ values);
   if (status != values_num)
   {
-    ERROR ("Modbus plugin: modbus_read_registers (%s) failed. "
-        "Giving up.", host->host);
+    ERROR ("Modbus plugin: modbus_read_registers (%s/%s) failed. status = %i, values_num = %i "
+        "Giving up.", host->host, host->node, status, values_num);
+#if LEGACY_LIBMODBUS
+    modbus_close (&host->connection);
+#else
+    modbus_close (host->connection);
+    modbus_free (host->connection);
+#endif
+    host->connection = NULL;
     return (-1);
   }
 
@@ -663,7 +676,6 @@ static int mb_config_add_data (oconfig_item_t *ci) /* {{{ */
   for (i = 0; i < ci->children_num; i++)
   {
     oconfig_item_t *child = ci->children + i;
-    status = 0;
 
     if (strcasecmp ("Type", child->key) == 0)
       status = cf_util_get_string_buffer (child,
@@ -802,7 +814,6 @@ static int mb_config_add_slave (mb_host_t *host, oconfig_item_t *ci) /* {{{ */
   for (i = 0; i < ci->children_num; i++)
   {
     oconfig_item_t *child = ci->children + i;
-    status = 0;
 
     if (strcasecmp ("Instance", child->key) == 0)
       status = cf_util_get_string_buffer (child,
@@ -853,9 +864,15 @@ static int mb_config_add_host (oconfig_item_t *ci) /* {{{ */
 
   status = cf_util_get_string_buffer (ci, host->host, sizeof (host->host));
   if (status != 0)
+  {
+    sfree (host);
     return (status);
+  }
   if (host->host[0] == 0)
+  {
+    sfree (host);
     return (EINVAL);
+  }
 
   for (i = 0; i < ci->children_num; i++)
   {