summaryrefslogtreecommitdiff
path: root/winsup/cygwin/fhandler_disk_file.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_disk_file.cc')
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc19
1 files changed, 9 insertions, 10 deletions
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index 26f58c44a26..09804405053 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -287,14 +287,18 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
if (pc.isdir ())
buf->st_mode = S_IFDIR;
else if (pc.issymlink ())
- buf->st_mode = S_IFLNK;
+ {
+ /* 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);
+ goto done;
+ }
else if (pc.issocket ())
buf->st_mode = S_IFSOCK;
- __uid32_t uid;
- __gid32_t gid;
if (get_file_attribute (pc.has_acls (), get_win32_name (), &buf->st_mode,
- &uid, &gid) == 0)
+ &buf->st_uid, &buf->st_gid) == 0)
{
/* If read-only attribute is set, modify ntsec return value */
if (pc.has_attribute (FILE_ATTRIBUTE_READONLY) && !get_symlink_p ())
@@ -315,8 +319,6 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
buf->st_mode |= S_IFDIR | STD_XBITS;
else if (buf->st_mode & S_IFMT)
/* nothing */;
- else if (pc.issocket ())
- buf->st_mode |= S_IFSOCK;
else if (is_fs_special ())
{
buf->st_dev = dev ();
@@ -355,15 +357,12 @@ fhandler_base::fstat_helper (struct __stat64 *buf,
buf->st_mode |= STD_XBITS;
}
- buf->st_uid = uid;
- buf->st_gid = gid;
-
/* The number of links to a directory includes the
number of subdirectories in the directory, since all
those subdirectories point to it.
This is too slow on remote drives, so we do without it and
set the number of links to 2. */
-
+ done:
syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%D, st_mode=%p, st_ino=%d, sizeof=%d",
buf, buf->st_atime, buf->st_size, buf->st_mode,
(int) buf->st_ino, sizeof (*buf));