Code

Spent the day working on backwards compatability using getaddrinfo()
[nagiosplug.git] / plugins / check_procs.c
index 05318b6a49a03233168d535e86528148d833d18c..ceaff958f74b8ad56589d53a1f8481a176470a1a 100644 (file)
@@ -77,6 +77,7 @@ char *prog = "";
 char *args = "";
 char *fmt = "";
 char tmp[MAX_INPUT_BUFFER];
+const char *zombie = "Z";
 
 int
 main (int argc, char **argv)
@@ -93,6 +94,7 @@ main (int argc, char **argv)
        int found = 0; /* counter for number of lines returned in `ps` output */
        int procs = 0; /* counter for number of processes meeting filter criteria */
        int pos; /* number of spaces before 'args' in `ps` output */
+       int cols; /* number of columns in ps output */
 
        int result = STATE_UNKNOWN;
 
@@ -115,14 +117,18 @@ main (int argc, char **argv)
        fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
 
        while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
-               if (
 #ifdef USE_PS_VARS
-                                sscanf (input_buffer, PS_FORMAT, PS_VARLIST) >= 4
+               cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
 #else
-                                sscanf (input_buffer, PS_FORMAT, procstat, &procuid, &procppid, &pos,
-                                                                procprog) >= 4
+               cols = sscanf (input_buffer, PS_FORMAT, procstat, &procuid, 
+                                                       &procppid, &pos, procprog);
 #endif
-                       ) {
+               /* Zombie processes do not give a procprog command */
+               if ( cols == 3 && strstr(procstat, zombie) ) {
+                       strcpy(procprog, "");
+                       cols = 4;
+               }
+               if ( cols >= 4 ) {
                        found++;
                        resultsum = 0;
                        asprintf (&procargs, "%s", input_buffer + pos);
@@ -147,6 +153,10 @@ main (int argc, char **argv)
 #endif
                        if (options == resultsum)
                                procs++;
+               } 
+               /* This should not happen */
+               else if (verbose) {
+                       printf("Not parseable: %s", input_buffer);
                }
        }
 
@@ -258,7 +268,6 @@ process_arguments (int argc, char **argv)
        int c = 1;
        char *user;
        struct passwd *pw;
-#ifdef HAVE_GETOPT_H
        int option_index = 0;
        static struct option long_options[] = {
                {"warning", required_argument, 0, 'w'},
@@ -273,18 +282,14 @@ process_arguments (int argc, char **argv)
                {"verbose", no_argument, 0, 'v'},
                {0, 0, 0, 0}
        };
-#endif
 
        for (c = 1; c < argc; c++)
                if (strcmp ("-to", argv[c]) == 0)
                        strcpy (argv[c], "-t");
 
        while (1) {
-#ifdef HAVE_GETOPT_H
-               c =     getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:", long_options, &option_index);
-#else
-               c = getopt (argc, argv, "Vvht:c:w:p:s:u:C:a:");
-#endif
+               c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:", long_options, &option_index);
+
                if (c == -1 || c == EOF)
                        break;