Code

Fix --local argument handling (Jan Wagner #1878971)
[nagiosplug.git] / plugins / check_disk.c
index c9c9adc5b38e03d47b4b6c09fa8f6725b31e2bd2..44c154fce085a9a8e326cc295d274ed375cf7d01 100644 (file)
@@ -1,32 +1,30 @@
-/******************************************************************************
-*
+/*****************************************************************************
+* 
 * Nagios check_disk plugin
-*
+* 
 * License: GPL
-* Copyright (c) 1999-2006 nagios-plugins team
-*
+* Copyright (c) 1999-2008 Nagios Plugins Development Team
+* 
 * Last Modified: $Date$
-*
+* 
 * Description:
-*
+* 
 * This file contains the check_disk plugin
-*
-* License Information:
-*
-* This program is free software; you can redistribute it and/or modify
+* 
+* 
+* This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
+* the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
-*
+* 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
-*
+* 
 * You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*
+* along with this program.  If not, see <http://www.gnu.org/licenses/>.
+* 
 * $Id$
 * 
 *****************************************************************************/
@@ -34,7 +32,7 @@
 const char *progname = "check_disk";
 const char *program_name = "check_disk";  /* Required for coreutils libs */
 const char *revision = "$Revision$";
-const char *copyright = "1999-2006";
+const char *copyright = "1999-2008";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
 
 
@@ -265,13 +263,14 @@ main (int argc, char **argv)
                                 (fsp.fsu_blocks + tmpfsp.fsu_blocks);  /* Size of a block.  */
             fsp.fsu_blocks    += tmpfsp.fsu_blocks;     /* Total blocks. */
             fsp.fsu_bfree     += tmpfsp.fsu_bfree;      /* Free blocks available to superuser. */
-            fsp.fsu_bavail    += tmpfsp.fsu_bavail;     /* Free blocks available to non-superuser. */
+            /* Gnulib workaround - see comment about it a few lines below */
+            fsp.fsu_bavail    += (tmpfsp.fsu_bavail > tmpfsp.fsu_bfree ? 0 : tmpfsp.fsu_bavail); /* Free blocks available to non-superuser. */
             fsp.fsu_files     += tmpfsp.fsu_files;      /* Total file nodes. */
             fsp.fsu_ffree     += tmpfsp.fsu_ffree;      /* Free file nodes. */
             
             if (verbose > 3)
               printf("Group %s: add %llu blocks (%s) \n", path->group, tmpfsp.fsu_bavail, temp_list->name);
-             /* printf("Group %s: add %u blocks (%s)\n", temp_list->name); // path->group, tmpfsp.fsu_bavail, temp_list->name); */
+             /* printf("Group %s: add %u blocks (%s)\n", temp_list->name); *//* path->group, tmpfsp.fsu_bavail, temp_list->name); */
 
             np_add_name(&seen, temp_list->best_match->me_mountdir);
           }
@@ -307,10 +306,17 @@ main (int argc, char **argv)
 
     if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
       total = fsp.fsu_blocks;
-      available = fsp.fsu_bavail;
+      /* 2007-12-08 - Workaround for Gnulib reporting insanely high available
+       * space on BSD (the actual value should be negative but fsp.fsu_bavail
+       * is unsigned) */
+      available = fsp.fsu_bavail > fsp.fsu_bfree ? 0 : fsp.fsu_bavail;
       available_to_root = fsp.fsu_bfree;
       used = total - available_to_root;
 
+      if (verbose >= 3)
+        printf ("For %s, total=%llu, available=%llu, available_to_root=%llu, used=%llu, fsp.fsu_files=%llu, fsp.fsu_ffree=%llu\n",
+        me->me_mountdir, total, available, available_to_root, used, fsp.fsu_files, fsp.fsu_ffree);
+
       dused_pct = calculate_percent( used, used + available ); /* used + available can never be > uintmax */
      
       dfree_pct = 100 - dused_pct;
@@ -379,10 +385,10 @@ main (int argc, char **argv)
       asprintf (&perf, "%s %s", perf,
                 perfdata ((!strcmp(me->me_mountdir, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
                           dused_units, units,
-                         (warning_high_tide != UINT_MAX ? TRUE : FALSE), warning_high_tide,
-                         (critical_high_tide != UINT_MAX ? TRUE : FALSE), critical_high_tide,
-                         TRUE, 0,
-                         TRUE, dtotal_units));
+                          (warning_high_tide != UINT_MAX ? TRUE : FALSE), warning_high_tide,
+                          (critical_high_tide != UINT_MAX ? TRUE : FALSE), critical_high_tide,
+                          TRUE, 0,
+                          TRUE, dtotal_units));
 
       if (disk_result==STATE_OK && erronly && !verbose)
         continue;
@@ -468,8 +474,6 @@ process_arguments (int argc, char **argv)
     {"iwarning", required_argument, 0, 'W'},
     /* Dang, -C is taken. We might want to reshuffle this. */
     {"icritical", required_argument, 0, 'K'},
-    {"local", required_argument, 0, 'l'},
-    {"stat-remote-fs", required_argument, 0, 'L'},
     {"kilobytes", required_argument, 0, 'k'},
     {"megabytes", required_argument, 0, 'm'},
     {"units", required_argument, 0, 'u'},
@@ -486,6 +490,8 @@ process_arguments (int argc, char **argv)
     {"ignore-ereg-partition", required_argument, 0, 'i'},
     {"ignore-eregi-path", required_argument, 0, 'I'},
     {"ignore-eregi-partition", required_argument, 0, 'I'},
+    {"local", no_argument, 0, 'l'},
+    {"stat-remote-fs", no_argument, 0, 'L'},
     {"mountpoint", no_argument, 0, 'M'},
     {"errors-only", no_argument, 0, 'e'},
     {"exact-match", no_argument, 0, 'E'},
@@ -533,7 +539,7 @@ process_arguments (int argc, char **argv)
         }
       } else {
         if (*optarg == '@') {
-         warn_freespace_units = optarg;
+          warn_freespace_units = optarg;
         } else {
           asprintf(&warn_freespace_units, "@%s", optarg);
         }
@@ -679,10 +685,10 @@ process_arguments (int argc, char **argv)
           if (np_regex_match_mount_entry(temp_list->best_match, &re)) {
         
               if (verbose >=3)
-               printf("ignoring %s matching regex\n", temp_list->name);
+                printf("ignoring %s matching regex\n", temp_list->name);
 
               temp_list = np_del_parameter(temp_list, previous);
-              /* pointer to first element needs to be uüdated if first item gets deleted */
+              /* pointer to first element needs to be updated if first item gets deleted */
               if (previous == NULL)
                 path_select_list = temp_list;
           } else {
@@ -822,11 +828,17 @@ print_path (const char *mypath)
 void
 set_all_thresholds (struct parameter_list *path) 
 {
+    if (path->freespace_units != NULL) free(path->freespace_units);
     set_thresholds(&path->freespace_units, warn_freespace_units, crit_freespace_units);
+    if (path->freespace_percent != NULL) free (path->freespace_percent);
     set_thresholds(&path->freespace_percent, warn_freespace_percent, crit_freespace_percent);
+    if (path->usedspace_units != NULL) free (path->usedspace_units);
     set_thresholds(&path->usedspace_units, warn_usedspace_units, crit_usedspace_units);
+    if (path->usedspace_percent != NULL) free (path->usedspace_percent);
     set_thresholds(&path->usedspace_percent, warn_usedspace_percent, crit_usedspace_percent);
+    if (path->usedinodes_percent != NULL) free (path->usedinodes_percent);
     set_thresholds(&path->usedinodes_percent, warn_usedinodes_percent, crit_usedinodes_percent);
+    if (path->freeinodes_percent != NULL) free (path->freeinodes_percent);
     set_thresholds(&path->freeinodes_percent, warn_freeinodes_percent, crit_freeinodes_percent);
 }