X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_procs.c;h=755ed8609814b3aefcd5dc7787bf1ea26321bc7c;hb=7ceff0d5a95f5c5f34235ef6682595f169864d2f;hp=967b4de7d00409c01c29eabb54ee04b70b694351;hpb=61bf15c0f6a584a1503752b89cb13c44508b6922;p=nagiosplug.git diff --git a/plugins/check_procs.c b/plugins/check_procs.c index 967b4de..755ed86 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c @@ -34,7 +34,7 @@ * ******************************************************************************/ -#define PROGNAME "check_snmp" +const char *progname = "check_procs"; #define REVISION "$Revision$" #define COPYRIGHT "1999-2002" #define AUTHOR "Ethan Galstad" @@ -72,11 +72,12 @@ int options = 0; /* bitmask of filter criteria to test against */ int verbose = FALSE; int uid; int ppid; -char *statopts = NULL; -char *prog = NULL; -char *args = NULL; -char *fmt = NULL; +char *statopts = ""; +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); } } @@ -275,8 +285,6 @@ process_arguments (int argc, char **argv) }; #endif - asprintf (&fmt, ""); - for (c = 1; c < argc; c++) if (strcmp ("-to", argv[c]) == 0) strcpy (argv[c], "-t"); @@ -298,12 +306,12 @@ process_arguments (int argc, char **argv) print_help (); exit (STATE_OK); case 'V': /* version */ - print_revision (PROGNAME, REVISION); + print_revision (progname, REVISION); exit (STATE_OK); case 't': /* timeout period */ if (!is_integer (optarg)) { printf ("%s: Timeout Interval must be an integer!\n\n", - my_basename (argv[0])); + progname); print_usage (); exit (STATE_UNKNOWN); } @@ -325,7 +333,7 @@ process_arguments (int argc, char **argv) } else { printf ("%s: Critical Process Count must be an integer!\n\n", - my_basename (argv[0])); + progname); print_usage (); exit (STATE_UNKNOWN); } @@ -345,18 +353,18 @@ process_arguments (int argc, char **argv) } else { printf ("%s: Warning Process Count must be an integer!\n\n", - my_basename (argv[0])); + progname); print_usage (); exit (STATE_UNKNOWN); } case 'p': /* process id */ if (sscanf (optarg, "%d%[^0-9]", &ppid, tmp) == 1) { - asprintf (&fmt, "%s%sPPID = %d", (options ? ", " : ""), ppid); + asprintf (&fmt, "%s%sPPID = %d", fmt, (options ? ", " : ""), ppid); options |= PPID; break; } printf ("%s: Parent Process ID must be an integer!\n\n", - my_basename (argv[0])); + progname); print_usage (); exit (STATE_UNKNOWN); case 's': /* status */ @@ -387,7 +395,7 @@ process_arguments (int argc, char **argv) uid = pw->pw_uid; } user = pw->pw_name; - asprintf (&fmt, "%s%sUID = %d (%s)", (options ? ", " : ""), fmt, + asprintf (&fmt, "%s%sUID = %d (%s)", fmt, (options ? ", " : ""), uid, user); options |= USER; break; @@ -462,7 +470,7 @@ if (wmax >= 0 && wmin == -1) void print_help (void) { - print_revision (PROGNAME, REVISION); + print_revision (progname, REVISION); printf ("Copyright (c) %s %s <%s>\n\n%s\n", COPYRIGHT, AUTHOR, EMAIL, SUMMARY);