Code

Update to using coreutils 5.2.1 libraries and snprintf.c from samba 3.0.8
[nagiosplug.git] / plugins / check_disk.c
index 7974d1415dd2e26ddb792315a3170f6ffaf12439..7841c14b755746404d7e027eefd2c0573405f5bb 100644 (file)
@@ -17,6 +17,7 @@
 *****************************************************************************/
 
 const char *progname = "check_disk";
+const char *program_name = "check_disk";       // Required for coreutils libs
 const char *revision = "$Revision$";
 const char *copyright = "1999-2003";
 const char *email = "nagiosplug-devel@lists.sourceforge.net";
@@ -142,14 +143,21 @@ main (int argc, char **argv)
        char file_system[MAX_INPUT_BUFFER];
        char *output;
        char *details;
+       char *perf;
+       uintmax_t psize;
        float free_space, free_space_pct, total_space;
 
        struct mount_entry *me;
        struct fs_usage fsp;
        struct name_list *temp_list;
 
-       output = strdup ("");
+       output = strdup (" - free space:");
        details = strdup ("");
+       perf = strdup ("");
+
+       setlocale (LC_ALL, "");
+       bindtextdomain (PACKAGE, LOCALEDIR);
+       textdomain (PACKAGE);
 
        mount_list = read_filesystem_list (0);
 
@@ -179,8 +187,16 @@ main (int argc, char **argv)
 
                if (fsp.fsu_blocks && strcmp ("none", me->me_mountdir)) {
                        usp = (double)(fsp.fsu_blocks - fsp.fsu_bavail) * 100 / fsp.fsu_blocks;
-                       disk_result = check_disk (usp, fsp.fsu_bavail);
+                       disk_result = check_disk (usp, fsp.fsu_bavail * fsp.fsu_blocksize);
                        result = max_state (disk_result, result);
+                       psize = fsp.fsu_blocks*fsp.fsu_blocksize/mult;
+                       asprintf (&perf, "%s %s", perf,
+                                 perfdata ((!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
+                                           psize-(fsp.fsu_bavail*fsp.fsu_blocksize/mult), units,
+                                           TRUE, min ((uintmax_t)psize-(uintmax_t)w_df, (uintmax_t)((1.0-w_dfp/100.0)*psize)),
+                                           TRUE, min ((uintmax_t)psize-(uintmax_t)c_df, (uintmax_t)((1.0-c_dfp/100.0)*psize)),
+                                           TRUE, 0,
+                                           TRUE, psize));
                        if (disk_result==STATE_OK && erronly && !verbose)
                                continue;
 
@@ -188,12 +204,12 @@ main (int argc, char **argv)
                        free_space_pct = (float)fsp.fsu_bavail*100/fsp.fsu_blocks;
                        total_space = (float)fsp.fsu_blocks*fsp.fsu_blocksize/mult;
                        if (disk_result!=STATE_OK || verbose>=0)
-                               asprintf (&output, ("%s [%.0f %s (%.0f%%) free on %s]"),
+                               asprintf (&output, ("%s %s %.0f %s (%.0f%%);"),
                                          output,
+                                         (!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir,
                                          free_space,
                                          units,
-                                         free_space_pct,
-                                         (!strcmp(file_system, "none") || display_mntp) ? me->me_devname : me->me_mountdir);
+                                                                       free_space_pct);
                        asprintf (&details, _("%s\n\
 %.0f of %.0f %s (%.0f%%) free on %s (type %s mounted on %s) warn:%lu crit:%lu warn%%:%.0f%% crit%%:%.0f%%"),
                                  details, free_space, total_space, units, free_space_pct,
@@ -203,6 +219,8 @@ main (int argc, char **argv)
 
        }
 
+       asprintf (&output, "%s|%s", output, perf);
+
        if (verbose > 2)
                asprintf (&output, "%s%s", output, details);
 
@@ -216,8 +234,8 @@ main (int argc, char **argv)
                temp_list = temp_list->name_next;
        }
 
-       die (result, "DISK %s%s%s\n", state_text (result), output, details);
-       return STATE_UNKNOWN;
+       printf ("DISK %s%s\n", state_text (result), output);
+       return result;
 }
 
 
@@ -237,8 +255,8 @@ process_arguments (int argc, char **argv)
 
        unsigned long l;
 
-       int option_index = 0;
-       static struct option long_options[] = {
+       int option = 0;
+       static struct option longopts[] = {
                {"timeout", required_argument, 0, 't'},
                {"warning", required_argument, 0, 'w'},
                {"critical", required_argument, 0, 'c'},
@@ -274,7 +292,7 @@ process_arguments (int argc, char **argv)
                        strcpy (argv[c], "-t");
 
        while (1) {
-               c = getopt_long (argc, argv, "+?VqhveCt:c:w:u:p:x:X:mklM", long_options, &option_index);
+               c = getopt_long (argc, argv, "+?VqhveCt:c:w:u:p:x:X:mklM", longopts, &option);
 
                if (c == -1 || c == EOF)
                        break;
@@ -356,14 +374,14 @@ process_arguments (int argc, char **argv)
                        mult = 1024 * 1024;
                        if (units)
                                free(units);
-                       units = strdup ("kB");
+                       units = strdup ("MB");
                        break;
                case 'l':
                        show_local_fs = 1;                      
                        break;
                case 'p':                                                                       /* select path */
                        se = (struct name_list *) malloc (sizeof (struct name_list));
-                       se->name = strdup (optarg);
+                       se->name = optarg;
                        se->name_next = NULL;
                        se->w_df = w_df;
                        se->c_df = c_df;
@@ -374,15 +392,23 @@ process_arguments (int argc, char **argv)
                        break;
                case 'x':                                                                       /* exclude path or partition */
                        se = (struct name_list *) malloc (sizeof (struct name_list));
-                       se->name = strdup (optarg);
+                       se->name = optarg;
                        se->name_next = NULL;
+                       se->w_df = 0;
+                       se->c_df = 0;
+                       se->w_dfp = -1.0;
+                       se->c_dfp = -1.0;
                        *dptail = se;
                        dptail = &se->name_next;
                        break;
                case 'X':                                                                       /* exclude file system type */
                        se = (struct name_list *) malloc (sizeof (struct name_list));
-                       se->name = strdup (optarg);
+                       se->name = optarg;
                        se->name_next = NULL;
+                       se->w_df = 0;
+                       se->c_df = 0;
+                       se->w_dfp = -1.0;
+                       se->c_dfp = -1.0;
                        *fstail = se;
                        fstail = &se->name_next;
                        break;
@@ -503,11 +529,11 @@ check_disk (double usp, uintmax_t free_disk)
 {
        int result = STATE_UNKNOWN;
        /* check the percent used space against thresholds */
-       if (usp >= 0.0 && usp >= (100.0 - c_dfp))
+       if (usp >= 0.0 && c_dfp >=0.0 && usp >= (100.0 - c_dfp))
                result = STATE_CRITICAL;
        else if (c_df > 0 && free_disk <= c_df)
                result = STATE_CRITICAL;
-       else if (usp >= 0.0 && usp >= (100.0 - w_dfp))
+       else if (usp >= 0.0 && w_dfp >=0.0 && usp >= (100.0 - w_dfp))
                result = STATE_WARNING;
        else if (w_df > 0 && free_disk <= w_df)
                result = STATE_WARNING;