X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_procs.c;h=ceaff958f74b8ad56589d53a1f8481a176470a1a;hb=11b35b92e3195d230bef359f6a0679ae4414716b;hp=3849c77666c87db12c3c2e9ac2dca41bc7ab184a;hpb=0c3386274ef5002dffc20337ef02407f24d7400c;p=nagiosplug.git diff --git a/plugins/check_procs.c b/plugins/check_procs.c index 3849c77..ceaff95 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c @@ -34,7 +34,7 @@ * ******************************************************************************/ -const char *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); } } @@ -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,20 +282,14 @@ process_arguments (int argc, char **argv) {"verbose", no_argument, 0, 'v'}, {0, 0, 0, 0} }; -#endif - - asprintf (&fmt, ""); 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; @@ -351,7 +354,7 @@ process_arguments (int argc, char **argv) } 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; } @@ -387,7 +390,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;