OSDN Git Service

* path.h: Create new input path flag PATH_NEEDDIR.
authorcgf <cgf>
Tue, 19 Sep 2000 03:22:44 +0000 (03:22 +0000)
committercgf <cgf>
Tue, 19 Sep 2000 03:22:44 +0000 (03:22 +0000)
* 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.

winsup/cygwin/ChangeLog
winsup/cygwin/path.cc
winsup/cygwin/path.h

index 366daf6..1fcf38f 100644 (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>
 
        * fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which
 Mon Sep 18 19:44:08 2000  Christopher Faylor <cgf@cygnus.com>
 
        * fhandler_tty.cc (fhandler_tty_slave::write): Correct typo which
index 5f40ee1..07e1829 100644 (file)
@@ -189,6 +189,16 @@ path_conv::check (const char *src, unsigned opt,
   for (;;)
     {
       MALLOC_CHECK;
   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,
       /* 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;
          else
            {
              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++)
        *p++ = *tail == '\\' ? '/' : *tail;
       *p = '\0';
       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];
   HANDLE h;
   int res = 0;
   char extbuf[MAX_PATH + 5];
+  int needdir;
   const char *path = in_path;
 
   if (!suffixes)
   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;
   is_symlink = TRUE;
 
   error = 0;
+  if (!(pflags & PATH_NEEDDIR))
+    needdir = 0;
+  else
+    {
+      pflags &= ~PATH_NEEDDIR;
+      needdir = 1;
+    }
   do
     {
       if (!next_suffix (ext_here, suffixes))
   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) &&
 
       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;
        {
          debug_printf ("%s is a non-directory", path);
          error = ENOTDIR;
index 4c7f2c0..fdfbfdb 100644 (file)
@@ -36,6 +36,7 @@ enum path_types
   PATH_BINARY = MOUNT_BINARY,
   PATH_EXEC = MOUNT_EXEC,
   PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC,
   PATH_BINARY = MOUNT_BINARY,
   PATH_EXEC = MOUNT_EXEC,
   PATH_CYGWIN_EXEC = MOUNT_CYGWIN_EXEC,
+  PATH_NEEDDIR = 0x20000000,
   PATH_SOCKET =  0x40000000,
   PATH_HASACLS = 0x80000000
 };
   PATH_SOCKET =  0x40000000,
   PATH_HASACLS = 0x80000000
 };