about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/Zle/computil.c43
2 files changed, 40 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 19a2a33d4..bc2f2465e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-22  Peter Stephenson  <p.w.stephenson@ntlworld.com>
+
+	* users/14732: Src/Zle/computil.c: we need to test X:/ rather
+	than X: for recent versions of Cygwin.
+
 2010-01-21  Peter Stephenson  <pws@csr.com>
 
 	* users/14723: Src/pattern.c: invalid character conversions
@@ -12623,5 +12628,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.4870 $
+* $Revision: 1.4871 $
 *****************************************************
diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c
index 17d69411d..32dd401b3 100644
--- a/Src/Zle/computil.c
+++ b/Src/Zle/computil.c
@@ -4050,19 +4050,44 @@ cfp_test_exact(LinkList names, char **accept, char *skipped)
     for (node = firstnode(names); node; incnode(node)) {
 	l = strlen(p = (char *) getdata(node));
 	if (l + sl < PATH_MAX2) {
+#ifdef __CYGWIN__
+	    char *testbuf;
+#define TESTBUF testbuf
+#else
+#define TESTBUF buf
+#endif
 	    strcpy(buf, p);
 	    strcpy(buf + l, suf);
 #ifdef __CYGWIN__
-	    /*
-	     * If accept-exact is not set, accept this only if
-	     * it looks like a special file such as a drive.
-	     * We still test if it exists.
-	     */
-	    if (accept_off &&
-		(strchr(buf, '/') || buf[strlen(buf)-1] != ':'))
-		continue;
+	    if (accept_off) {
+		int sl = strlen(buf);
+		/*
+		 * If accept-exact is not set, accept this only if
+		 * it looks like a special file such as a drive.
+		 * We still test if it exists.
+		 */
+		if (!sl || strchr(buf, '/') || buf[sl-1] != ':')
+		    continue;
+		if (sl == 2) {
+		    /*
+		     * Recent versions of Cygwin only recognise "c:/",
+		     * but not "c:", as special directories.  So
+		     * we have to append the slash for the purpose of
+		     * the test.
+		     */
+		    testbuf = zhalloc(sl + 2);
+		    strcpy(testbuf, buf);
+		    testbuf[sl] = '/';
+		    testbuf[sl+1] = '\0';
+		} else {
+		    /* Don't do this with stuff like PRN: */
+		    testbuf = buf;
+		}
+	    } else {
+		testbuf = buf;
+	    }
 #endif
-	    if (!ztat(buf, &st, 0)) {
+	    if (!ztat(TESTBUF, &st, 0)) {
 		/*
 		 * File exists; if accept-exact contained non-boolean
 		 * values it must match those, too.