From 861ef99725f983ce5bf2a4fc505dc4545bcecb17 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 23 Dec 2004 21:37:44 +0000 Subject: [PATCH] * path.h (path_conv::set_normalized_path): Add second argument and fill it in throughout. * path.cc (path_conv::check): Declare, set and use "strip_tail". (path_conv::set_normalized_path): Add and use second argument, replacing all tail stripping tests. --- winsup/cygwin/ChangeLog | 9 +++++++++ winsup/cygwin/dtable.cc | 4 ++-- winsup/cygwin/fhandler.cc | 4 ++-- winsup/cygwin/path.cc | 37 ++++++++++++++++++++----------------- winsup/cygwin/path.h | 2 +- 5 files changed, 34 insertions(+), 22 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 9e2100881..e2251d2fe 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +2004-12-23 Pierre Humblet + Christopher Faylor + + * path.h (path_conv::set_normalized_path): Add second argument and fill + it in throughout. + * path.cc (path_conv::check): Declare, set and use "strip_tail". + (path_conv::set_normalized_path): Add and use second argument, + replacing all tail stripping tests. + 2004-12-23 Christopher Faylor * cygthread.cc (cygthread::cygthread): Guard debugging variable with diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 81c84a99e..38e5057cf 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -357,9 +357,9 @@ build_fh_dev (const device& dev, const char *unix_name) { path_conv pc (dev); if (unix_name) - pc.set_normalized_path (unix_name); + pc.set_normalized_path (unix_name, false); else - pc.set_normalized_path (dev.name); + pc.set_normalized_path (dev.name, false); return build_fh_pc (pc); } diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index ebe3d7175..2507f322e 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -41,7 +41,7 @@ inline fhandler_base& fhandler_base::operator =(fhandler_base& x) { memcpy (this, &x, sizeof *this); - pc.set_normalized_path (x.pc.normalized_path); + pc.set_normalized_path (x.pc.normalized_path, false); rabuf = NULL; ralen = 0; raixget = 0; @@ -151,7 +151,7 @@ void fhandler_base::set_name (path_conv &in_pc) { memcpy (&pc, &in_pc, in_pc.size ()); - pc.set_normalized_path (in_pc.normalized_path); + pc.set_normalized_path (in_pc.normalized_path, false); } /* Detect if we are sitting at EOF for conditions where Windows diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 0345f8191..7716f0282 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -424,23 +424,22 @@ path_conv::fillin (HANDLE h) } void -path_conv::set_normalized_path (const char *path_copy) +path_conv::set_normalized_path (const char *path_copy, bool strip_tail) { - char *eopath = strchr (path, '\0'); - size_t n; + char *p = strchr (path_copy, '\0'); - if (dev.devn != FH_FS || !*path_copy || strncmp (path_copy, "//./", 4) == 0) - n = strlen (path_copy) + 1; - else + if (strip_tail) { - char *p = strchr (path_copy, '\0'); while (*--p == '.' || *p == ' ') continue; - p[1] = '\0'; - n = 2 + p - path_copy; + *++p = '\0'; } + size_t n = 1 + p - path_copy; + normalized_path = path + sizeof (path) - n; + + char *eopath = strchr (path, '\0'); if (normalized_path > eopath) normalized_path_size = n; else @@ -804,6 +803,7 @@ path_conv::check (const char *src, unsigned opt, add_ext_from_sym (sym); out: + bool strip_tail = false; /* If the user wants a directory, do not return a symlink */ if (!need_directory || error) /* nothing to do */; @@ -836,7 +836,10 @@ out: if (!tail) /* nothing */; else if (tail[-1] != '\\') - *tail = '\0'; + { + *tail = '\0'; + strip_tail = true; + } else { error = ENOENT; @@ -901,7 +904,7 @@ out: { if (tail < path_end && tail > path_copy + 1) *tail = '/'; - set_normalized_path (path_copy); + set_normalized_path (path_copy, strip_tail); } #if 0 @@ -1838,12 +1841,12 @@ mount_info::add_reg_mount (const char *native_path, const char *posix_path, unsi if (res != ERROR_SUCCESS) goto err; res = subkey.set_int ("flags", mountflags); - + if (mountflags & MOUNT_SYSTEM) { sys_mount_table_counter++; cygwin_shared->sys_mount_table_counter++; - } + } return 0; /* Success */ } @@ -1893,12 +1896,12 @@ mount_info::read_cygdrive_info_from_registry () if (i) cygheap->user.reimpersonate (); - if (r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive), + if (r.get_string (CYGWIN_INFO_CYGDRIVE_PREFIX, cygdrive, sizeof (cygdrive), CYGWIN_INFO_CYGDRIVE_DEFAULT_PREFIX) != ERROR_SUCCESS && i == 0) continue; /* Fetch user cygdrive_flags from registry; returns MOUNT_CYGDRIVE on error. */ - cygdrive_flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, + cygdrive_flags = r.get_int (CYGWIN_INFO_CYGDRIVE_FLAGS, MOUNT_CYGDRIVE | MOUNT_BINARY); /* Sanitize */ if (i == 0) @@ -1931,7 +1934,7 @@ mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsign /* Ensure that there is never a final slash */ nofinalslash (cygdrive_prefix, hold_cygdrive_prefix); - reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, + reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); int res; res = r.set_string (CYGWIN_INFO_CYGDRIVE_PREFIX, hold_cygdrive_prefix); @@ -1962,7 +1965,7 @@ mount_info::write_cygdrive_info_to_registry (const char *cygdrive_prefix, unsign int mount_info::remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags) { - reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, + reg_key r (flags & MOUNT_SYSTEM, KEY_ALL_ACCESS, CYGWIN_INFO_CYGWIN_MOUNT_REGISTRY_NAME, NULL); diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index c10cb9b58..743246f9e 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -214,7 +214,7 @@ class path_conv unsigned __stdcall ndisk_links (DWORD); char *normalized_path; size_t normalized_path_size; - void set_normalized_path (const char *) __attribute__ ((regparm (2))); + void set_normalized_path (const char *, bool) __attribute__ ((regparm (3))); DWORD get_symlink_length () { return symlink_length; }; private: DWORD symlink_length;