Implement linux-style statfs and co.
authorDavid Bartley <dtbartle@glibc.(none)>
Wed, 18 Feb 2009 10:41:43 +0000 (10:41 +0000)
committerDavid Bartley <dtbartle@glibc.(none)>
Wed, 18 Feb 2009 10:41:43 +0000 (10:41 +0000)
TODO.opensolaris
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/statfs.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs64.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c [new file with mode: 0644]

index 3beb0fe..e1904ca 100644 (file)
@@ -1,9 +1,5 @@
 ABI changes:
   Add d_type to struct dirent
-  Fix f_files/f_ffree bug in struct statfs (they are always ino64_t)
-  Adjust struct statfs or remove statfs/fstatfs outright
-    Implement statfs[64] in terms of statvfs[64]
-      Use sysfs to translate fsname into fstype
 
 /usr/include/gnu/stubs-32.h
 
index c9303e2..51810dd 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2008
+/* Copyright (C) 1997, 1998, 2000, 2002, 2003, 2009
     Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
 
 struct statfs
   {
-    short int f_fstyp;
-    long int f_bsize;
-    long int f_frsize;
-    long int f_blocks;
-    long int f_bfree;
+    __SWORD_TYPE f_type;
+    __SWORD_TYPE f_bsize;
 #ifndef __USE_FILE_OFFSET64
-    __ino64_t f_files;
-    __ino64_t f_ffree;
+    __fsblkcnt_t f_blocks;
+    __fsblkcnt_t f_bfree;
+    __fsblkcnt_t f_bavail;
+    __fsfilcnt_t f_files;
+    __fsfilcnt_t f_ffree;
 #else
-    __ino64_t f_files;
-    __ino64_t f_ffree;
+    __fsblkcnt64_t f_blocks;
+    __fsblkcnt64_t f_bfree;
+    __fsblkcnt64_t f_bavail;
+    __fsfilcnt64_t f_files;
+    __fsfilcnt64_t f_ffree;
 #endif
-    char f_fname[6];
-    char f_fpack[6];
+    __UWORD_TYPE f_fsid;
+    __SWORD_TYPE f_namelen;
+    __SWORD_TYPE f_frsize;
+    __SWORD_TYPE f_spare[5];
   };
 
-/* There is no statfs64 on OpenSolaris. */
-struct statfs64;
+#ifdef __USE_LARGEFILE64
+struct statfs64
+  {
+    __SWORD_TYPE f_type;
+    __SWORD_TYPE f_bsize;
+    __fsblkcnt64_t f_blocks;
+    __fsblkcnt64_t f_bfree;
+    __fsblkcnt64_t f_bavail;
+    __fsfilcnt64_t f_files;
+    __fsfilcnt64_t f_ffree;
+    __UWORD_TYPE f_fsid;
+    __SWORD_TYPE f_namelen;
+    __SWORD_TYPE f_frsize;
+    __SWORD_TYPE f_spare[5];
+  };
+#endif
 
 /* Tell code we have these members.  */
 #define _STATFS_F_NAMELEN
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs.c
new file mode 100644 (file)
index 0000000..670f93e
--- /dev/null
@@ -0,0 +1,7 @@
+#define STATFS_FUNC __fstatfs
+#define STATFS_STRUCT struct statfs
+#define STATVFS_FUNC __fstatvfs
+#define STATVFS_STRUCT struct statvfs
+#define STATFS_ARG int
+#include "sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c"
+weak_alias (__fstatfs, fstatfs)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs64.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstatfs64.c
new file mode 100644 (file)
index 0000000..2daf84c
--- /dev/null
@@ -0,0 +1,7 @@
+#define STATFS_FUNC __fstatfs64
+#define STATFS_STRUCT struct statfs64
+#define STATVFS_FUNC __fstatvfs64
+#define STATVFS_STRUCT struct statvfs64
+#define STATFS_ARG int
+#include "sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c"
+weak_alias (__fstatfs64, fstatfs64)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs.c
new file mode 100644 (file)
index 0000000..7a9ae92
--- /dev/null
@@ -0,0 +1,8 @@
+#define STATFS_FUNC __statfs
+#define STATFS_STRUCT struct statfs
+#define STATVFS_FUNC __statvfs
+#define STATVFS_STRUCT struct statvfs
+#define STATFS_ARG const char *
+#include "sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c"
+libc_hidden_def (__statfs)
+weak_alias (__statfs, statfs)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs64.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs64.c
new file mode 100644 (file)
index 0000000..9a066b3
--- /dev/null
@@ -0,0 +1,7 @@
+#define STATFS_FUNC __statfs64
+#define STATFS_STRUCT struct statfs64
+#define STATVFS_FUNC __statvfs64
+#define STATVFS_STRUCT struct statvfs64
+#define STATFS_ARG const char *
+#include "sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c"
+weak_alias (__statfs64, statfs64)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/statfs_common.c
new file mode 100644 (file)
index 0000000..ab1f5a2
--- /dev/null
@@ -0,0 +1,52 @@
+/* statfs -- Return information about the filesystem on which FILE resides.
+   Copyright (C) 1996, 1997, 2002, 2009 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <sys/statfs.h>
+#include <sys/statvfs.h>
+#include <sys/fstyp.h>
+#include <stddef.h>
+
+/* Return information about the filesystem on which FILE resides.  */
+int
+STATFS_FUNC (STATFS_ARG file, STATFS_STRUCT *buf)
+{
+  STATVFS_STRUCT vbuf;
+  int res = STATVFS_FUNC (file, &vbuf);
+  if (res != 0)
+    return -1;
+
+  int fsid = sysfs (GETFSIND, vbuf.f_basetype);
+  if (fsid == -1)
+    return -1;
+
+  buf->f_type = 0;
+  buf->f_bsize = vbuf.f_bsize;
+  buf->f_blocks = vbuf.f_blocks;
+  buf->f_bfree = vbuf.f_bfree;
+  buf->f_bavail = vbuf.f_bavail;
+  buf->f_files = vbuf.f_files;
+  buf->f_ffree = vbuf.f_ffree;
+  buf->f_fsid = fsid;
+  buf->f_namelen = vbuf.f_namemax;
+  buf->f_frsize = vbuf.f_frsize;
+  memset (&buf->f_spare, 0, sizeof (buf->f_spare));
+
+  return 0;
+}