From f046dfe2e1407065b800eda66a40a5de067ae063 Mon Sep 17 00:00:00 2001 From: phumblet Date: Wed, 14 Apr 2004 03:07:59 +0000 Subject: [PATCH] 2004-04-14 Pierre Humblet * path.h (path_conv::set_symlink): Add argument. (path_conv::get_symlink_length): New method. (path_conv::symlink_length): New member. * path.cc (path_conv::check): Pass symlen to set_symlink. * fhandler_disk_file.cc (fhandler_base::fstat_helper): For symlinks set st_size from get_symlink_length. --- winsup/cygwin/ChangeLog | 9 +++++++++ winsup/cygwin/fhandler_disk_file.cc | 1 + winsup/cygwin/path.cc | 2 +- winsup/cygwin/path.h | 4 +++- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 51bcd00d13..5be12c9687 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2004-04-14 Pierre Humblet + + * path.h (path_conv::set_symlink): Add argument. + (path_conv::get_symlink_length): New method. + (path_conv::symlink_length): New member. + * path.cc (path_conv::check): Pass symlen to set_symlink. + * fhandler_disk_file.cc (fhandler_base::fstat_helper): For symlinks + set st_size from get_symlink_length. + 2004-04-13 Corinna Vinschen * security.cc (set_nt_attribute): Only call get_nt_object_security diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 587f32314a..0dce4701b9 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -282,6 +282,7 @@ fhandler_base::fstat_helper (struct __stat64 *buf, buf->st_mode = S_IFDIR; else if (pc.issymlink ()) { + buf->st_size = pc.get_symlink_length (); /* symlinks are everything for everyone! */ buf->st_mode = S_IFLNK | S_IRWXU | S_IRWXG | S_IRWXO; get_file_attribute (pc.has_acls (), get_io_handle (), get_win32_name (), diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 08e0199152..1b4000fe75 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -705,7 +705,7 @@ path_conv::check (const char *src, unsigned opt, saw_symlinks = 1; if (component == 0 && !need_directory && !(opt & PC_SYM_FOLLOW)) { - set_symlink (); // last component of path is a symlink. + set_symlink (symlen); // last component of path is a symlink. if (opt & PC_SYM_CONTENTS) { strcpy (path, sym.contents); diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index a2db842629..150799d595 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -162,7 +162,7 @@ class path_conv } void set_binary () {path_flags |= PATH_BINARY;} - void set_symlink () {path_flags |= PATH_SYMLINK;} + void set_symlink (DWORD n) {path_flags |= PATH_SYMLINK; symlink_length = n;} void set_has_symlinks () {path_flags |= PATH_HAS_SYMLINKS;} void set_isdisk () {path_flags |= PATH_ISDISK; dev.devn = FH_FS;} void set_exec (int x = 1) {path_flags |= x ? PATH_EXEC : PATH_NOTEXEC;} @@ -215,7 +215,9 @@ class path_conv char *normalized_path; size_t normalized_path_size; void set_normalized_path (const char *) __attribute__ ((regparm (2))); + DWORD get_symlink_length () { return symlink_length; }; private: + DWORD symlink_length; char path[CYG_MAX_PATH]; }; -- 2.11.0