Code

Fix Debian bug #478906: Failure when run via ePN
[nagiosplug.git] / plugins / check_snmp.c
index 9096cdadcadaad29ffc7574cfb706ad61963d670..fdb5819e05d443e5a71accbe5625e843b63b5989 100644 (file)
@@ -117,7 +117,7 @@ int needmibs = FALSE;
 int
 main (int argc, char **argv)
 {
-       int i;
+       int i, len;
        int iresult = STATE_UNKNOWN;
        int result = STATE_UNKNOWN;
        int return_code = 0;
@@ -186,7 +186,7 @@ main (int argc, char **argv)
        }else{
                snmpcmd = strdup (PATH_TO_SNMPGET);
        }
-       
+
        /* 9 arguments to pass before authpriv options + 1 for host and numoids. Add one for terminating NULL */
        command_line = calloc (9 + numauthpriv + 1 + numoids + 1, sizeof (char *));
        command_line[0] = snmpcmd;
@@ -207,7 +207,7 @@ main (int argc, char **argv)
 
        /* This is just for display purposes, so it can remain a string */
        asprintf(&cl_hidden_auth, "%s -t %d -r %d -m %s -v %s %s %s:%s",
-               snmpcmd, timeout_interval, retries, miblist, proto, "[authpriv]",
+               snmpcmd, timeout_interval, retries, strlen(miblist) ? miblist : "''", proto, "[authpriv]",
                server_address, port);
 
        for (i = 0; i < numoids; i++) {
@@ -255,15 +255,17 @@ main (int argc, char **argv)
                ptr = chld_out.line[i];
                oidname = strpcpy (oidname, ptr, delimiter);
                response = strstr (ptr, delimiter);
+               if (response == NULL)
+                       break;
+
                if (verbose > 2) {
-                       printf("Processing line %i\n  line: %s\n  oidname: %s\n  response: %s\n", i+1, ptr, oidname, response);
+                       printf("Processing line %i\n  oidname: %s\n  response: %s\n", i+1, oidname, response);
                }
 
-               /* We strip out the datatype indicator for PHBs */
-
                /* Clean up type array - Sol10 does not necessarily zero it out */
                bzero(type, sizeof(type));
 
+               /* We strip out the datatype indicator for PHBs */
                if (strstr (response, "Gauge: "))
                        show = strstr (response, "Gauge: ") + 7;
                else if (strstr (response, "Gauge32: "))
@@ -349,10 +351,14 @@ main (int argc, char **argv)
                if (nunits > (size_t)0 && (size_t)i < nunits && unitv[i] != NULL)
                        asprintf (&outbuff, "%s %s", outbuff, unitv[i]);
 
-               if (is_numeric(show)) {
+               /* Write perfdata with whatever can be parsed by strtod, if possible */
+               ptr = NULL;
+               strtod(show, &ptr);
+               if (ptr > show) {
                        strncat(perfstr, oidname, sizeof(perfstr)-strlen(perfstr)-1);
                        strncat(perfstr, "=", sizeof(perfstr)-strlen(perfstr)-1);
-                       strncat(perfstr, show, sizeof(perfstr)-strlen(perfstr)-1);
+                       len = sizeof(perfstr)-strlen(perfstr)-1;
+                       strncat(perfstr, show, len>ptr-show ? ptr-show : len);
 
                        if (type)
                                strncat(perfstr, type, sizeof(perfstr)-strlen(perfstr)-1);
@@ -504,7 +510,7 @@ process_arguments (int argc, char **argv)
                                         */
                                        needmibs = TRUE;
                        }
-                       oids = calloc(MAX_OIDS, sizeof (char *));
+                       if (!oids) oids = calloc(MAX_OIDS, sizeof (char *));
                        for (ptr = strtok(optarg, ", "); ptr != NULL && j < MAX_OIDS; ptr = strtok(NULL, ", "), j++) {
                                oids[j] = strdup(ptr);
                        }
@@ -647,7 +653,7 @@ validate_arguments ()
                if ( needmibs == TRUE ) {
                        miblist = strdup (DEFAULT_MIBLIST);
                }else{
-                       miblist = "''";                 /* don't read any mib files for numeric oids */
+                       miblist = "";                   /* don't read any mib files for numeric oids */
                }
        }