From bcf1bfabdef4481d4748e6c4a82b579af628fd75 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Thu, 17 Jan 2013 22:44:00 +0100 Subject: statfs: support f_frsize closes bugzilla #5834 Signed-off-by: Bernhard Reutner-Fischer --- 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 bc12020a0..ecdfabed1 100644 --- a/libc/misc/statfs/fstatfs64.c +++ b/libc/misc/statfs/fstatfs64.c @@ -42,6 +42,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 6eb4afe5a..29890d490 100644 --- a/libc/misc/statfs/internal_statvfs.c +++ b/libc/misc/statfs/internal_statvfs.c @@ -18,8 +18,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; @@ -38,7 +42,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(fsbuf.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 c11b7db23..99227977d 100644 --- a/libc/misc/statfs/statfs64.c +++ b/libc/misc/statfs/statfs64.c @@ -41,6 +41,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 e445ef2f5..c068f8983 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -159,6 +159,8 @@ misc/stdarg misc/tst-inotify misc/tst-scandir misc/tst-seekdir +misc/tst-statfs +misc/tst-statvfs misc/tst-utmp mmap/mmap mmap/mmap2 @@ -267,6 +269,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 226321131..9b74d222a 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 000000000..44ab3aa77 --- /dev/null +++ b/test/misc/tst-statfs.c @@ -0,0 +1,33 @@ +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include + +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 000000000..c1e8fde4e --- /dev/null +++ b/test/misc/tst-statvfs.c @@ -0,0 +1,28 @@ +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include + +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); +} -- cgit v1.2.3