diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 366daf65d..1fcf38ffb 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +Mon Sep 18 23:17:19 2000 Christopher Faylor + + * 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 * fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index 5f40ee1b0..07e182979 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -189,6 +189,16 @@ path_conv::check (const char *src, unsigned opt, for (;;) { 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. */ error = cygwin_shared->mount.conv_to_win32_path (src, rel_path, full_path, @@ -247,7 +257,7 @@ path_conv::check (const char *src, unsigned opt, else { suff = suffixes; - sym.pflags = path_flags; + sym.pflags = path_flags | need_directory; } 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. */ - char *p; for (p = sym.contents + buflen; *tail; tail++) *p++ = *tail == '\\' ? '/' : *tail; *p = '\0'; @@ -2175,6 +2184,7 @@ symlink_info::check (const char *in_path, const suffix_info *suffixes) HANDLE h; int res = 0; char extbuf[MAX_PATH + 5]; + int needdir; const char *path = in_path; if (!suffixes) @@ -2193,6 +2203,13 @@ symlink_info::check (const char *in_path, const suffix_info *suffixes) is_symlink = TRUE; error = 0; + if (!(pflags & PATH_NEEDDIR)) + needdir = 0; + else + { + pflags &= ~PATH_NEEDDIR; + needdir = 1; + } do { 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, '\\'); 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); error = ENOTDIR; diff --git a/winsup/cygwin/path.h b/winsup/cygwin/path.h index 4c7f2c0e2..fdfbfdbba 100644 --- a/winsup/cygwin/path.h +++ b/winsup/cygwin/path.h @@ -36,6 +36,7 @@ enum path_types PATH_BINARY = MOUNT_BINARY, PATH_EXEC = MOUNT_EXEC, PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC, + PATH_NEEDDIR = 0x20000000, PATH_SOCKET = 0x40000000, PATH_HASACLS = 0x80000000 };