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");