aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2000-12-09 03:29:33 +0000
committerChristopher Faylor <me@cgf.cx>2000-12-09 03:29:33 +0000
commit82c8d7ef8c6ee7d75d56adab672e361dac730979 (patch)
treec1bef0dd63bfbffab2c8fd1c304fd5944a43a40e
parent2efbc2a7dfa35d14c29c5c66837dc09f07c949ac (diff)
downloadnewlib-82c8d7ef8c6ee7d75d56adab672e361dac730979.zip
newlib-82c8d7ef8c6ee7d75d56adab672e361dac730979.tar.gz
newlib-82c8d7ef8c6ee7d75d56adab672e361dac730979.tar.bz2
* path.cc (normalize_win32_path): Reorganize logic to accomodate chroot.
Always check for MAX_PATH overrun. Avoid adding one too many backslashes when src path begins with a slash. From Corinna Vinschen. * winsup.h: Force demangling for dll_crt0 for newer compilers.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/path.cc53
-rw-r--r--winsup/cygwin/winsup.h2
3 files changed, 35 insertions, 27 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 1287603..7bec39a 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+Fri Dec 8 22:21:01 2000 Christopher Faylor <cgf@cygnus.com>
+
+ * path.cc (normalize_win32_path): Reorganize logic to accomodate
+ chroot. Always check for MAX_PATH overrun. Avoid adding one too many
+ backslashes when src path begins with a slash. From Corinna Vinschen.
+ * winsup.h: Force demangling for dll_crt0 for newer compilers.
+
Thu Dec 7 12:10:00 2000 Edward M. Lee <tailbert@yahoo.com>
* cygwin.din: Declare strtok_r for the import lib. Already in the DLL.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index b00b1ae..7b9f81f 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -712,32 +712,9 @@ normalize_win32_path (const char *src, char *dst)
const char *src_start = src;
char *dst_start = dst;
char *dst_root_start = dst;
+ bool beg_src_slash;
- if (strchr (src, ':') == NULL && !slash_unc_prefix_p (src))
- {
- if (!cygcwd.get (dst, 0))
- return get_errno ();
- if (SLASH_P (src[0]))
- if (dst[1] == ':')
- dst[2] = '\0';
- else if (slash_unc_prefix_p (dst))
- {
- char *p = strpbrk (dst + 2, "\\/");
- if (p && (p = strpbrk (p + 1, "\\/")))
- *p = '\0';
- }
-
- else if (strlen (dst) + 1 + strlen (src) >= MAX_PATH)
- {
- debug_printf ("ENAMETOOLONG = normalize_win32_path (%s)", src);
- return ENAMETOOLONG;
- }
- dst += strlen (dst);
- if (!SLASH_P (dst[-1]))
- *dst++ = '\\';
- }
- /* Two leading \'s? If so, preserve them. */
- else if (SLASH_P (src[0]) && SLASH_P (src[1]))
+ if (slash_unc_prefix_p (src))
{
if (cygheap->root.length ())
{
@@ -748,7 +725,7 @@ normalize_win32_path (const char *src, char *dst)
++src;
}
/* If absolute path, care for chroot. */
- else if (SLASH_P (src[0]) && !SLASH_P (src[1]) && cygheap->root.length ())
+ else if ((beg_src_slash = SLASH_P (src[0])) && cygheap->root.length ())
{
strcpy (dst, cygheap->root.path ());
char *c;
@@ -758,6 +735,30 @@ normalize_win32_path (const char *src, char *dst)
dst_root_start = dst;
*dst++ = '\\';
}
+ else if (strchr (src, ':') == NULL)
+ {
+ if (!cygcwd.get (dst, 0))
+ return get_errno ();
+ if (beg_src_slash)
+ {
+ if (dst[1] == ':')
+ dst[2] = '\0';
+ else if (slash_unc_prefix_p (dst))
+ {
+ char *p = strpbrk (dst + 2, "\\/");
+ if (p && (p = strpbrk (p + 1, "\\/")))
+ *p = '\0';
+ }
+ }
+ if (strlen (dst) + 1 + strlen (src) >= MAX_PATH)
+ {
+ debug_printf ("ENAMETOOLONG = normalize_win32_path (%s)", src);
+ return ENAMETOOLONG;
+ }
+ dst += strlen (dst);
+ if (!beg_src_slash)
+ *dst++ = '\\';
+ }
while (*src)
{
diff --git a/winsup/cygwin/winsup.h b/winsup/cygwin/winsup.h
index 29cf92d..308620e 100644
--- a/winsup/cygwin/winsup.h
+++ b/winsup/cygwin/winsup.h
@@ -146,7 +146,7 @@ extern unsigned int signal_shift_subtract;
class per_process;
/* cygwin .dll initialization */
-void dll_crt0 (per_process *);
+void dll_crt0 (per_process *) __asm__ ("_dll_crt0__FP11per_process");
extern "C" void __stdcall _dll_crt0 ();
/* dynamically loaded dll initialization */