Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2012-04-02 15:08:07 +0400
committerCorinna Vinschen <corinna@vinschen.de>2012-04-02 15:08:07 +0400
commitda8274643c9a765fd2aff0b5d3ee203b2f3a79d0 (patch)
treea1c25b3a979b7b2575d266770dd4c1614a001233 /winsup/cygwin/fhandler_dev.cc
parent5346e8aebbd4ecc03c8156a91174df74db6fc7db (diff)
* fhandler.h (fhandler_dev::open): Declare.
(fhandler_dev::close): Declare. (fhandler_dev::fstat): Declare. (fhandler_dev::fstatvfs): Declare. (fhandler_cygdrive::fstatvfs): Declare. * fhandler_dev.cc (fhandler_dev::open): New method. (fhandler_dev::close): Ditto. (fhandler_dev::fstat): Ditto. (fhandler_dev::fstatvfs): Ditto. * fhandler_disk_file.cc (fhandler_base::fstat_helper): Don't fill st_rdev. (fhandler_cygdrive::fstatvfs): New method. * path.h (path_conv::fs_got_fs): New method. * mount.h (fs_info::got_fs): Change type to bool, make public.
Diffstat (limited to 'winsup/cygwin/fhandler_dev.cc')
-rw-r--r--winsup/cygwin/fhandler_dev.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/winsup/cygwin/fhandler_dev.cc b/winsup/cygwin/fhandler_dev.cc
index 938e27db3..44061e050 100644
--- a/winsup/cygwin/fhandler_dev.cc
+++ b/winsup/cygwin/fhandler_dev.cc
@@ -10,6 +10,7 @@ details. */
#include "winsup.h"
#include <stdlib.h>
+#include <sys/statvfs.h>
#include "path.h"
#include "fhandler.h"
#include "dtable.h"
@@ -35,6 +36,81 @@ fhandler_dev::fhandler_dev () :
{
}
+int
+fhandler_dev::open (int flags, mode_t mode)
+{
+ if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
+ {
+ set_errno (EEXIST);
+ return 0;
+ }
+ if (flags & O_WRONLY)
+ {
+ set_errno (EISDIR);
+ return 0;
+ }
+ int ret = fhandler_disk_file::open (flags, mode);
+ if (!ret)
+ {
+ flags |= O_DIROPEN;
+ set_flags (flags);
+ nohandle (true);
+ }
+ return 1;
+}
+
+int
+fhandler_dev::close ()
+{
+ if (nohandle ())
+ return 0;
+ return fhandler_disk_file::close ();
+}
+
+int
+fhandler_dev::fstat (struct __stat64 *st)
+{
+ /* If /dev really exists on disk, return correct disk information. */
+ if (pc.fs_got_fs ())
+ return fhandler_disk_file::fstat (st);
+ /* Otherwise fake virtual filesystem. */
+ fhandler_base::fstat (st);
+ st->st_ino = 2;
+ st->st_mode = S_IFDIR | STD_RBITS | STD_XBITS;
+ st->st_nlink = 1;
+ return 0;
+}
+
+int __stdcall
+fhandler_dev::fstatvfs (struct statvfs *sfs)
+{
+ int ret = -1, opened = 0;
+ HANDLE fh = get_handle ();
+
+ if (!fh && !nohandle ())
+ {
+ if (!open (O_RDONLY, 0))
+ return -1;
+ opened = 1;
+ }
+ if (!nohandle ())
+ {
+ ret = fhandler_disk_file::fstatvfs (sfs);
+ goto out;
+ }
+ /* Virtual file system. Just return an empty buffer with a few values
+ set to something useful. Just as on Linux. */
+ memset (sfs, 0, sizeof (*sfs));
+ sfs->f_bsize = sfs->f_frsize = 4096;
+ sfs->f_namemax = NAME_MAX;
+ ret = 0;
+
+out:
+ if (opened)
+ close ();
+ return ret;
+}
+
DIR *
fhandler_dev::opendir (int fd)
{