From 21d12548861a8a4f641a5291f6f47421737d6124 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Sat, 25 May 2013 11:15:29 +0200 Subject: [PATCH] modbus plugin: Refactor the new reconnection code. Avoid the goto() and switch() statements. Github: #294 --- src/modbus.c | 59 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/modbus.c b/src/modbus.c index f40258d0..887c63c0 100644 --- a/src/modbus.c +++ b/src/modbus.c @@ -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,41 @@ 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: + status = 0; + 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 } -- 2.11.0