Code

standardize localization string
[nagiosplug.git] / plugins / check_procs.c
index 64e62dde772a81a049a7d79a90b0120561c4cdca..011661c189325717064f70b15d17f83437a86e54 100644 (file)
@@ -14,6 +14,8 @@
  along with this program; if not, write to the Free Software
  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
+ $Id$
 ******************************************************************************/
 
 const char *progname = "check_procs";
@@ -73,13 +75,12 @@ char tmp[MAX_INPUT_BUFFER];
 
 
 
-
-
-\f
 int
 main (int argc, char **argv)
 {
-       char input_buffer[MAX_INPUT_BUFFER];
+       char *input_buffer;
+       char *input_line;
+       char *procprog;
 
        int procuid = 0;
        int procppid = 0;
@@ -87,7 +88,6 @@ main (int argc, char **argv)
        int procrss = 0;
        float procpcpu = 0;
        char procstat[8];
-       char procprog[MAX_INPUT_BUFFER];
        char *procargs;
        char *temp_string;
 
@@ -109,11 +109,21 @@ main (int argc, char **argv)
        bindtextdomain (PACKAGE, LOCALEDIR);
        textdomain (PACKAGE);
 
+       input_buffer = malloc (MAX_INPUT_BUFFER);
+       procprog = malloc (MAX_INPUT_BUFFER);
+
        asprintf (&metric_name, "PROCS");
        metric = METRIC_PROCS;
 
        if (process_arguments (argc, argv) == ERROR)
-               usage (_("Unable to parse command line\n"));
+               usage (_("check_procs: could not parse arguments\n"));
+
+       /* Set signal handling and alarm timeout */
+       if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) {
+               printf (_("Cannot catch SIGALRM"));
+               return STATE_UNKNOWN;
+       }
+       alarm (timeout_interval);
 
        if (verbose >= 2)
                printf (_("CMD: %s\n"), PS_COMMAND);
@@ -128,25 +138,33 @@ main (int argc, char **argv)
        if (child_stderr == NULL)
                printf (_("Could not open stderr for %s\n"), PS_COMMAND);
 
+       /* flush first line */
        fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
+       while ( input_buffer[strlen(input_buffer)-1] != '\n' )
+               fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
 
        while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
+               asprintf (&input_line, "%s", input_buffer);
+               while ( input_buffer[strlen(input_buffer)-1] != '\n' ) {
+                       fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
+                       asprintf (&input_line, "%s%s", input_line, input_buffer);
+               }
+
+               if (verbose >= 3)
+                       printf ("%s", input_line);
+
                strcpy (procprog, "");
                asprintf (&procargs, "%s", "");
 
-               cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
+               cols = sscanf (input_line, PS_FORMAT, PS_VARLIST);
 
                /* Zombie processes do not give a procprog command */
                if ( cols == (expected_cols - 1) && strstr(procstat, zombie) ) {
                        cols = expected_cols;
-                       /* Set some value for procargs for the strip command further below 
-                       Seen to be a problem on some Solaris 7 and 8 systems */
-                       input_buffer[pos] = '\n';
-                       input_buffer[pos+1] = 0x0;
                }
                if ( cols >= expected_cols ) {
                        resultsum = 0;
-                       asprintf (&procargs, "%s", input_buffer + pos);
+                       asprintf (&procargs, "%s", input_line + pos);
                        strip (procargs);
 
                        /* Some ps return full pathname for command. This removes path */
@@ -275,9 +293,6 @@ main (int argc, char **argv)
 
 
 
-
-
-\f
 /* process command-line arguments */
 int
 process_arguments (int argc, char **argv)
@@ -317,6 +332,7 @@ process_arguments (int argc, char **argv)
 
                switch (c) {
                case '?':                                                                       /* help */
+                       printf (_("%s: Unknown argument: %s\n\n"), progname, optarg);
                        print_usage ();
                        exit (STATE_UNKNOWN);
                case 'h':                                                                       /* help */
@@ -327,7 +343,7 @@ process_arguments (int argc, char **argv)
                        exit (STATE_OK);
                case 't':                                                                       /* timeout period */
                        if (!is_integer (optarg))
-                               usage (_("Timeout Interval must be an integer!\n\n"));
+                               usage2 (_("Timeout interval must be a positive integer"), optarg);
                        else
                                timeout_interval = atoi (optarg);
                        break;
@@ -376,7 +392,7 @@ process_arguments (int argc, char **argv)
                                pw = getpwuid ((uid_t) uid);
                                /*  check to be sure user exists */
                                if (pw == NULL)
-                                       usage2 (_("UID %d was not found\n"), uid);
+                                       usage2 (_("UID %s was not found\n"), optarg);
                        }
                        else {
                                pw = getpwnam (optarg);
@@ -474,7 +490,6 @@ process_arguments (int argc, char **argv)
 
 
 
-
 int
 validate_arguments ()
 {
@@ -522,9 +537,6 @@ validate_arguments ()
 
 
 
-
-
-\f
 /* Check thresholds against value */
 int
 check_thresholds (int value)
@@ -559,16 +571,13 @@ check_thresholds (int value)
 
 
 
-
-
-\f
 void
 print_help (void)
 {
        print_revision (progname, revision);
 
-       printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>"));
-       printf (_(COPYRIGHT), copyright, email);
+       printf ("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>");
+       printf (COPYRIGHT, copyright, email);
 
        printf(_("\
 Checks all processes and generates WARNING or CRITICAL states if the specified\n\
@@ -591,7 +600,11 @@ Optional Arguments:\n\
    PROCS - number of processes (default)\n\
    VSZ  - virtual memory size\n\
    RSS  - resident set memory size\n\
-   CPU  - percentage cpu\n\
+   CPU  - percentage cpu\n"));
+
+       printf (_(UT_TIMEOUT), DEFAULT_SOCKET_TIMEOUT);
+
+       printf(_("\
  -v, --verbose\n\
    Extra information. Up to 3 verbosity levels\n"));
 
@@ -646,13 +659,16 @@ Examples:\n\
        printf (_(UT_SUPPORT));
 }
 
+
+
 void
 print_usage (void)
 {
        printf ("\
 Usage: %s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n\
   [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\
-  [-C command] [-v]\n", progname);     
+  [-C command] [-t timeout] [-v]\n", progname);        
        printf (_(UT_HLP_VRS), progname, progname);
 }
 
+