| 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 |
| |