소스 검색

statfs: support f_frsize

closes bugzilla #5834

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Bernhard Reutner-Fischer 12 년 전
부모
커밋
bcf1bfabde
7개의 변경된 파일82개의 추가작업 그리고 2개의 파일을 삭제
  1. 3 0
      libc/misc/statfs/fstatfs64.c
  2. 6 2
      libc/misc/statfs/internal_statvfs.c
  3. 3 0
      libc/misc/statfs/statfs64.c
  4. 3 0
      test/.gitignore
  5. 6 0
      test/misc/Makefile.in
  6. 33 0
      test/misc/tst-statfs.c
  7. 28 0
      test/misc/tst-statvfs.c

+ 3 - 0
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));
 

+ 6 - 2
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.  */
 

+ 3 - 0
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;

+ 3 - 0
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

+ 6 - 0
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)

+ 33 - 0
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);
+}

+ 28 - 0
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);
+}