diff options
-rw-r--r-- | configure.in | 38 | ||||
-rw-r--r-- | plugins/check_disk.c | 61 |
2 files changed, 94 insertions, 5 deletions
diff --git a/configure.in b/configure.in index fcd5c56b..8f7f4f9a 100644 --- a/configure.in +++ b/configure.in @@ -21,9 +21,38 @@ AC_PROG_INSTALL AC_SUBST(INSTALL) AC_PROG_CC +AC_PROG_CPP +AC_PROG_GCC_TRADITIONAL +AC_PROG_RANLIB +AC_AIX +AC_MINIX + AC_PROG_MAKE_SET AC_PROG_AWK +# Check for SunOS statfs brokenness wrt partitions 2GB and larger. +# If <sys/vfs.h> exists and struct statfs has a member named f_spare, +# enable the work-around code in fsusage.c. +AC_MSG_CHECKING([for statfs that truncates block counts]) +AC_CACHE_VAL(fu_cv_sys_truncating_statfs, +[AC_TRY_COMPILE([ +#if !defined(sun) && !defined(__sun) +choke -- this is a workaround for a Sun-specific problem +#endif +#include <sys/types.h> +#include <sys/vfs.h>], +[struct statfs t; long c = *(t.f_spare);], +fu_cv_sys_truncating_statfs=yes, +fu_cv_sys_truncating_statfs=no, +)]) +if test $fu_cv_sys_truncating_statfs = yes; then + AC_DEFINE(STATFS_TRUNCATES_BLOCK_COUNTS, 1, +[ Define if the block counts reported by statfs may be truncated to 2GB + and the correct values may be stored in the f_spare array. + (SunOS 4.1.2, 4.1.3, and 4.1.3_U1 are reported to have this problem. + SunOS 4.1.1 seems not to be affected.)]) +fi + saved_srcdir=$srcdir srcdir=$srcdir/lib test -f $srcdir/getloadavg.c \ @@ -447,6 +476,15 @@ AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(signal.h strings.h string.h syslog.h unistd.h uio.h errno.h regex.h sys/types.h sys/time.h sys/socket.h sys/loadavg.h) AC_CHECK_HEADERS(stdarg.h sys/unistd.h unistd.h ctype.h stdlib.h) +AC_CHECK_HEADERS(sys/vfs.h, + [AC_TRY_COMPILE([#include <sys/vfs.h>], + [struct statfs *buf], + [AC_DEFINE(HAVE_STRUCT_STATFS,1,[Define if statfs struct can be found])])]) +AC_CHECK_HEADERS(sys/param.h sys/mount.h, + [AC_TRY_COMPILE([#include <sys/param.h> +#include <sys/mount.h>], + [struct statfs *buf], + [AC_DEFINE(HAVE_STRUCT_STATFS,1,[Define if statfs struct can be found])])]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST diff --git a/plugins/check_disk.c b/plugins/check_disk.c index 9421d060..1afc7620 100644 --- a/plugins/check_disk.c +++ b/plugins/check_disk.c @@ -36,6 +36,14 @@ #include "utils.h" #include <stdarg.h> +#ifdef _AIX + #pragma alloca +#endif + +#if HAVE_INTTYPES_H +# include <inttypes.h> +#endif + #define REVISION "$Revision$" #define COPYRIGHT "2000-2002" @@ -73,9 +81,52 @@ main (int argc, char **argv) char mntp[MAX_INPUT_BUFFER]; char *output = ""; +#ifdef HAVE_STRUCT_STATFS +#ifdef HAVE_SYS_VFS_H +#include <sys/vfs.h> +#else +#include <sys/param.h> +#include <sys/mount.h> +#endif + struct statfs buf; +#endif + if (process_arguments (argc, argv) != OK) usage ("Could not parse arguments\n"); +#ifdef HAVE_STRUCT_STATFS + + if (statfs (path, &buf) == -1) { + switch (errno) + { + case ENOTDIR: + terminate (STATE_UNKNOWN, "A component of the path prefix is not a directory.\n"); + case ENAMETOOLONG: + terminate (STATE_UNKNOWN, "path is too long.\n"); + case ENOENT: + terminate (STATE_UNKNOWN, "The file referred to by path does not exist.\n"); + case EACCES: + terminate (STATE_UNKNOWN, "Search permission is denied for a component of the path prefix of path.\n"); + case ELOOP: + terminate (STATE_UNKNOWN, "Too many symbolic links were encountered in translating path.\n"); + case EFAULT: + terminate (STATE_UNKNOWN, "Buf or path points to an invalid address.\n"); + case EIO: + terminate (STATE_UNKNOWN, "An I/O error occurred while reading from or writing to the file system.\n"); + case ENOMEM: + terminate (STATE_UNKNOWN, "Insufficient kernel memory was available.\n"); + case ENOSYS: + terminate (STATE_UNKNOWN, "The filesystem path is on does not support statfs.\n"); + } + } + usp = (buf.f_blocks - buf.f_bavail) / buf.f_blocks; + disk_result = check_disk (usp, buf.f_bavail); + result = disk_result; + asprintf (&output, "%ld of %ld kB free (%ld-byte blocks)", + buf.f_bavail*buf.f_bsize/1024, buf.f_blocks*buf.f_bsize/1024, buf.f_bsize); + +#else + asprintf (&command_line, "%s %s", DF_COMMAND, path); if (verbose>0) @@ -151,13 +202,13 @@ main (int argc, char **argv) result = STATE_WARNING; if (usp < 0) - printf ("Disk \"%s\" not mounted or nonexistant\n", path); + terminate (result, "Disk \"%s\" not mounted or nonexistant\n", path); else if (result == STATE_UNKNOWN) - printf ("Unable to read output\n%s\n%s\n", command_line, input_buffer); - else - printf ("DISK %s%s\n", state_text (result), output); + terminate (result, "Unable to read output\n%s\n%s\n", command_line, input_buffer); - return result; +#endif + + terminate (result, "DISK %s %s\n", state_text (result), output); } /* process command-line arguments */ |