* path.cc (normalize_posix_path): Keep two leading slashes

intact throughout.
	(normalize_win32_path): Revert to only checking for slash.
	(realpath): Convert drive letters to cygdrive paths before
	doing anything else.
	* shared_info.h (mount_info::cygdrive_posix_path): Make public.
This commit is contained in:
Corinna Vinschen 2005-08-26 15:11:06 +00:00
parent dbeee890d4
commit 63958f00d3
3 changed files with 36 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2005-08-25 Corinna Vinschen <corinna@vinschen.de>
* path.cc (normalize_posix_path): Keep two leading slashes
intact throughout.
(normalize_win32_path): Revert to only checking for slash.
(realpath): Convert drive letters to cygdrive paths before
doing anything else.
* shared_info.h (mount_info::cygdrive_posix_path): Make public.
2005-08-25 Corinna Vinschen <corinna@vinschen.de>
* path.cc (realpath): Drop call to mount_info::conv_to_posix_path

View File

@ -215,6 +215,7 @@ static int
normalize_posix_path (const char *src, char *dst, char *&tail)
{
const char *in_src = src;
char *dst_start = dst;
syscall_printf ("src %s", src);
if (isdrive (src) || *src == '\\')
@ -226,9 +227,11 @@ normalize_posix_path (const char *src, char *dst, char *&tail)
if (!cygheap->cwd.get (dst))
return get_errno ();
tail = strchr (tail, '\0');
if (isslash (dst[0]) && isslash (dst[1]))
++dst_start;
if (*src == '.')
{
if (tail == dst + 1 && *dst == '/')
if (tail == dst_start + 1 && *dst_start == '/')
tail--;
goto sawdot;
}
@ -237,7 +240,10 @@ normalize_posix_path (const char *src, char *dst, char *&tail)
}
/* Two leading /'s? If so, preserve them. */
else if (isslash (src[1]) && !isslash (src[2]))
*tail++ = *src++;
{
*tail++ = *src++;
++dst_start;
}
while (*src)
{
@ -271,7 +277,7 @@ normalize_posix_path (const char *src, char *dst, char *&tail)
break;
else
{
while (tail > dst && !isslash (*--tail))
while (tail > dst_start && !isslash (*--tail))
continue;
src++;
}
@ -1111,7 +1117,7 @@ normalize_win32_path (const char *src, char *dst, char *&tail)
}
}
}
if (tail == dst && !isdrive(src) && isdirsep (*src))
if (tail == dst && !isdrive (src) && *src != '/')
{
if (beg_src_slash)
tail += cygheap->cwd.get_drive (dst);
@ -3661,13 +3667,26 @@ realpath (const char *path, char *resolved)
return NULL;
}
path_conv real_path (path, PC_SYM_FOLLOW | PC_POSIX, stat_suffixes);
/* Guard writing to a potentially invalid resolved. */
/* Guard reading from a potentially invalid path and writing to a
potentially invalid resolved. */
myfault efault;
if (efault.faulted (EFAULT))
return NULL;
char *tpath;
if (isdrive (path))
{
tpath = (char *) alloca (strlen (path)
+ strlen (mount_table->cygdrive)
+ 1);
mount_table->cygdrive_posix_path (path, tpath, 0);
}
else
tpath = (char *) path;
path_conv real_path (tpath, PC_SYM_FOLLOW | PC_POSIX, stat_suffixes);
/* Linux has this funny non-standard extension. If "resolved" is NULL,
realpath mallocs the space by itself and returns it to the application.
The application is responsible for calling free() then. This extension

View File

@ -90,6 +90,7 @@ class mount_info
int remove_cygdrive_info_from_registry (const char *cygdrive_prefix, unsigned flags);
int get_cygdrive_info (char *user, char *system, char* user_flags,
char* system_flags);
void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p);
private:
@ -99,7 +100,6 @@ class mount_info
void to_registry ();
int cygdrive_win32_path (const char *src, char *dst, int& unit);
void cygdrive_posix_path (const char *src, char *dst, int trailing_slash_p);
void read_cygdrive_info_from_registry ();
};