From a0c1938145bdd0e69bd464f32e66e56624977036 Mon Sep 17 00:00:00 2001
From: Christopher Faylor <me@cgf.cx>
Date: Thu, 6 Dec 2001 22:36:08 +0000
Subject: [PATCH] * path.cc (path_conv::check): Don't complain if /dev/x/foo
 when x doesn't exist. (mount_info::conv_to_win32_path): Keep translating when
 a /cygdrive is found. Don't attempt to translate to a device name when devn
 == FH_CYGDRIVE. (cygwin_conv_to_win32_path): Set buffer to empty on error.
 (cygwin_conv_to_full_win32_path): Ditto. * window.cc: Include unistd.h to
 verify definitions.

---
 winsup/cygwin/ChangeLog | 12 ++++++++++++
 winsup/cygwin/path.cc   | 26 +++++++++++++++-----------
 winsup/cygwin/window.cc |  1 +
 3 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 3437a2cd2..1167042e9 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,15 @@
+2001-12-06  Christopher Faylor  <cgf@redhat.com>
+
+	* path.cc (path_conv::check): Don't complain if /dev/x/foo when x
+	doesn't exist.
+	(mount_info::conv_to_win32_path): Keep translating when a /cygdrive is
+	found.  Don't attempt to translate to a device name when devn ==
+	FH_CYGDRIVE.
+	(cygwin_conv_to_win32_path): Set buffer to empty on error.
+	(cygwin_conv_to_full_win32_path): Ditto.
+
+	* window.cc: Include unistd.h to verify definitions.
+
 2001-12-05  Christopher Faylor  <cgf@redhat.com>
 
 	* dir.cc (opendir): Detect error return from build_fhandler_from_name.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 4938b46e2..a22c7abff 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -482,14 +482,16 @@ path_conv::check (const char *src, unsigned opt,
 	  /* devn should not be a device.  If it is, then stop parsing now. */
 	  if (devn != FH_BAD)
 	    {
-	      if (component)
-		{
-		  error = ENOTDIR;
-		  return;
-		}
 	      if (devn != FH_CYGDRIVE)
-		fileattr = 0;
-	      else
+		{
+		  fileattr = 0;
+		  if (component)
+		    {
+		      error = ENOTDIR;
+		      return;
+		    }
+		}
+	      else if (!component)
 		fileattr = !unit ? FILE_ATTRIBUTE_DIRECTORY
 				 : GetFileAttributes (full_path);
 	      goto out;		/* Found a device.  Stop parsing. */
@@ -1389,7 +1391,6 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
 	  dst[0] = '\0';
 	  if (mount_table->cygdrive_len > 1)
 	    devn = FH_CYGDRIVE;
-	  goto out;
 	}
       else if (cygdrive_win32_path (pathbuf, dst, unit))
 	{
@@ -1466,7 +1467,8 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
       *flags = mi->flags;
     }
 
-  win32_device_name (src_path, dst, devn, unit);
+  if (devn != FH_CYGDRIVE)
+    win32_device_name (src_path, dst, devn, unit);
 
  out:
   MALLOC_CHECK;
@@ -3287,11 +3289,12 @@ cygwin_conv_to_win32_path (const char *path, char *win32_path)
   path_conv p (path, PC_SYM_FOLLOW);
   if (p.error)
     {
+      win32_path[0] = '\0';
       set_errno (p.error);
       return -1;
     }
 
-  strcpy (win32_path, p.get_win32 ());
+  strcpy (win32_path, p);
   return 0;
 }
 
@@ -3301,11 +3304,12 @@ cygwin_conv_to_full_win32_path (const char *path, char *win32_path)
   path_conv p (path, PC_SYM_FOLLOW | PC_FULL);
   if (p.error)
     {
+      win32_path[0] = '\0';
       set_errno (p.error);
       return -1;
     }
 
-  strcpy (win32_path, p.get_win32 ());
+  strcpy (win32_path, p);
   return 0;
 }
 
diff --git a/winsup/cygwin/window.cc b/winsup/cygwin/window.cc
index dbff12b69..953f603ba 100644
--- a/winsup/cygwin/window.cc
+++ b/winsup/cygwin/window.cc
@@ -18,6 +18,7 @@ details. */
 #include <limits.h>
 #include <wingdi.h>
 #include <winuser.h>
+#include <unistd.h>
 #include "cygerrno.h"
 #include "perprocess.h"
 #include "security.h"