diff --git a/src/modules/files/configure.in b/src/modules/files/configure.in index 65da40cf24572a02347afcd7184cba9e78f44b9c..65a6875315230a005c3427d17c40dbf55bf6e85a 100644 --- a/src/modules/files/configure.in +++ b/src/modules/files/configure.in @@ -170,8 +170,8 @@ int main() AC_MSG_RESULT(BSD style) fi - AC_MSG_CHECKING(if the struct statfs has the member f_bavail) - AC_CACHE_VAL(pike_cv_struct_statfs_f_bavail, [ + AC_MSG_CHECKING(if the struct statfs exists) + AC_CACHE_VAL(pike_cv_struct_statfs, [ AC_TRY_COMPILE([ #ifndef POSIX_SOURCE #define POSIX_SOURCE @@ -197,15 +197,89 @@ int main() #endif ], [ struct statfs st; - st.f_bavail = 0; - ], [ pike_cv_struct_statfs_f_bavail=yes - ], [ pike_cv_struct_statfs_f_bavail=no + ], [ pike_cv_struct_statfs=yes + ], [ pike_cv_struct_statfs=no ]) ]) - AC_MSG_RESULT($pike_cv_struct_statfs_f_bavail) - if test x$pike_cv_struct_statfs_f_bavail = xyes; then - AC_DEFINE(HAVE_STATFS_F_BAVAIL) - else :; fi + AC_MSG_RESULT($pike_cv_struct_statfs) + if test x$pike_cv_struct_statfs = xyes; then + AC_DEFINE(HAVE_STRUCT_STATFS) + + AC_MSG_CHECKING(if the struct statfs has the member f_bavail) + AC_CACHE_VAL(pike_cv_struct_statfs_f_bavail, [ + AC_TRY_COMPILE([ +#ifndef POSIX_SOURCE +#define POSIX_SOURCE +#endif +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif +#ifdef HAVE_SYS_SYSPROTO_H +#include <sys/sysproto.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#include <sys/stat.h> +#ifdef HAVE_SYS_VFS_H +#include <sys/vfs.h> +#endif +#ifdef HAVE_SYS_STATFS_H +#include <sys/statfs.h> +#endif +#ifdef HAVE_SYS_MOUNT_H +#include <sys/mount.h> +#endif + ], [ + struct statfs st; + st.f_bavail = 0; + ], [ pike_cv_struct_statfs_f_bavail=yes + ], [ pike_cv_struct_statfs_f_bavail=no + ]) + ]) + AC_MSG_RESULT($pike_cv_struct_statfs_f_bavail) + if test x$pike_cv_struct_statfs_f_bavail = xyes; then + AC_DEFINE(HAVE_STATFS_F_BAVAIL) + else :; fi + else + # No struct statfs. We might be running ULTRIX, + # so check for struct fs_data. + AC_MSG_CHECKING(if the struct fs_data exists) + AC_CACHE_VAL(pike_cv_struct_fs_data, [ + AC_TRY_COMPILE([ +#ifndef POSIX_SOURCE +#define POSIX_SOURCE +#endif +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif +#ifdef HAVE_SYS_SYSPROTO_H +#include <sys/sysproto.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#include <sys/stat.h> +#ifdef HAVE_SYS_VFS_H +#include <sys/vfs.h> +#endif +#ifdef HAVE_SYS_STATFS_H +#include <sys/statfs.h> +#endif +#ifdef HAVE_SYS_MOUNT_H +#include <sys/mount.h> +#endif + ], [ + struct statfs st; + ], [ pike_cv_struct_fs_data=yes + ], [ pike_cv_struct_fs_data=no + ]) + ]) + AC_MSG_RESULT($pike_cv_struct_fs_data) + if test x$pike_cv_struct_fs_data = xyes; then + AC_DEFINE(HAVE_STRUCT_FS_DATA) + else :; fi + fi else :; fi AC_MSG_CHECKING(for working (and failsafe) strerror) diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c index 07d6ecabfd241676e79fa828fa10fa01f95cf8b1..3409fd0a896d56b0c876a1e1774edc080ef8ec73 100644 --- a/src/modules/files/efuns.c +++ b/src/modules/files/efuns.c @@ -131,7 +131,17 @@ void f_filesystem_stat(INT32 args) struct statvfs st; #else /* !HAVE_STATVFS */ #ifdef HAVE_STATFS +#ifdef HAVE_STRUCT_STATFS struct statfs st; +#else /* !HAVE_STRUCT_STATFS */ +#ifdef HAVE_STRUCT_FS_DATA + /* Probably only ULTRIX has this name for the struct */ + struct fs_data st; +#else /* !HAVE_STRUCT_FS_DATA */ + /* Should not be reached */ +#error No struct to hold statfs() data. +#endif /* HAVE_STRUCT_FS_DATA */ +#endif /* HAVE_STRUCT_STATFS */ #else /* !HAVE_STATFS */ #ifdef HAVE_USTAT struct stat statbuf; @@ -200,6 +210,7 @@ void f_filesystem_stat(INT32 args) f_aggregate_mapping(9*2); #else /* !HAVE_STATVFS */ #ifdef HAVE_STATFS +#ifdef HAVE_STRUCT_STATFS push_text("blocksize"); push_int(st.f_bsize); push_text("blocks"); @@ -221,6 +232,23 @@ void f_filesystem_stat(INT32 args) #else f_aggregate_mapping(6*2); #endif /* HAVE_STATFS_F_BAVAIL */ +#else /* !HAVE_STRUCT_STATFS */ +#ifdef HAVE_STRUCT_FS_DATA + /* ULTRIX */ + push_text("blocksize"); + push_int(st.fd_bsize); + push_text("blocks"); + push_int(st.fd_btot); + push_text("bfree"); + push_int(st.fd_bfree); + push_text("bavail"); + push_int(st.fd_bfreen); + f_aggregate_mapping(4*2); +#else /* !HAVE_STRUCT_FS_DATA */ + /* Should not be reached */ +#error No struct to hold statfs() data. +#endif /* HAVE_STRUCT_FS_DATA */ +#endif /* HAVE_STRUCT_STATFS */ #else /* !HAVE_STATFS */ #ifdef HAVE_USTAT push_text("bfree");