diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2012-04-02 15:08:07 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2012-04-02 15:08:07 +0400 |
commit | da8274643c9a765fd2aff0b5d3ee203b2f3a79d0 (patch) | |
tree | a1c25b3a979b7b2575d266770dd4c1614a001233 /winsup/cygwin/fhandler_dev.cc | |
parent | 5346e8aebbd4ecc03c8156a91174df74db6fc7db (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.cc | 76 |
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) { |