Module: monitoring-plugins
 Branch: master
 Commit: 811da10fda11b1d0453453040647270700862d8f
 Author: Lorenz Kästle <[email protected]>
   Date: Mon Sep 15 15:49:26 2025 +0200
    URL: 
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=811da10f

More refactoring

---

 plugins-root/check_icmp.d/check_icmp_helpers.c |   4 +-
 plugins/check_load.c                           |   4 +-
 plugins/netutils.c                             | 224 +++++++++++++------------
 plugins/netutils.h                             |  32 ++--
 4 files changed, 139 insertions(+), 125 deletions(-)

diff --git a/plugins-root/check_icmp.d/check_icmp_helpers.c 
b/plugins-root/check_icmp.d/check_icmp_helpers.c
index d56fbd8b..1b96a392 100644
--- a/plugins-root/check_icmp.d/check_icmp_helpers.c
+++ b/plugins-root/check_icmp.d/check_icmp_helpers.c
@@ -76,7 +76,7 @@ check_icmp_state check_icmp_state_init() {
 
 ping_target_create_wrapper ping_target_create(struct sockaddr_storage address) 
{
        ping_target_create_wrapper result = {
-               .errorcode = OK,
+               .errorcode = 0,
        };
 
        struct sockaddr_storage *tmp_addr = &address;
@@ -88,7 +88,7 @@ ping_target_create_wrapper ping_target_create(struct 
sockaddr_storage address) {
                   ((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == 
INADDR_ANY))) ||
                (tmp_addr->ss_family == AF_INET6 &&
                 (((struct sockaddr_in6 *)tmp_addr)->sin6_addr.s6_addr == 
in6addr_any.s6_addr))) {
-               result.errorcode = ERROR;
+               result.errorcode = 1;
                return result;
        }
 
diff --git a/plugins/check_load.c b/plugins/check_load.c
index f7a6f7fd..644cd604 100644
--- a/plugins/check_load.c
+++ b/plugins/check_load.c
@@ -452,8 +452,8 @@ static top_processes_result 
print_top_consuming_processes(unsigned long n_procs_
        top_processes_result result = {
                .errorcode = OK,
        };
-       struct output chld_out;
-       struct output chld_err;
+       output chld_out;
+       output chld_err;
        if (np_runcmd(PS_COMMAND, &chld_out, &chld_err, 0) != 0) {
                fprintf(stderr, _("'%s' exited with non-zero status.\n"), 
PS_COMMAND);
                result.errorcode = ERROR;
diff --git a/plugins/netutils.c b/plugins/netutils.c
index 92c53e4c..b4c6ff0a 100644
--- a/plugins/netutils.c
+++ b/plugins/netutils.c
@@ -30,13 +30,14 @@
 #include "common.h"
 #include "output.h"
 #include "states.h"
+#include <sys/types.h>
 #include "netutils.h"
 
 unsigned int socket_timeout = DEFAULT_SOCKET_TIMEOUT;
-unsigned int socket_timeout_state = STATE_CRITICAL;
-
-int econn_refuse_state = STATE_CRITICAL;
+mp_state_enum socket_timeout_state = STATE_CRITICAL;
+mp_state_enum econn_refuse_state = STATE_CRITICAL;
 bool was_refused = false;
+
 #if USE_IPV6
 int address_family = AF_UNSPEC;
 #else
@@ -63,39 +64,40 @@ void socket_timeout_alarm_handler(int sig) {
 /* connects to a host on a specified tcp port, sends a string, and gets a
         response. loops on select-recv until timeout or eof to get all of a
         multi-packet answer */
-int process_tcp_request2(const char *server_address, int server_port, const 
char *send_buffer,
-                                                char *recv_buffer, int 
recv_size) {
+mp_state_enum process_tcp_request2(const char *server_address, const int 
server_port,
+                                                                  const char 
*send_buffer, char *recv_buffer,
+                                                                  const int 
recv_size) {
 
-       int result;
-       int send_result;
-       int recv_result;
-       int sd;
-       struct timeval tv;
-       fd_set readfds;
-       int recv_length = 0;
+       int socket;
 
-       result = np_net_connect(server_address, server_port, &sd, IPPROTO_TCP);
-       if (result != STATE_OK) {
+       mp_state_enum connect_result =
+               np_net_connect(server_address, server_port, &socket, 
IPPROTO_TCP);
+       if (connect_result != STATE_OK) {
                return STATE_CRITICAL;
        }
 
-       send_result = send(sd, send_buffer, strlen(send_buffer), 0);
+       mp_state_enum result;
+       ssize_t send_result = send(socket, send_buffer, strlen(send_buffer), 0);
        if (send_result < 0 || (size_t)send_result != strlen(send_buffer)) {
                // printf("%s\n", _("Send failed"));
                result = STATE_WARNING;
        }
 
-       while (1) {
+       fd_set readfds;
+       ssize_t recv_length = 0;
+       while (true) {
                /* wait up to the number of seconds for socket timeout
                   minus one for data from the host */
-               tv.tv_sec = socket_timeout - 1;
-               tv.tv_usec = 0;
+               struct timeval timeout = {
+                       .tv_sec = socket_timeout - 1,
+                       .tv_usec = 0,
+               };
                FD_ZERO(&readfds);
-               FD_SET(sd, &readfds);
-               select(sd + 1, &readfds, NULL, NULL, &tv);
+               FD_SET(socket, &readfds);
+               select(socket + 1, &readfds, NULL, NULL, &timeout);
 
                /* make sure some data has arrived */
-               if (!FD_ISSET(sd, &readfds)) { /* it hasn't */
+               if (!FD_ISSET(socket, &readfds)) { /* it hasn't */
                        if (!recv_length) {
                                strcpy(recv_buffer, "");
                                // printf("%s\n", _("No data was received from 
host!"));
@@ -104,72 +106,69 @@ int process_tcp_request2(const char *server_address, int 
server_port, const char
                                recv_buffer[recv_length] = 0;
                        }
                        break;
-               } else { /* it has */
-                       recv_result =
-                               recv(sd, recv_buffer + recv_length, 
(size_t)recv_size - recv_length - 1, 0);
-                       if (recv_result == -1) {
-                               /* recv failed, bail out */
-                               strcpy(recv_buffer + recv_length, "");
-                               result = STATE_WARNING;
-                               break;
-                       } else if (recv_result == 0) {
-                               /* end of file ? */
-                               recv_buffer[recv_length] = 0;
-                               break;
-                       } else { /* we got data! */
-                               recv_length += recv_result;
-                               if (recv_length >= recv_size - 1) {
-                                       /* buffer full, we're done */
-                                       recv_buffer[recv_size - 1] = 0;
-                                       break;
-                               }
-                       }
+               } /* it has */
+
+               ssize_t recv_result =
+                       recv(socket, recv_buffer + recv_length, 
(size_t)(recv_size - recv_length - 1), 0);
+               if (recv_result == -1) {
+                       /* recv failed, bail out */
+                       strcpy(recv_buffer + recv_length, "");
+                       result = STATE_WARNING;
+                       break;
+               }
+
+               if (recv_result == 0) {
+                       /* end of file ? */
+                       recv_buffer[recv_length] = 0;
+                       break;
+               }
+
+               /* we got data! */
+               recv_length += recv_result;
+               if (recv_length >= recv_size - 1) {
+                       /* buffer full, we're done */
+                       recv_buffer[recv_size - 1] = 0;
+                       break;
                }
                /* end if(!FD_ISSET(sd,&readfds)) */
        }
-       /* end while(1) */
 
-       close(sd);
+       close(socket);
        return result;
 }
 
 /* connects to a host on a specified port, sends a string, and gets a
    response */
-int process_request(const char *server_address, int server_port, int proto, 
const char *send_buffer,
-                                       char *recv_buffer, int recv_size) {
-       int result;
-       int sd;
+mp_state_enum process_request(const char *server_address, const int 
server_port, const int proto,
+                                                         const char 
*send_buffer, char *recv_buffer, const int recv_size) {
 
-       result = STATE_OK;
-
-       result = np_net_connect(server_address, server_port, &sd, proto);
+       mp_state_enum result = STATE_OK;
+       int socket;
+       result = np_net_connect(server_address, server_port, &socket, proto);
        if (result != STATE_OK) {
                return STATE_CRITICAL;
        }
 
-       result = send_request(sd, proto, send_buffer, recv_buffer, recv_size);
+       result = send_request(socket, proto, send_buffer, recv_buffer, 
recv_size);
 
-       close(sd);
+       close(socket);
 
        return result;
 }
 
 /* opens a tcp or udp connection to a remote host or local socket */
-int np_net_connect(const char *host_name, int port, int *sd, int proto) {
+mp_state_enum np_net_connect(const char *host_name, int port, int 
*socketDescriptor,
+                                                        const int proto) {
        /* send back STATE_UNKOWN if there's an error
           send back STATE_OK if we connect
           send back STATE_CRITICAL if we can't connect.
           Let upstream figure out what to send to the user. */
-       struct addrinfo hints;
-       struct addrinfo *r, *res;
-       struct sockaddr_un su;
-       char port_str[6], host[MAX_HOST_ADDRESS_LENGTH];
-       size_t len;
-       int socktype, result;
-       short is_socket = (host_name[0] == '/');
-
-       socktype = (proto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM;
+       bool is_socket = (host_name[0] == '/');
+       int socktype = (proto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM;
 
+       struct addrinfo hints = {};
+       struct addrinfo *res = NULL;
+       int result;
        /* as long as it doesn't start with a '/', it's assumed a host or ip */
        if (!is_socket) {
                memset(&hints, 0, sizeof(hints));
@@ -177,38 +176,46 @@ int np_net_connect(const char *host_name, int port, int 
*sd, int proto) {
                hints.ai_protocol = proto;
                hints.ai_socktype = socktype;
 
-               len = strlen(host_name);
+               size_t len = strlen(host_name);
                /* check for an [IPv6] address (and strip the brackets) */
                if (len >= 2 && host_name[0] == '[' && host_name[len - 1] == 
']') {
                        host_name++;
                        len -= 2;
                }
+
+               char host[MAX_HOST_ADDRESS_LENGTH];
+
                if (len >= sizeof(host)) {
                        return STATE_UNKNOWN;
                }
+
                memcpy(host, host_name, len);
                host[len] = '\0';
+
+               char port_str[6];
                snprintf(port_str, sizeof(port_str), "%d", port);
-               result = getaddrinfo(host, port_str, &hints, &res);
+               int getaddrinfo_err = getaddrinfo(host, port_str, &hints, &res);
 
-               if (result != 0) {
+               if (getaddrinfo_err != 0) {
                        // printf("%s\n", gai_strerror(result));
                        return STATE_UNKNOWN;
                }
 
-               r = res;
-               while (r) {
+               struct addrinfo *addressPointer = res;
+               while (addressPointer) {
                        /* attempt to create a socket */
-                       *sd = socket(r->ai_family, socktype, r->ai_protocol);
+                       *socketDescriptor =
+                               socket(addressPointer->ai_family, socktype, 
addressPointer->ai_protocol);
 
-                       if (*sd < 0) {
+                       if (*socketDescriptor < 0) {
                                // printf("%s\n", _("Socket creation failed"));
-                               freeaddrinfo(r);
+                               freeaddrinfo(addressPointer);
                                return STATE_UNKNOWN;
                        }
 
                        /* attempt to open a connection */
-                       result = connect(*sd, r->ai_addr, r->ai_addrlen);
+                       result =
+                               connect(*socketDescriptor, 
addressPointer->ai_addr, addressPointer->ai_addrlen);
 
                        if (result == 0) {
                                was_refused = false;
@@ -223,24 +230,28 @@ int np_net_connect(const char *host_name, int port, int 
*sd, int proto) {
                                }
                        }
 
-                       close(*sd);
-                       r = r->ai_next;
+                       close(*socketDescriptor);
+                       addressPointer = addressPointer->ai_next;
                }
+
                freeaddrinfo(res);
-       }
-       /* else the hostname is interpreted as a path to a unix socket */
-       else {
+
+       } else {
+               /* else the hostname is interpreted as a path to a unix socket 
*/
                if (strlen(host_name) >= UNIX_PATH_MAX) {
                        die(STATE_UNKNOWN, _("Supplied path too long unix 
domain socket"));
                }
-               memset(&su, 0, sizeof(su));
+
+               struct sockaddr_un su = {};
                su.sun_family = AF_UNIX;
                strncpy(su.sun_path, host_name, UNIX_PATH_MAX);
-               *sd = socket(PF_UNIX, SOCK_STREAM, 0);
-               if (*sd < 0) {
+               *socketDescriptor = socket(PF_UNIX, SOCK_STREAM, 0);
+
+               if (*socketDescriptor < 0) {
                        die(STATE_UNKNOWN, _("Socket creation failed"));
                }
-               result = connect(*sd, (struct sockaddr *)&su, sizeof(su));
+
+               result = connect(*socketDescriptor, (struct sockaddr *)&su, 
sizeof(su));
                if (result < 0 && errno == ECONNREFUSED) {
                        was_refused = true;
                }
@@ -248,7 +259,9 @@ int np_net_connect(const char *host_name, int port, int 
*sd, int proto) {
 
        if (result == 0) {
                return STATE_OK;
-       } else if (was_refused) {
+       }
+
+       if (was_refused) {
                switch (econn_refuse_state) { /* a user-defined expected 
outcome */
                case STATE_OK:
                case STATE_WARNING:  /* user wants WARN or OK on refusal, or... 
*/
@@ -275,14 +288,11 @@ int np_net_connect(const char *host_name, int port, int 
*sd, int proto) {
        }
 }
 
-int send_request(int sd, int proto, const char *send_buffer, char 
*recv_buffer, int recv_size) {
-       int result = STATE_OK;
-       int send_result;
-       int recv_result;
-       struct timeval tv;
-       fd_set readfds;
+mp_state_enum send_request(const int socket, const int proto, const char 
*send_buffer,
+                                                  char *recv_buffer, const int 
recv_size) {
+       mp_state_enum result = STATE_OK;
 
-       send_result = send(sd, send_buffer, strlen(send_buffer), 0);
+       ssize_t send_result = send(socket, send_buffer, strlen(send_buffer), 0);
        if (send_result < 0 || (size_t)send_result != strlen(send_buffer)) {
                // printf("%s\n", _("Send failed"));
                result = STATE_WARNING;
@@ -290,21 +300,22 @@ int send_request(int sd, int proto, const char 
*send_buffer, char *recv_buffer,
 
        /* wait up to the number of seconds for socket timeout minus one
           for data from the host */
-       tv.tv_sec = socket_timeout - 1;
-       tv.tv_usec = 0;
+       struct timeval timestamp = {
+               .tv_sec = socket_timeout - 1,
+               .tv_usec = 0,
+       };
+       fd_set readfds;
        FD_ZERO(&readfds);
-       FD_SET(sd, &readfds);
-       select(sd + 1, &readfds, NULL, NULL, &tv);
+       FD_SET(socket, &readfds);
+       select(socket + 1, &readfds, NULL, NULL, &timestamp);
 
        /* make sure some data has arrived */
-       if (!FD_ISSET(sd, &readfds)) {
+       if (!FD_ISSET(socket, &readfds)) {
                strcpy(recv_buffer, "");
                // printf("%s\n", _("No data was received from host!"));
                result = STATE_WARNING;
-       }
-
-       else {
-               recv_result = recv(sd, recv_buffer, (size_t)recv_size - 1, 0);
+       } else {
+               ssize_t recv_result = recv(socket, recv_buffer, 
(size_t)(recv_size - 1), 0);
                if (recv_result == -1) {
                        strcpy(recv_buffer, "");
                        if (proto != IPPROTO_TCP) {
@@ -318,6 +329,7 @@ int send_request(int sd, int proto, const char 
*send_buffer, char *recv_buffer,
                /* die returned string */
                recv_buffer[recv_size - 1] = 0;
        }
+
        return result;
 }
 
@@ -339,27 +351,27 @@ bool is_addr(const char *address) {
 #ifdef USE_IPV6
        if (address_family == AF_INET && is_inet_addr(address)) {
                return true;
-       } else if (address_family == AF_INET6 && is_inet6_addr(address)) {
+       }
+
+       if (address_family == AF_INET6 && is_inet6_addr(address)) {
                return true;
        }
 #else
        if (is_inet_addr(address)) {
-               return (true);
+               return true;
        }
 #endif
 
-       return (false);
+       return false;
 }
 
-int dns_lookup(const char *in, struct sockaddr_storage *ss, int family) {
+bool dns_lookup(const char *node_string, struct sockaddr_storage *ss, const 
int family) {
        struct addrinfo hints;
-       struct addrinfo *res;
-       int retval;
-
        memset(&hints, 0, sizeof(struct addrinfo));
        hints.ai_family = family;
 
-       retval = getaddrinfo(in, NULL, &hints, &res);
+       struct addrinfo *res;
+       int retval = getaddrinfo(node_string, NULL, &hints, &res);
        if (retval != 0) {
                return false;
        }
@@ -367,6 +379,8 @@ int dns_lookup(const char *in, struct sockaddr_storage *ss, 
int family) {
        if (ss != NULL) {
                memcpy(ss, res->ai_addr, res->ai_addrlen);
        }
+
        freeaddrinfo(res);
+
        return true;
 }
diff --git a/plugins/netutils.h b/plugins/netutils.h
index 6adb8e01..c4461113 100644
--- a/plugins/netutils.h
+++ b/plugins/netutils.h
@@ -31,7 +31,6 @@
 #ifndef _NETUTILS_H_
 #define _NETUTILS_H_
 
-#include "common.h"
 #include "output.h"
 #include "states.h"
 #include "utils.h"
@@ -56,25 +55,26 @@
        process_request(addr, port, IPPROTO_TCP, sbuf, rbuf, rsize)
 #define process_udp_request(addr, port, sbuf, rbuf, rsize)                     
                    \
        process_request(addr, port, IPPROTO_UDP, sbuf, rbuf, rsize)
-int process_tcp_request2(const char *address, int port, const char *sbuffer, 
char *rbuffer,
-                                                int rsize);
-int process_request(const char *address, int port, int proto, const char 
*sbuffer, char *rbuffer,
-                                       int rsize);
+mp_state_enum process_tcp_request2(const char *server_address, int server_port,
+                                                                  const char 
*send_buffer, char *recv_buffer, int recv_size);
+mp_state_enum process_request(const char *server_address, int server_port, int 
proto,
+                                                         const char 
*send_buffer, char *recv_buffer, int recv_size);
 
 /* my_connect and wrapper macros */
 #define my_tcp_connect(addr, port, s) np_net_connect(addr, port, s, 
IPPROTO_TCP)
 #define my_udp_connect(addr, port, s) np_net_connect(addr, port, s, 
IPPROTO_UDP)
-int np_net_connect(const char *address, int port, int *sd, int proto);
+mp_state_enum np_net_connect(const char *host_name, int port, int 
*socketDescriptor, int proto);
 
 /* send_request and wrapper macros */
 #define send_tcp_request(s, sbuf, rbuf, rsize) send_request(s, IPPROTO_TCP, 
sbuf, rbuf, rsize)
 #define send_udp_request(s, sbuf, rbuf, rsize) send_request(s, IPPROTO_UDP, 
sbuf, rbuf, rsize)
-int send_request(int sd, int proto, const char *send_buffer, char 
*recv_buffer, int recv_size);
+mp_state_enum send_request(int socket, int proto, const char *send_buffer, 
char *recv_buffer,
+                                                  int recv_size);
 
 /* "is_*" wrapper macros and functions */
 bool is_host(const char *);
 bool is_addr(const char *);
-int dns_lookup(const char *, struct sockaddr_storage *, int);
+bool dns_lookup(const char *, struct sockaddr_storage *, int);
 void host_or_die(const char *str);
 #define resolve_host_or_addr(addr, family) dns_lookup(addr, NULL, family)
 #define is_inet_addr(addr)                 resolve_host_or_addr(addr, AF_INET)
@@ -86,8 +86,8 @@ void host_or_die(const char *str);
 #endif
 
 extern unsigned int socket_timeout;
-extern unsigned int socket_timeout_state;
-extern int econn_refuse_state;
+extern mp_state_enum socket_timeout_state;
+extern mp_state_enum econn_refuse_state;
 extern bool was_refused;
 extern int address_family;
 
@@ -106,12 +106,12 @@ void socket_timeout_alarm_handler(int) 
__attribute__((noreturn));
 #      define MP_TLSv1_1_OR_NEWER 9
 #      define MP_TLSv1_2_OR_NEWER 10
 /* maybe this could be merged with the above np_net_connect, via some flags */
-int np_net_ssl_init(int sd);
-int np_net_ssl_init_with_hostname(int sd, char *host_name);
-int np_net_ssl_init_with_hostname_and_version(int sd, char *host_name, int 
version);
-int np_net_ssl_init_with_hostname_version_and_cert(int sd, char *host_name, 
int version, char *cert,
-                                                                               
                   char *privkey);
-void np_net_ssl_cleanup();
+int np_net_ssl_init(int socket);
+int np_net_ssl_init_with_hostname(int socket, char *host_name);
+int np_net_ssl_init_with_hostname_and_version(int socket, char *host_name, int 
version);
+int np_net_ssl_init_with_hostname_version_and_cert(int socket, char 
*host_name, int version,
+                                                                               
                   char *cert, char *privkey);
+void np_net_ssl_cleanup(void);
 int np_net_ssl_write(const void *buf, int num);
 int np_net_ssl_read(void *buf, int num);
 mp_state_enum np_net_ssl_check_cert(int days_till_exp_warn, int 
days_till_exp_crit);

Reply via email to