summaryrefslogtreecommitdiff
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.