summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/path.cc
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-08-25 20:35:25 +0000
committerCorinna Vinschen <corinna@vinschen.de>2005-08-25 20:35:25 +0000
commit9d13e04523cdf8d615861845a22a35add858bd0b (patch)
treedf5df95d465603138c9c6d20fae92a21be854985 /winsup/cygwin/path.cc
parent4a8b3ef6929fc2387ebdd07b5c53f92db463d46b (diff)
downloadcygnal-9d13e04523cdf8d615861845a22a35add858bd0b.tar.gz
cygnal-9d13e04523cdf8d615861845a22a35add858bd0b.tar.bz2
cygnal-9d13e04523cdf8d615861845a22a35add858bd0b.zip
* path.cc (normalize_win32_path): Honor network paths. Fold more
than two leading dir separators into one. Check for dir separator instead of just slashes to handle incoming Win32 paths correctly.
Diffstat (limited to 'winsup/cygwin/path.cc')
-rw-r--r--winsup/cygwin/path.cc27
1 files changed, 19 insertions, 8 deletions
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 7f169fdf4..568072f4c 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1089,18 +1089,29 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
bool beg_src_slash = isdirsep (src[0]);
tail = dst;
- if (beg_src_slash && isdirsep (src[1]) && src[2])
+ if (beg_src_slash && isdirsep (src[1]))
{
- *tail++ = '\\';
- src++;
- if (src[1] == '.' && isdirsep (src[2]))
- {
- *tail++ = '\\';
- *tail++ = '.';
+ if (isdirsep (src[2]))
+ {
+ /* More than two slashes are just folded into one. */
src += 2;
+ while (isdirsep (src[1]))
+ ++src;
+ }
+ else
+ {
+ /* Two slashes start a network or device path. */
+ *tail++ = '\\';
+ src++;
+ if (src[1] == '.' && isdirsep (src[2]))
+ {
+ *tail++ = '\\';
+ *tail++ = '.';
+ src += 2;
+ }
}
}
- else if (!isdrive(src) && *src != '/')
+ if (tail == dst && !isdrive(src) && isdirsep (*src))
{
if (beg_src_slash)
tail += cygheap->cwd.get_drive (dst);