Code

Added argc checks before attempting to access argv[]
[nagiosplug.git] / plugins / utils.c
index bf1d20479d034c3ee979d5ad386ec2877de11e17..aaa9fe5ab7c74bdb4f9b703b4a892097b3e46e24 100644 (file)
 #include <limits.h>
 
 extern int timeout_interval;
 #include <limits.h>
 
 extern int timeout_interval;
+extern const char *progname;
 
 
-char *my_basename (char *);
 void support (void);
 char *clean_revstring (const char *);
 void support (void);
 char *clean_revstring (const char *);
-void print_revision (char *, const char *);
+void print_revision (const char *, const char *);
 void terminate (int, const char *fmt, ...);
 RETSIGTYPE timeout_alarm_handler (int);
 
 void terminate (int, const char *fmt, ...);
 RETSIGTYPE timeout_alarm_handler (int);
 
@@ -48,9 +48,8 @@ double delta_time (struct timeval tv);
 
 void strip (char *);
 char *strscpy (char *dest, const char *src);
 
 void strip (char *);
 char *strscpy (char *dest, const char *src);
-char *strscat (char *dest, const char *src);
+char *strscat (char *dest, char *src);
 char *strnl (char *str);
 char *strnl (char *str);
-char *ssprintf (char *str, const char *fmt, ...);
 char *strpcpy (char *dest, const char *src, const char *str);
 char *strpcat (char *dest, const char *src, const char *str);
 
 char *strpcpy (char *dest, const char *src, const char *str);
 char *strpcat (char *dest, const char *src, const char *str);
 
@@ -58,53 +57,53 @@ char *strpcat (char *dest, const char *src, const char *str);
 #define STRLEN 64
 #define TXTBLK 128
 
 #define STRLEN 64
 #define TXTBLK 128
 
-#define max(a,b) ((a)>(b))?(a):(b)
-
 /* **************************************************************************
 /* **************************************************************************
- * max_state(result, STATE_x)
- * compares STATE_x to result and returns result if STATE_x is less than a based on the following
+ * max_state(STATE_x, STATE_y)
+ * compares STATE_x to  STATE_y and returns result based on the following
  * STATE_UNKNOWN < STATE_OK < STATE_WARNING < STATE_CRITICAL
  *
  * Note that numerically the above does not hold
  ****************************************************************************/
 
  * STATE_UNKNOWN < STATE_OK < STATE_WARNING < STATE_CRITICAL
  *
  * Note that numerically the above does not hold
  ****************************************************************************/
 
+#define max(a,b) (((a)>(b))?(a):(b))
+
 int
 int
-max_state(int a, int b)
+max_state (int a, int b)
 {
 {
-       if(a == STATE_CRITICAL){
-               return a;
-       }
-       else if (a == STATE_WARNING) {
+       if (a == STATE_CRITICAL || b == STATE_CRITICAL)
+               return STATE_CRITICAL;
+       else if (a == STATE_WARNING || b == STATE_WARNING)
+               return STATE_WARNING;
+       else if (a == STATE_OK || b == STATE_OK)
+               return STATE_OK;
+       else if (a == STATE_UNKNOWN || b == STATE_UNKNOWN)
+               return STATE_UNKNOWN;
+       else if (a == STATE_DEPENDENT || b == STATE_DEPENDENT)
+               return STATE_DEPENDENT;
+       else
+               return max (a, b);
+}
 
 
-               if (b == STATE_CRITICAL){
-                       return b;
-               }else {
-                       return a;
-               }
-       } 
-       else if (a == STATE_OK) {
-               
-               if ( b== STATE_CRITICAL || b == STATE_WARNING) {
-                       return b;
-               }else{
-                       return a;
-               }
-       }
-       else {
-               /* a == UNKNOWN */
-               return b;
-       }
-               
+void usage (char *msg)
+{
+       printf (msg);
+       print_usage ();
+       exit (STATE_UNKNOWN);
+}
 
 
+void usage2(char *msg, char *arg)
+{
+       printf ("%s: %s - %s\n",progname,msg,arg);
+       print_usage ();
+       exit (STATE_UNKNOWN);
 }
 
 }
 
-char *
-my_basename (char *path)
+void
+usage3 (char *msg, char arg)
 {
 {
-       if (!strstr (path, "/"))
-               return path;
-       else
-               return 1 + strrchr (path, '/');
+       printf ("%s: %s - %c\n", progname, msg, arg);
+       print_usage();
+       exit (STATE_UNKNOWN);
 }
 
 
 }
 
 
@@ -129,14 +128,14 @@ clean_revstring (const char *revstring)
 }
 
 void
 }
 
 void
-print_revision (char *command_name, const char *revision_string)
+print_revision (const char *command_name, const char *revision_string)
 {
        char plugin_revision[STRLEN];
 
        if (sscanf (revision_string, "$Revision: %[0-9.]", plugin_revision) != 1)
                strncpy (plugin_revision, "N/A", STRLEN);
        printf ("%s (nagios-plugins %s) %s\n",
 {
        char plugin_revision[STRLEN];
 
        if (sscanf (revision_string, "$Revision: %[0-9.]", plugin_revision) != 1)
                strncpy (plugin_revision, "N/A", STRLEN);
        printf ("%s (nagios-plugins %s) %s\n",
-                                       my_basename (command_name), VERSION, plugin_revision);
+                                       progname, VERSION, plugin_revision);
        printf
                ("The nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\n"
                 "copies of the plugins under the terms of the GNU General Public License.\n"
        printf
                ("The nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute\n"
                 "copies of the plugins under the terms of the GNU General Public License.\n"
@@ -179,6 +178,9 @@ is_dotted_quad (char *address)
        int o1, o2, o3, o4;
        char c[1];
 
        int o1, o2, o3, o4;
        char c[1];
 
+       if (!address)
+               return FALSE;
+
        if (sscanf (address, "%d.%d.%d.%d%c", &o1, &o2, &o3, &o4, c) != 4)
                return FALSE;
        else if (o1 > 255 || o2 > 255 || o3 > 255 || o4 > 255)
        if (sscanf (address, "%d.%d.%d.%d%c", &o1, &o2, &o3, &o4, c) != 4)
                return FALSE;
        else if (o1 > 255 || o2 > 255 || o3 > 255 || o4 > 255)
@@ -199,18 +201,18 @@ is_dotted_quad (char *address)
 int
 is_hostname (char *s1)
 {
 int
 is_hostname (char *s1)
 {
-       if (strlen (s1) > 63)
+       if (!s1 || strlen (s1) > 63) {
                return FALSE;
                return FALSE;
-       if (strcspn
-                       (s1,
-                        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUWVXYZ0123456789-.") !=
-                       0) return FALSE;
-       if (strspn (s1, "0123456789-.") == 1)
+       }
+       if (strcspn (s1, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUWVXYZ0123456789-.") != 0) {
                return FALSE;
                return FALSE;
+       }
+       if (strspn (s1, "0123456789-.") == 1) {
+               return FALSE;
+       }
        while ((s1 = index (s1, '.'))) {
                s1++;
                if (strspn (s1, "0123456789-.") == 1) {
        while ((s1 = index (s1, '.'))) {
                s1++;
                if (strspn (s1, "0123456789-.") == 1) {
-                       printf ("%s\n", s1);
                        return FALSE;
                }
        }
                        return FALSE;
                }
        }
@@ -222,33 +224,40 @@ is_numeric (char *number)
 {
        char tmp[1];
        float x;
 {
        char tmp[1];
        float x;
-       if (sscanf (number, "%f%c", &x, tmp) == 1)
-               return (TRUE);
-       return (FALSE);
+
+       if (!number)
+               return FALSE;
+       else if (sscanf (number, "%f%c", &x, tmp) == 1)
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_positive (char *number)
 {
        if (is_numeric (number) && atof (number) > 0.0)
 }
 
 int
 is_positive (char *number)
 {
        if (is_numeric (number) && atof (number) > 0.0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_negative (char *number)
 {
        if (is_numeric (number) && atof (number) < 0.0)
 }
 
 int
 is_negative (char *number)
 {
        if (is_numeric (number) && atof (number) < 0.0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_nonnegative (char *number)
 {
        if (is_numeric (number) && atof (number) >= 0.0)
 }
 
 int
 is_nonnegative (char *number)
 {
        if (is_numeric (number) && atof (number) >= 0.0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 }
 
 int
@@ -256,8 +265,9 @@ is_percentage (char *number)
 {
        int x;
        if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100)
 {
        int x;
        if (is_numeric (number) && (x = atof (number)) >= 0 && x <= 100)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 }
 
 int
@@ -265,37 +275,42 @@ is_integer (char *number)
 {
        long int n;
 
 {
        long int n;
 
-       if (strspn (number, "-0123456789 ") != strlen (number))
-               return (FALSE);
+       if (!number || (strspn (number, "-0123456789 ") != strlen (number)))
+               return FALSE;
 
        n = strtol (number, NULL, 10);
 
        n = strtol (number, NULL, 10);
+
        if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX)
        if (errno != ERANGE && n >= INT_MIN && n <= INT_MAX)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_intpos (char *number)
 {
        if (is_integer (number) && atoi (number) > 0)
 }
 
 int
 is_intpos (char *number)
 {
        if (is_integer (number) && atoi (number) > 0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_intneg (char *number)
 {
        if (is_integer (number) && atoi (number) < 0)
 }
 
 int
 is_intneg (char *number)
 {
        if (is_integer (number) && atoi (number) < 0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_intnonneg (char *number)
 {
        if (is_integer (number) && atoi (number) >= 0)
 }
 
 int
 is_intnonneg (char *number)
 {
        if (is_integer (number) && atoi (number) >= 0)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 }
 
 int
@@ -303,21 +318,25 @@ is_intpercent (char *number)
 {
        int i;
        if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100)
 {
        int i;
        if (is_integer (number) && (i = atoi (number)) >= 0 && i <= 100)
-               return (TRUE);
-       return (FALSE);
+               return TRUE;
+       else
+               return FALSE;
 }
 
 int
 is_option (char *str)
 {
 }
 
 int
 is_option (char *str)
 {
-       if (strspn (str, "-") == 1 || strspn (str, "-") == 2)
+       if (!str)
+               return FALSE;
+       else if (strspn (str, "-") == 1 || strspn (str, "-") == 2)
                return TRUE;
                return TRUE;
-       return FALSE;
+       else
+               return FALSE;
 }
 
 
 
 }
 
 
 
-#ifndef HAVE_GETTIMEOFDAY
+#ifdef NEED_GETTIMEOFDAY
 int
 gettimeofday (struct timeval *tv, struct timezone *tz)
 {
 int
 gettimeofday (struct timeval *tv, struct timezone *tz)
 {
@@ -407,7 +426,7 @@ strscpy (char *dest, const char *src)
  *****************************************************************************/
 
 char *
  *****************************************************************************/
 
 char *
-strscat (char *dest, const char *src)
+strscat (char *dest, char *src)
 {
 
        if (dest == NULL)
 {
 
        if (dest == NULL)
@@ -494,72 +513,6 @@ strnl (char *str)
 
 
 
 
 
 
-/******************************************************************************
- *
- * Does a formatted print to a string variable
- *
- * Given a pointer destination string, which may or may not already
- * hold some text, and a source string with additional text (possibly
- * NULL or empty), returns a pointer to a string that cntains the
- * results of the specified formatted print
- *
- * Example:
- *
- * char *str=NULL;
- * str = ssprintf(str,"%d %s",1,"string");
- *
- *****************************************************************************/
-
-char *
-ssprintf (char *ptr, const char *fmt, ...)
-{
-       va_list ap;
-       int nchars;
-       size_t size;
-       char *str = NULL;
-
-       if (str == NULL) {
-               str = malloc (TXTBLK);
-               if (str == NULL)
-                       terminate (STATE_UNKNOWN, "malloc failed in ssprintf");
-               size = TXTBLK;
-       }
-       else
-               size = max (strlen (str), TXTBLK);
-
-       va_start (ap, fmt);
-
-       while (1) {
-
-               nchars = vsnprintf (str, size, fmt, ap);
-
-               if (nchars > -1)
-                       if (nchars < (int) size) {
-                               va_end (ap);
-                               str[nchars] = '\0';
-                               if (ptr)
-                                       free (ptr);
-                               return str;
-                       }
-                       else {
-                               size = (size_t) (nchars + 1);
-                       }
-
-               else
-                       size *= 2;
-
-               str = realloc (str, size);
-
-               if (str == NULL)
-                       terminate (STATE_UNKNOWN, "realloc failed in ssprintf");
-       }
-
-}
-
-
-
-
-
 /******************************************************************************
  *
  * Like strscpy, except only the portion of the source string up to
 /******************************************************************************
  *
  * Like strscpy, except only the portion of the source string up to