summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_disk_file.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2004-04-08 07:57:28 +0000
committerCorinna Vinschen <corinna@vinschen.de>2004-04-08 07:57:28 +0000
commita9a5b2eab006f3479087bed7030a16b86cd791aa (patch)
tree74290bb4248d1700262db6b57176f68d63b875e3 /winsup/cygwin/fhandler_disk_file.cc
parent284a55c33e0739e57436e02460b7997c3e70253f (diff)
downloadcygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.tar.gz
cygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.tar.bz2
cygnal-a9a5b2eab006f3479087bed7030a16b86cd791aa.zip
* fhandler.cc (fhandler_base::open): Set query access mode according
to query_open setting. (fhandler_base::fhandler_base): Initialize query_open. * fhandler.h (FH_QUERYOPEN): Drop. (enum query_state): Add. (class fhandler_base): Add query_open member. (fhandler_base::get_query_open): Redefine to use query_open. (fhandler_base::set_query_open): Ditto. * fhandler_disk_file.cc (fhandler_base::fstat_fs): Remove O_DIROPEN from open_flags since it's added in open_fs anyway. Remove query_open_already. Use new query_open settings. Rearrange slightly. (fhandler_base::fstat_helper): Add get_io_handle as parameter to get_file_attribute. * security.cc (get_nt_object_attribute): Make returning an int. Return -1 on error, 0 otherwise. (get_file_attribute): Take an object handle as argument. Move down to allow calling get_nt_object_attribute in case a non-NULL handle is given. * security.h (get_file_attribute): Add handle to argument list. * syscalls.cc (chown_worker): Accomodate new definition of get_file_attribute.
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc34
1 files changed, 15 insertions, 19 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index 62e133f76..9da537453 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -160,8 +160,7 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
{
int res = -1;
int oret;
- int open_flags = O_RDONLY | O_BINARY | O_DIROPEN;
- bool query_open_already;
+ int open_flags = O_RDONLY | O_BINARY;
if (get_io_handle ())
{
@@ -173,21 +172,18 @@ fhandler_base::fstat_fs (struct __stat64 *buf)
/* If we don't care if the file is executable or we already know if it is,
then just do a "query open" as it is apparently much faster. */
if (pc.exec_state () != dont_know_if_executable)
- set_query_open (query_open_already = true);
- else
- query_open_already = false;
-
- if (query_open_already && strncasematch (pc.volname (), "FAT", 3)
- && !strpbrk (get_win32_name (), "?*|<>"))
- oret = 0;
- else if (!(oret = open_fs (open_flags, 0))
- && !query_open_already
- && get_errno () == EACCES)
{
- /* If we couldn't open the file, try a "query open" with no permissions.
- This will allow us to determine *some* things about the file, at least. */
+ set_query_open (query_read_control);
+ if (strncasematch (pc.volname (), "FAT", 3)
+ && !strpbrk (get_win32_name (), "?*|<>"))
+ return fstat_by_name (buf);
+ }
+ if (!(oret = open_fs (open_flags, 0)) && get_errno () == EACCES)
+ {
+ /* If we couldn't open the file, try a query open with no permissions.
+ This allows us to determine *some* things about the file, at least. */
pc.set_exec (0);
- set_query_open (true);
+ set_query_open (query_null_access);
oret = open_fs (open_flags, 0);
}
@@ -289,15 +285,15 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
{
/* symlinks are everything for everyone! */
buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO;
- get_file_attribute (pc.has_acls (), get_win32_name (), NULL,
- &buf->st_uid, &buf->st_gid);
+ get_file_attribute (pc.has_acls (), get_io_handle (), get_win32_name (),
+ NULL, &buf->st_uid, &buf->st_gid);
goto done;
}
else if (pc.issocket ())
buf->st_mode = S_IFSOCK;
- if (get_file_attribute (pc.has_acls (), get_win32_name (), &buf->st_mode,
- &buf->st_uid, &buf->st_gid) == 0)
+ if (!get_file_attribute (pc.has_acls (), get_io_handle (), get_win32_name (),
+ &buf->st_mode, &buf->st_uid, &buf->st_gid))
{
/* If read-only attribute is set, modify ntsec return value */
if (pc.has_attribute (FILE_ATTRIBUTE_READONLY) && !get_symlink_p ())