From 08b75763d15cf9e5f45eef70fe7e30ce2b748ae3 Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Mon, 14 Jul 2008 14:30:48 +0000 Subject: - improve UCLIBC_LINUX_SPECIFIC compile-tested only, fixes libc/misc/statfs/fstatfs64.c:29: error: 'fstatfs' undeclared here (not in a function) --- libc/misc/statfs/Makefile.in | 5 ++++- libc/misc/statfs/fstatvfs.c | 3 +-- libc/misc/statfs/fstatvfs64.c | 24 +++++++++++++++++++++++- libc/misc/statfs/statvfs64.c | 25 ++++++++++++++++++++++++- 4 files changed, 52 insertions(+), 5 deletions(-) (limited to 'libc/misc/statfs') diff --git a/libc/misc/statfs/Makefile.in b/libc/misc/statfs/Makefile.in index c979b2255..b0a8b84c9 100644 --- a/libc/misc/statfs/Makefile.in +++ b/libc/misc/statfs/Makefile.in @@ -7,7 +7,10 @@ CSRC := statvfs.c fstatvfs.c ifeq ($(UCLIBC_HAS_LFS),y) -CSRC += fstatfs64.c statfs64.c statvfs64.c fstatvfs64.c +ifeq ($(UCLIBC_LINUX_SPECIFIC),y) +CSRC += fstatfs64.c statfs64.c +endif +CSRC += statvfs64.c fstatvfs64.c endif MISC_STATFS_DIR := $(top_srcdir)libc/misc/statfs diff --git a/libc/misc/statfs/fstatvfs.c b/libc/misc/statfs/fstatvfs.c index 231d45207..e21235e01 100644 --- a/libc/misc/statfs/fstatvfs.c +++ b/libc/misc/statfs/fstatvfs.c @@ -34,7 +34,6 @@ libc_hidden_proto(setmntent) libc_hidden_proto(getmntent_r) libc_hidden_proto(endmntent) -#if !defined __UCLIBC_LINUX_SPECIFIC__ #ifndef __USE_FILE_OFFSET64 extern int fstatfs (int __fildes, struct statfs *__buf) __THROW __nonnull ((2)); @@ -46,7 +45,7 @@ extern int __REDIRECT_NTH (fstatfs, (int __fildes, struct statfs *__buf), # define fstatfs fstatfs64 # endif #endif -#endif + extern __typeof(fstatfs) __libc_fstatfs; libc_hidden_proto(__libc_fstatfs) libc_hidden_proto(fstat) diff --git a/libc/misc/statfs/fstatvfs64.c b/libc/misc/statfs/fstatvfs64.c index 02e7011cf..2d44e4217 100644 --- a/libc/misc/statfs/fstatvfs64.c +++ b/libc/misc/statfs/fstatvfs64.c @@ -28,6 +28,7 @@ #include #include + /* Experimentally off - libc_hidden_proto(memset) */ /* Experimentally off - libc_hidden_proto(strcmp) */ /* Experimentally off - libc_hidden_proto(strsep) */ @@ -37,19 +38,40 @@ libc_hidden_proto(endmntent) #undef stat #define stat stat64 +#if defined __UCLIBC_LINUX_SPECIFIC__ libc_hidden_proto(fstatfs64) libc_hidden_proto(fstat64) +#endif libc_hidden_proto(stat64) int fstatvfs64 (int fd, struct statvfs64 *buf) { struct statfs64 fsbuf; struct stat64 st; +#if !defined __UCLIBC_LINUX_SPECIFIC__ + int ret; + struct statvfs buf32; + ret = fstatvfs (fd, &buf32); + if (ret == 0) { + fsbuf.f_bsize = buf32.f_bsize; + fsbuf.f_frsize = buf32.f_frsize; + fsbuf.f_blocks = buf32.f_blocks; + fsbuf.f_bfree = buf32.f_bfree; + fsbuf.f_bavail = buf32.f_bavail; + fsbuf.f_files = buf32.f_files; + fsbuf.f_ffree = buf32.f_ffree; + if (sizeof (fsbuf.f_fsid) == sizeof(buf32.f_fsid)) + memcpy (&fsbuf.f_fsid, &buf32.f_fsid, sizeof(fsbuf.f_fsid)); + /* and if not, then you could approximate or whatever.. */ + fsbuf.f_namelen = buf32.f_namemax; + } else + return ret; +#else /* Get as much information as possible from the system. */ if (fstatfs64 (fd, &fsbuf) < 0) return -1; - +#endif #define STAT(st) fstat64 (fd, st) #include "internal_statvfs.c" diff --git a/libc/misc/statfs/statvfs64.c b/libc/misc/statfs/statvfs64.c index c91e1fe26..66f648ac1 100644 --- a/libc/misc/statfs/statvfs64.c +++ b/libc/misc/statfs/statvfs64.c @@ -37,18 +37,41 @@ libc_hidden_proto(endmntent) #undef stat #define stat stat64 +#if !defined __UCLIBC_LINUX_SPECIFIC__ libc_hidden_proto(statfs64) +#else +libc_hidden_proto(statvfs) +#endif libc_hidden_proto(stat64) int statvfs64 (const char *file, struct statvfs64 *buf) { struct statfs64 fsbuf; struct stat64 st; +#if !defined __UCLIBC_LINUX_SPECIFIC__ + int ret; + struct statvfs buf32; + ret = statvfs (file, &buf32); + if (ret == 0) { + fsbuf.f_bsize = buf32.f_bsize; + fsbuf.f_frsize = buf32.f_frsize; + fsbuf.f_blocks = buf32.f_blocks; + fsbuf.f_bfree = buf32.f_bfree; + fsbuf.f_bavail = buf32.f_bavail; + fsbuf.f_files = buf32.f_files; + fsbuf.f_ffree = buf32.f_ffree; + if (sizeof (fsbuf.f_fsid) == sizeof(buf32.f_fsid)) + memcpy (&fsbuf.f_fsid, &buf32.f_fsid, sizeof(fsbuf.f_fsid)); + /* and if not, then you could approximate or whatever.. */ + fsbuf.f_namelen = buf32.f_namemax; + } else + return ret; +#else /* Get as much information as possible from the system. */ if (statfs64 (file, &fsbuf) < 0) return -1; - +#endif #define STAT(st) stat (file, st) #include "internal_statvfs.c" -- cgit v1.2.3