Module: monitoring-plugins
 Branch: master
 Commit: 5ae0a8d49559d66695f6f2591f4bbe0bb185ef73
 Author: Lorenz Kästle <12514511+rincewinds...@users.noreply.github.com>
   Date: Wed Mar 12 21:22:50 2025 +0100
    URL: 
https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=5ae0a8d4

Refactor negate

---

 plugins/Makefile.am       |  1 +
 plugins/negate.c          | 73 +++++++++++++++++++++++++++--------------------
 plugins/negate.d/config.h | 24 ++++++++++++++++
 3 files changed, 67 insertions(+), 31 deletions(-)

diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index bb3f029e..a420d23d 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -49,6 +49,7 @@ np_test_scripts = tests/test_check_swap.t
 EXTRA_DIST = t \
                         tests \
                         $(np_test_scripts) \
+                        negate.d \
                         check_swap.d \
                         check_ldap.d \
                         check_hpjd.d \
diff --git a/plugins/negate.c b/plugins/negate.c
index 6c53a1b9..08fa1470 100644
--- a/plugins/negate.c
+++ b/plugins/negate.c
@@ -29,6 +29,7 @@
  *
  *****************************************************************************/
 
+#include "states.h"
 const char *progname = "negate";
 const char *copyright = "2002-2024";
 const char *email = "devel@monitoring-plugins.org";
@@ -38,21 +39,17 @@ const char *email = "devel@monitoring-plugins.org";
 #include "common.h"
 #include "utils.h"
 #include "utils_cmd.h"
+#include "negate.d/config.h"
 
-#include <ctype.h>
+typedef struct {
+       int errorcode;
+       negate_config config;
+} negate_config_wrapper;
+static negate_config_wrapper process_arguments(int /*argc*/, char ** /*argv*/);
+static negate_config_wrapper validate_arguments(negate_config_wrapper 
/*config_wrapper*/);
 
-static const char **process_arguments(int /*argc*/, char ** /*argv*/);
-static void validate_arguments(char ** /*command_line*/);
 static void print_help(void);
 void print_usage(void);
-static bool subst_text = false;
-
-static int state[4] = {
-       STATE_OK,
-       STATE_WARNING,
-       STATE_CRITICAL,
-       STATE_UNKNOWN,
-};
 
 int main(int argc, char **argv) {
        setlocale(LC_ALL, "");
@@ -61,16 +58,24 @@ int main(int argc, char **argv) {
 
        timeout_interval = DEFAULT_TIMEOUT;
 
-       char **command_line = (char **)process_arguments(argc, argv);
+       negate_config_wrapper tmp_config = process_arguments(argc, argv);
+
+       if (tmp_config.errorcode == ERROR) {
+               die(STATE_UNKNOWN, _("negate: Failed to parse input"));
+       }
+
+       negate_config config = tmp_config.config;
+
+       char **command_line = config.command_line;
 
        /* Set signal handling and alarm */
        if (signal(SIGALRM, timeout_alarm_handler) == SIG_ERR) {
                die(STATE_UNKNOWN, _("Cannot catch SIGALRM"));
        }
 
-       (void)alarm((unsigned)timeout_interval);
+       (void)alarm(timeout_interval);
 
-       int result = STATE_UNKNOWN;
+       mp_state_enum result = STATE_UNKNOWN;
        output chld_out;
        output chld_err;
 
@@ -93,34 +98,38 @@ int main(int argc, char **argv) {
 
        char *sub;
        for (size_t i = 0; i < chld_out.lines; i++) {
-               if (subst_text && result >= 0 && result <= 4 && result != 
state[result]) {
+               if (config.subst_text && result >= 0 && result <= 4 && result 
!= config.state[result]) {
                        /* Loop over each match found */
                        while ((sub = strstr(chld_out.line[i], 
state_text(result)))) {
                                /* Terminate the first part and skip over the 
string we'll substitute */
                                *sub = '\0';
                                sub += strlen(state_text(result));
                                /* then put everything back together */
-                               xasprintf(&chld_out.line[i], "%s%s%s", 
chld_out.line[i], state_text(state[result]), sub);
+                               xasprintf(&chld_out.line[i], "%s%s%s", 
chld_out.line[i], state_text(config.state[result]), sub);
                        }
                }
                printf("%s\n", chld_out.line[i]);
        }
 
        if (result >= 0 && result <= 4) {
-               exit(state[result]);
+               exit(config.state[result]);
        } else {
                exit(result);
        }
 }
 
 /* process command-line arguments */
-static const char **process_arguments(int argc, char **argv) {
+static negate_config_wrapper process_arguments(int argc, char **argv) {
        static struct option longopts[] = {{"help", no_argument, 0, 'h'},       
    {"version", no_argument, 0, 'V'},
                                                                           
{"timeout", required_argument, 0, 't'},  {"timeout-result", required_argument, 
0, 'T'},
                                                                           
{"ok", required_argument, 0, 'o'},       {"warning", required_argument, 0, 'w'},
                                                                           
{"critical", required_argument, 0, 'c'}, {"unknown", required_argument, 0, 'u'},
                                                                           
{"substitute", no_argument, 0, 's'},     {0, 0, 0, 0}};
 
+       negate_config_wrapper result = {
+               .errorcode = OK,
+               .config = negate_config_init(),
+       };
        bool permute = true;
        while (true) {
                int option = 0;
@@ -154,54 +163,56 @@ static const char **process_arguments(int argc, char 
**argv) {
                        }
                        break;
                case 'o': /* replacement for OK */
-                       if ((state[STATE_OK] = mp_translate_state(optarg)) == 
ERROR) {
+                       if ((result.config.state[STATE_OK] = 
mp_translate_state(optarg)) == ERROR) {
                                usage4(_("Ok must be a valid state name (OK, 
WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
                        }
                        permute = false;
                        break;
 
                case 'w': /* replacement for WARNING */
-                       if ((state[STATE_WARNING] = mp_translate_state(optarg)) 
== ERROR) {
+                       if ((result.config.state[STATE_WARNING] = 
mp_translate_state(optarg)) == ERROR) {
                                usage4(_("Warning must be a valid state name 
(OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
                        }
                        permute = false;
                        break;
                case 'c': /* replacement for CRITICAL */
-                       if ((state[STATE_CRITICAL] = 
mp_translate_state(optarg)) == ERROR) {
+                       if ((result.config.state[STATE_CRITICAL] = 
mp_translate_state(optarg)) == ERROR) {
                                usage4(_("Critical must be a valid state name 
(OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
                        }
                        permute = false;
                        break;
                case 'u': /* replacement for UNKNOWN */
-                       if ((state[STATE_UNKNOWN] = mp_translate_state(optarg)) 
== ERROR) {
+                       if ((result.config.state[STATE_UNKNOWN] = 
mp_translate_state(optarg)) == ERROR) {
                                usage4(_("Unknown must be a valid state name 
(OK, WARNING, CRITICAL, UNKNOWN) or integer (0-3)."));
                        }
                        permute = false;
                        break;
                case 's': /* Substitute status text */
-                       subst_text = true;
+                       result.config.subst_text = true;
                        break;
                }
        }
 
-       validate_arguments(&argv[optind]);
-
        if (permute) { /* No [owcu] switch specified, default to this */
-               state[STATE_OK] = STATE_CRITICAL;
-               state[STATE_CRITICAL] = STATE_OK;
+               result.config.state[STATE_OK] = STATE_CRITICAL;
+               result.config.state[STATE_CRITICAL] = STATE_OK;
        }
 
-       return (const char **)&argv[optind];
+       result.config.command_line = &argv[optind];
+
+       return validate_arguments(result);
 }
 
-void validate_arguments(char **command_line) {
-       if (command_line[0] == NULL) {
+negate_config_wrapper validate_arguments(negate_config_wrapper config_wrapper) 
{
+       if (config_wrapper.config.command_line[0] == NULL) {
                usage4(_("Could not parse arguments"));
        }
 
-       if (strncmp(command_line[0], "/", 1) != 0 && strncmp(command_line[0], 
"./", 2) != 0) {
+       if (strncmp(config_wrapper.config.command_line[0], "/", 1) != 0 && 
strncmp(config_wrapper.config.command_line[0], "./", 2) != 0) {
                usage4(_("Require path to command"));
        }
+
+       return config_wrapper;
 }
 
 void print_help(void) {
diff --git a/plugins/negate.d/config.h b/plugins/negate.d/config.h
new file mode 100644
index 00000000..0cf30cd4
--- /dev/null
+++ b/plugins/negate.d/config.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "states.h"
+
+typedef struct {
+       mp_state_enum state[4];
+       bool subst_text;
+       char **command_line;
+} negate_config;
+
+negate_config negate_config_init() {
+       negate_config tmp = {
+               .state =
+                       {
+                               STATE_OK,
+                               STATE_WARNING,
+                               STATE_CRITICAL,
+                               STATE_UNKNOWN,
+                       },
+               .subst_text = false,
+               .command_line = NULL,
+       };
+       return tmp;
+}

Reply via email to