* path.cc (path_conv::check): Don't use path_flags when converting to MS-DOS

syntax unless parsing tail of path component.  Stop parsing path when we reach
the 'root' of the path.  Correctly copy tail to path component.
This commit is contained in:
Christopher Faylor 2001-04-30 16:52:53 +00:00
parent 8abeff1ead
commit c0a45b92cc
2 changed files with 29 additions and 16 deletions

View File

@ -1,3 +1,10 @@
Mon Apr 30 12:35:40 2001 Christopher Faylor <cgf@cygnus.com>
* path.cc (path_conv::check): Don't use path_flags when converting to
MS-DOS syntax unless parsing tail of path component. Stop parsing path
when we reach the 'root' of the path. Correctly copy tail to path
component.
Sun Apr 29 22:28:06 2001 Christopher Faylor <cgf@cygnus.com> Sun Apr 29 22:28:06 2001 Christopher Faylor <cgf@cygnus.com>
* exceptions.cc (INIT_EXCEPTION_HANDLER): Eliminate. * exceptions.cc (INIT_EXCEPTION_HANDLER): Eliminate.

View File

@ -388,7 +388,7 @@ path_conv::check (const char *src, unsigned opt,
{ {
const suffix_info *suff; const suffix_info *suff;
char pathbuf[MAX_PATH]; char pathbuf[MAX_PATH];
char *full_path; char *full_path, *rel_path, *realpath;
/* Don't allow symlink.check to set anything in the path_conv /* Don't allow symlink.check to set anything in the path_conv
class if we're working on an inner component of the path */ class if we're working on an inner component of the path */
@ -396,17 +396,21 @@ path_conv::check (const char *src, unsigned opt,
{ {
suff = NULL; suff = NULL;
sym.pflags = 0; sym.pflags = 0;
full_path = pathbuf; rel_path = NULL;
realpath = full_path = pathbuf;
} }
else else
{ {
suff = suffixes; suff = suffixes;
sym.pflags = path_flags; sym.pflags = path_flags;
full_path = this->path; if (opt & PC_FULL)
rel_path = NULL, realpath = full_path = this->path;
else
realpath = rel_path = this->path, full_path = pathbuf;
} }
error = mount_table->conv_to_win32_path (path_copy, NULL, full_path, devn, error = mount_table->conv_to_win32_path (path_copy, rel_path, full_path, devn,
unit, &path_flags); unit, &sym.pflags);
if (devn != FH_BAD) if (devn != FH_BAD)
{ {
@ -415,24 +419,24 @@ path_conv::check (const char *src, unsigned opt,
} }
/* Eat trailing slashes */ /* Eat trailing slashes */
char *dostail = strchr (full_path, '\0'); char *dostail = strchr (realpath, '\0');
/* If path is only a drivename, Windows interprets it as the current working /* If path is only a drivename, Windows interprets it as the current working
directory on this drive instead of the root dir which is what we want. So directory on this drive instead of the root dir which is what we want. So
we need the trailing backslash in this case. */ we need the trailing backslash in this case. */
while (dostail > full_path + 3 && (*--dostail == '\\')) while (dostail > realpath + 3 && (*--dostail == '\\'))
*tail = '\0'; *tail = '\0';
if (full_path[0] && full_path[1] == ':' && full_path[2] == '\0') if (realpath[0] && realpath[1] == ':' && realpath[2] == '\0')
strcat (full_path, "\\"); strcat (realpath, "\\");
if ((opt & PC_SYM_IGNORE) && pcheck_case == PCHECK_RELAXED) if ((opt & PC_SYM_IGNORE) && pcheck_case == PCHECK_RELAXED)
{ {
fileattr = GetFileAttributesA (full_path); fileattr = GetFileAttributesA (realpath);
goto out; goto out;
} }
int len = sym.check (full_path, suff, opt); int len = sym.check (realpath, suff, opt);
if (sym.case_clash) if (sym.case_clash)
{ {
@ -507,7 +511,7 @@ path_conv::check (const char *src, unsigned opt,
if (tail != path_end) if (tail != path_end)
*tail = '/'; *tail = '/';
if (!newtail) if (!newtail || newtail == path_copy || (newtail == path_copy + 1 && newtail[-1] == '/'))
goto out; // all done goto out; // all done
tail = newtail; tail = newtail;
@ -527,7 +531,7 @@ path_conv::check (const char *src, unsigned opt,
MALLOC_CHECK; MALLOC_CHECK;
int taillen = strlen (tail + 1); int taillen = strlen (++tail);
int buflen = strlen (sym.contents); int buflen = strlen (sym.contents);
if (buflen + taillen > MAX_PATH) if (buflen + taillen > MAX_PATH)
{ {
@ -554,7 +558,7 @@ path_conv::check (const char *src, unsigned opt,
for (p = sym.contents; *p; p++) for (p = sym.contents; *p; p++)
*headptr++ = *p == '\\' ? '/' : *p; *headptr++ = *p == '\\' ? '/' : *p;
if (tail == path_end) if (tail >= path_end)
*headptr = '\0'; *headptr = '\0';
else else
{ {
@ -565,7 +569,6 @@ path_conv::check (const char *src, unsigned opt,
src = tmp_buf; src = tmp_buf;
} }
/*fillin:*/
if (!(opt & PC_SYM_CONTENTS)) if (!(opt & PC_SYM_CONTENTS))
add_ext_from_sym (sym); add_ext_from_sym (sym);
@ -586,7 +589,10 @@ out:
DWORD serial, volflags; DWORD serial, volflags;
char fs_name[16]; char fs_name[16];
strcpy (tmp_buf, this->path); if (isabspath (this->path))
strcpy (tmp_buf, this->path);
else
cygheap->cwd.get (tmp_buf, 1, 1, MAX_PATH);
if (allow_ntsec && (!rootdir (tmp_buf) || if (allow_ntsec && (!rootdir (tmp_buf) ||
!GetVolumeInformation (tmp_buf, NULL, 0, &serial, NULL, !GetVolumeInformation (tmp_buf, NULL, 0, &serial, NULL,
&volflags, fs_name, 16))) &volflags, fs_name, 16)))