summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc1
-rw-r--r--winsup/cygwin/path.cc2
-rw-r--r--winsup/cygwin/path.h4
4 files changed, 14 insertions, 2 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 51bcd00d1..5be12c968 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,12 @@
+2004-04-14 Pierre Humblet <pierre.humblet@ieee.org>
+
+ * 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 <corinna@vinschen.de>
* 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 587f32314..0dce4701b 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 08e019915..1b4000fe7 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 a2db84262..150799d59 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];
};