Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2004-12-24 00:37:44 +0300
committerChristopher Faylor <me@cgf.cx>2004-12-24 00:37:44 +0300
commit861ef99725f983ce5bf2a4fc505dc4545bcecb17 (patch)
tree983e2255e75403d14f83f14bceb7879b3898e651 /winsup
parent7a2ba9dbec847e68908d6c7eb8a93895d5ce9cff (diff)
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/dtable.cc4
-rw-r--r--winsup/cygwin/fhandler.cc4
-rw-r--r--winsup/cygwin/path.cc37
-rw-r--r--winsup/cygwin/path.h2
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 <pierre.humblet@ieee.org>
+ Christopher Faylor <cgf@timesys.com>
+
+ * 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 <cgf@timesys.com>
* 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;