190 lines
5.4 KiB
Diff
190 lines
5.4 KiB
Diff
|
From 479f8407c4822d2b872afb8bb14e5ab596714744 Mon Sep 17 00:00:00 2001
|
||
|
From: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
|
||
|
Date: Thu, 17 Jan 2013 22:44:00 +0100
|
||
|
Subject: [PATCH] statfs: support f_frsize
|
||
|
|
||
|
closes bugzilla #5834
|
||
|
|
||
|
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
|
||
|
---
|
||
|
libc/misc/statfs/fstatfs64.c | 3 +++
|
||
|
libc/misc/statfs/internal_statvfs.c | 8 ++++++--
|
||
|
libc/misc/statfs/statfs64.c | 3 +++
|
||
|
test/.gitignore | 3 +++
|
||
|
test/misc/Makefile.in | 6 ++++++
|
||
|
test/misc/tst-statfs.c | 33 +++++++++++++++++++++++++++++++++
|
||
|
test/misc/tst-statvfs.c | 28 ++++++++++++++++++++++++++++
|
||
|
7 files changed, 82 insertions(+), 2 deletions(-)
|
||
|
create mode 100644 test/misc/tst-statfs.c
|
||
|
create mode 100644 test/misc/tst-statvfs.c
|
||
|
|
||
|
diff --git a/libc/misc/statfs/fstatfs64.c b/libc/misc/statfs/fstatfs64.c
|
||
|
index 27bb8d6..42df1ae 100644
|
||
|
--- a/libc/misc/statfs/fstatfs64.c
|
||
|
+++ b/libc/misc/statfs/fstatfs64.c
|
||
|
@@ -43,6 +43,9 @@ int fstatfs64 (int fd, struct statfs64 *buf)
|
||
|
buf->f_files = buf32.f_files;
|
||
|
buf->f_ffree = buf32.f_ffree;
|
||
|
buf->f_fsid = buf32.f_fsid;
|
||
|
+#ifdef _STATFS_F_FRSIZE
|
||
|
+ buf->f_frsize = buf32.f_frsize;
|
||
|
+#endif
|
||
|
buf->f_namelen = buf32.f_namelen;
|
||
|
memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare));
|
||
|
|
||
|
diff --git a/libc/misc/statfs/internal_statvfs.c b/libc/misc/statfs/internal_statvfs.c
|
||
|
index 6075e9c..c1862b5 100644
|
||
|
--- a/libc/misc/statfs/internal_statvfs.c
|
||
|
+++ b/libc/misc/statfs/internal_statvfs.c
|
||
|
@@ -19,8 +19,12 @@
|
||
|
|
||
|
/* Now fill in the fields we have information for. */
|
||
|
buf->f_bsize = fsbuf.f_bsize;
|
||
|
- /* Linux does not support f_frsize, so set it to the full block size. */
|
||
|
+#ifdef _STATFS_F_FRSIZE
|
||
|
+ buf->f_frsize = fsbuf.f_frsize;
|
||
|
+#else
|
||
|
+ /* No support for f_frsize so set it to the full block size. */
|
||
|
buf->f_frsize = fsbuf.f_bsize;
|
||
|
+#endif
|
||
|
buf->f_blocks = fsbuf.f_blocks;
|
||
|
buf->f_bfree = fsbuf.f_bfree;
|
||
|
buf->f_bavail = fsbuf.f_bavail;
|
||
|
@@ -39,7 +43,7 @@
|
||
|
buf->__f_unused = 0;
|
||
|
#endif
|
||
|
buf->f_namemax = fsbuf.f_namelen;
|
||
|
- memset (buf->__f_spare, '\0', 6 * sizeof (int));
|
||
|
+ memset (buf->__f_spare, '\0', sizeof(buf->__f_spare));
|
||
|
|
||
|
/* What remains to do is to fill the fields f_favail and f_flag. */
|
||
|
|
||
|
diff --git a/libc/misc/statfs/statfs64.c b/libc/misc/statfs/statfs64.c
|
||
|
index 0cc8595..35329bd 100644
|
||
|
--- a/libc/misc/statfs/statfs64.c
|
||
|
+++ b/libc/misc/statfs/statfs64.c
|
||
|
@@ -42,6 +42,9 @@ int statfs64 (const char *file, struct statfs64 *buf)
|
||
|
buf->f_ffree = buf32.f_ffree;
|
||
|
buf->f_fsid = buf32.f_fsid;
|
||
|
buf->f_namelen = buf32.f_namelen;
|
||
|
+#ifdef _STATFS_F_FRSIZE
|
||
|
+ buf->f_frsize = buf32.f_frsize;
|
||
|
+#endif
|
||
|
memcpy (buf->f_spare, buf32.f_spare, sizeof (buf32.f_spare));
|
||
|
|
||
|
return 0;
|
||
|
diff --git a/test/.gitignore b/test/.gitignore
|
||
|
index c892816..7234c48 100644
|
||
|
--- a/test/.gitignore
|
||
|
+++ b/test/.gitignore
|
||
|
@@ -148,6 +148,8 @@ misc/sem
|
||
|
misc/stdarg
|
||
|
misc/tst-scandir
|
||
|
misc/tst-seekdir
|
||
|
+misc/tst-statfs
|
||
|
+misc/tst-statvfs
|
||
|
misc/tst-utmp
|
||
|
mmap/mmap
|
||
|
mmap/mmap2
|
||
|
@@ -254,6 +256,7 @@ stdio/64bit
|
||
|
stdio/fclose-loop
|
||
|
stdlib/ptytest
|
||
|
stdlib/qsort
|
||
|
+stdlib/testarc4random
|
||
|
stdlib/testatexit
|
||
|
stdlib/test-canon
|
||
|
stdlib/test-canon2
|
||
|
diff --git a/test/misc/Makefile.in b/test/misc/Makefile.in
|
||
|
index 2263211..9b74d22 100644
|
||
|
--- a/test/misc/Makefile.in
|
||
|
+++ b/test/misc/Makefile.in
|
||
|
@@ -9,6 +9,12 @@ CFLAGS_dirent64 := -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS
|
||
|
|
||
|
DODIFF_dirent := 1
|
||
|
DODIFF_dirent64 := 1
|
||
|
+DODIFF_tst-statfs := 1
|
||
|
+DODIFF_tst-statvfs := 1
|
||
|
|
||
|
OPTS_bug-glob1 := $(PWD)
|
||
|
OPTS_tst-fnmatch := < tst-fnmatch.input
|
||
|
+
|
||
|
+MNTENTS = $(shell mount | while read dev on mp rest; do echo $$mp; done)
|
||
|
+OPTS_tst-statfs := $(MNTENTS)
|
||
|
+OPTS_tst-statvfs := $(MNTENTS)
|
||
|
diff --git a/test/misc/tst-statfs.c b/test/misc/tst-statfs.c
|
||
|
new file mode 100644
|
||
|
index 0000000..44ab3aa
|
||
|
--- /dev/null
|
||
|
+++ b/test/misc/tst-statfs.c
|
||
|
@@ -0,0 +1,33 @@
|
||
|
+#define _FILE_OFFSET_BITS 64
|
||
|
+
|
||
|
+#include <sys/vfs.h>
|
||
|
+#include <errno.h>
|
||
|
+#include <stdio.h>
|
||
|
+#include <stdlib.h>
|
||
|
+#include <string.h>
|
||
|
+
|
||
|
+int
|
||
|
+main(int argc, char* argv[])
|
||
|
+{
|
||
|
+ struct statfs s;
|
||
|
+ int ret = 0, i;
|
||
|
+
|
||
|
+ for (i = 1; i < argc; i++) {
|
||
|
+ if (statfs(argv[i], &s) != 0) {
|
||
|
+ fprintf(stderr, "%s: %s: statfs failed. %s\n",
|
||
|
+ *argv, argv[i], strerror(errno));
|
||
|
+ exit(EXIT_FAILURE);
|
||
|
+ }
|
||
|
+ ++ret;
|
||
|
+ printf("statfs %s:\n\tblocks=%lld\n\tblkfree=%lld\n\tbsize=%d\n",
|
||
|
+ argv[i], s.f_blocks, s.f_bfree, s.f_bsize);
|
||
|
+#ifdef _STATFS_F_FRSIZE
|
||
|
+ printf("\tfrsize=%lld\n", s.f_frsize);
|
||
|
+#elif defined __mips__
|
||
|
+ printf("\tfrsize=mips, unsupported?\n");
|
||
|
+#else
|
||
|
+# error no _STATFS_F_FRSIZE
|
||
|
+#endif
|
||
|
+ }
|
||
|
+ exit(ret ? EXIT_SUCCESS : EXIT_FAILURE);
|
||
|
+}
|
||
|
diff --git a/test/misc/tst-statvfs.c b/test/misc/tst-statvfs.c
|
||
|
new file mode 100644
|
||
|
index 0000000..c1e8fde
|
||
|
--- /dev/null
|
||
|
+++ b/test/misc/tst-statvfs.c
|
||
|
@@ -0,0 +1,28 @@
|
||
|
+#define _FILE_OFFSET_BITS 64
|
||
|
+
|
||
|
+#include <sys/statvfs.h>
|
||
|
+#include <errno.h>
|
||
|
+#include <stdio.h>
|
||
|
+#include <stdlib.h>
|
||
|
+#include <string.h>
|
||
|
+
|
||
|
+int
|
||
|
+main(int argc, char* argv[])
|
||
|
+{
|
||
|
+ struct statvfs s;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ for (i = 1; i < argc; i++) {
|
||
|
+ if (statvfs(argv[i], &s) != 0) {
|
||
|
+ fprintf(stderr, "%s: %s: statvfs failed. %s\n",
|
||
|
+ *argv, argv[i], strerror(errno));
|
||
|
+ exit(EXIT_FAILURE);
|
||
|
+ }
|
||
|
+ printf("statvfs %s:\n\tblocks=%lld\n\tblkfree=%lld\n\tbsize=%d\n",
|
||
|
+ argv[i], s.f_blocks, s.f_bfree, s.f_bsize);
|
||
|
+#if 1 // def _STATFS_F_FRSIZE
|
||
|
+ printf("\tfrsize=%lld\n", s.f_frsize);
|
||
|
+#endif
|
||
|
+ }
|
||
|
+ exit(EXIT_SUCCESS);
|
||
|
+}
|
||
|
--
|
||
|
1.7.10.4
|
||
|
|