* path.h: Create new input path flag PATH_NEEDDIR.

* path.cc (path::check): Detect trailing slash before converting to windows
path.  Tell symlink_info::check to check for directory if one is found.
(symlink_info::check): Set errno when path is not a directory if pflags &
PATH_NEEDDIR.
This commit is contained in:
Christopher Faylor 2000-09-19 03:22:45 +00:00
parent 45b80bb4ce
commit 6e604fb15d
3 changed files with 31 additions and 3 deletions

View File

@ -1,3 +1,12 @@
Mon Sep 18 23:17:19 2000 Christopher Faylor <cgf@cygnus.com>
* path.h: Create new input path flag PATH_NEEDDIR.
* path.cc (path::check): Detect trailing slash before converting to
windows path. Tell symlink_info::check to check for directory if one is
found.
(symlink_info::check): Set errno when path is not a directory if
pflags & PATH_NEEDDIR.
Mon Sep 18 19:44:08 2000 Christopher Faylor <cgf@cygnus.com> Mon Sep 18 19:44:08 2000 Christopher Faylor <cgf@cygnus.com>
* fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which * fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which

View File

@ -189,6 +189,16 @@ path_conv::check (const char *src, unsigned opt,
for (;;) for (;;)
{ {
MALLOC_CHECK; MALLOC_CHECK;
DWORD need_directory = 0;
char *p = strrchr (src, '/');
if (p)
{
if (strcmp (p, "/") == 0 || strcmp (p, "/.") == 0)
need_directory = PATH_NEEDDIR;
}
else if ((p = strrchr (src, '\\')) &&
(strcmp (p, "\\") == 0 || strcmp (p, "\\.") == 0))
need_directory = PATH_NEEDDIR;
/* Must look up path in mount table, etc. */ /* Must look up path in mount table, etc. */
error = cygwin_shared->mount.conv_to_win32_path (src, rel_path, error = cygwin_shared->mount.conv_to_win32_path (src, rel_path,
full_path, full_path,
@ -247,7 +257,7 @@ path_conv::check (const char *src, unsigned opt,
else else
{ {
suff = suffixes; suff = suffixes;
sym.pflags = path_flags; sym.pflags = path_flags | need_directory;
} }
int len = sym.check (path_copy, suff); int len = sym.check (path_copy, suff);
@ -317,7 +327,6 @@ path_conv::check (const char *src, unsigned opt,
} }
/* Copy tail of full_path to discovered symlink. */ /* Copy tail of full_path to discovered symlink. */
char *p;
for (p = sym.contents + buflen; *tail; tail++) for (p = sym.contents + buflen; *tail; tail++)
*p++ = *tail == '\\' ? '/' : *tail; *p++ = *tail == '\\' ? '/' : *tail;
*p = '\0'; *p = '\0';
@ -2175,6 +2184,7 @@ symlink_info::check (const char *in_path, const suffix_info *suffixes)
HANDLE h; HANDLE h;
int res = 0; int res = 0;
char extbuf[MAX_PATH + 5]; char extbuf[MAX_PATH + 5];
int needdir;
const char *path = in_path; const char *path = in_path;
if (!suffixes) if (!suffixes)
@ -2193,6 +2203,13 @@ symlink_info::check (const char *in_path, const suffix_info *suffixes)
is_symlink = TRUE; is_symlink = TRUE;
error = 0; error = 0;
if (!(pflags & PATH_NEEDDIR))
needdir = 0;
else
{
pflags &= ~PATH_NEEDDIR;
needdir = 1;
}
do do
{ {
if (!next_suffix (ext_here, suffixes)) if (!next_suffix (ext_here, suffixes))
@ -2217,7 +2234,8 @@ symlink_info::check (const char *in_path, const suffix_info *suffixes)
char *p = strrchr (path, '\\'); char *p = strrchr (path, '\\');
if (p && !(fileattr & FILE_ATTRIBUTE_DIRECTORY) && if (p && !(fileattr & FILE_ATTRIBUTE_DIRECTORY) &&
(*++p == '\0' || (*p == '.' && (*++p == '\0' || (*p == '.' && p[1] == '\0'))))) (needdir || *++p == '\0' ||
(*p == '.' && (*++p == '\0' || (*p == '.' && p[1] == '\0')))))
{ {
debug_printf ("%s is a non-directory", path); debug_printf ("%s is a non-directory", path);
error = ENOTDIR; error = ENOTDIR;

View File

@ -36,6 +36,7 @@ enum path_types
PATH_BINARY = MOUNT_BINARY, PATH_BINARY = MOUNT_BINARY,
PATH_EXEC = MOUNT_EXEC, PATH_EXEC = MOUNT_EXEC,
PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC, PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC,
PATH_NEEDDIR = 0x20000000,
PATH_SOCKET = 0x40000000, PATH_SOCKET = 0x40000000,
PATH_HASACLS = 0x80000000 PATH_HASACLS = 0x80000000
}; };