diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-08-25 20:35:25 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-08-25 20:35:25 +0000 |
commit | 9d13e04523cdf8d615861845a22a35add858bd0b (patch) | |
tree | df5df95d465603138c9c6d20fae92a21be854985 /winsup/cygwin/path.cc | |
parent | 4a8b3ef6929fc2387ebdd07b5c53f92db463d46b (diff) | |
download | cygnal-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.cc | 27 |
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); |