From a652e6d52a0d403bc8ffebfc1a83e305eff42d2c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 23 Feb 2005 13:12:43 +0000 Subject: * cygwin.din (fstatvfs): Export. (statvfs): Export. * syscalls.cc: Include sys/statvfs.h. (statvfs): New function. Move statfs functionality here. (fstatvfs): New function. (statfs): Just call statvfs and copy structure. Check validity of incoming struct statfs pointer. * include/cygwin/types.h (fsblkcnt_t): Define. (fsfilcnt_t): Define. * include/cygwin/version.h: Bump API minor version. * include/sys/statvfs.h: New file. --- winsup/cygwin/syscalls.cc | 50 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) (limited to 'winsup/cygwin/syscalls.cc') diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index a80b47090..8cd7368ec 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -24,6 +24,7 @@ details. */ #include "winsup.h" #include #include /* needed for statfs */ +#include /* needed for statvfs */ #include #include #include @@ -1684,10 +1685,14 @@ get_osfhandle (int fd) } extern "C" int -statfs (const char *fname, struct statfs *sfs) +statvfs (const char *fname, struct statvfs *sfs) { char root[CYG_MAX_PATH]; + if (check_null_empty_str_errno (fname) + || check_null_invalid_struct_errno (sfs)) + return -1; + syscall_printf ("statfs %s", fname); if (!sfs) @@ -1729,18 +1734,51 @@ statfs (const char *fname, struct statfs *sfs) __seterrno (); return -1; } - sfs->f_type = flags; sfs->f_bsize = spc*bps; + sfs->f_frsize = spc*bps; sfs->f_blocks = totalc; - sfs->f_bavail = availc; sfs->f_bfree = freec; - sfs->f_files = -1; - sfs->f_ffree = -1; + sfs->f_bavail = availc; + sfs->f_files = ULONG_MAX; + sfs->f_ffree = ULONG_MAX; + sfs->f_favail = ULONG_MAX; sfs->f_fsid = vsn; - sfs->f_namelen = maxlen; + sfs->f_flag = flags; + sfs->f_namemax = maxlen; return 0; } +extern "C" int +fstatvfs (int fd, struct statvfs *sfs) +{ + cygheap_fdget cfd (fd); + if (cfd < 0) + return -1; + return statvfs (cfd->get_name (), sfs); +} + +extern "C" int +statfs (const char *fname, struct statfs *sfs) +{ + if (check_null_invalid_struct_errno (sfs)) + return -1; + struct statvfs vfs; + int ret = statvfs (fname, &vfs); + if (!ret) + { + sfs->f_type = vfs.f_flag; + sfs->f_bsize = vfs.f_bsize; + sfs->f_blocks = vfs.f_blocks; + sfs->f_bavail = vfs.f_bavail; + sfs->f_bfree = vfs.f_bfree; + sfs->f_files = -1; + sfs->f_ffree = -1; + sfs->f_fsid = vfs.f_fsid; + sfs->f_namelen = vfs.f_namemax; + } + return ret; +} + extern "C" int fstatfs (int fd, struct statfs *sfs) { -- cgit v1.2.3