summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/syscalls.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/syscalls.cc')
-rw-r--r--winsup/cygwin/syscalls.cc50
1 files changed, 44 insertions, 6 deletions
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 <sys/stat.h>
#include <sys/vfs.h> /* needed for statfs */
+#include <sys/statvfs.h> /* needed for statvfs */
#include <pwd.h>
#include <grp.h>
#include <stdlib.h>
@@ -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,19 +1734,52 @@ 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)
{
cygheap_fdget cfd (fd);