From ec46ff026e4b0adfe62dcbb2f5bd69a31f812362 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 22 Jan 2010 20:42:09 +0000 Subject: [PATCH] users/14732: Test X:/ rather than X: in Cygwin --- ChangeLog | 7 ++++++- Src/Zle/computil.c | 43 ++++++++++++++++++++++++++++++++++--------- 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 + + * users/14732: Src/Zle/computil.c: we need to test X:/ rather + than X: for recent versions of Cygwin. + 2010-01-21 Peter Stephenson * 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.