Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-16 Thread Corinna Vinschen
On Oct 13 14:06, Gary Johnson wrote:
 I thought the purpose of Cygwin was to provide a Linux-like 
 environment for applications, so that, for example, one could simply 
 recompile under Cygwin an application written for Linux and not have 
 to rewrite the file-handling routines to recognize DOS file names.
 That's the purpose of the cygdrive directory, is it not?
 
 It seems to me that if DOS paths do work, usually, it's because 
 the application was written to deal with them or it never looks at 
 any file names, but simply hands them whole to the Cygwin file I/O 
 API.

You're right.  But vim is not a Linux application.  It tries hard to
accomodate many non-Linux systems like OS/2, Windows, VMS, Amiga and,
fwiw, any Unix flavor.

DOS paths are supported in vim anyway, and even os_unix.c makes
concessions to DOS paths in the OS2 case already.  That's why I think
adding a Cygwin case to support DOS and POSIX paths simultaneously
would be ok.


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


[PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
Hi,

I got a report on the Cygwin mailing list that the following message
appears when trying to open /etc/hosts in vim:

  E303: Unable to open swap file for /etc/hosts, recovery impossible

What happens is this:

/etc/hosts is by default a symbolic link which points to the hosts file
in the Windows system directory.  The symbolic link is created as a link
to the DOS path, for instance:

  $ ls -l /etc/hosts
  lrwxrwxrwx 1 corinna None 37 Oct 13 18:32 /etc/hosts - 
c:\WINDOWS\system32\drivers\etc\hosts

By stracing vim I found that vim was trying to create a swap file
called /tmp/c:\WINDOWS\system32\drivers\etc\hosts.

Cygwin is mostly treated as Unix target in vim, which is basically
correct.  However, since Cygwin allows POSIX paths as well as DOS paths,
there are both types of absolute paths.

Below is a patch which works for me, though I'm not sure if it's
complete enough to catch all cases.  There's code for OS2 in os_unix.c
which I reused, plus a new definition in mch_isFullName for the absolute
path on Cygwin.

I'd be grateful if the below or a more feasible patch which solves the
above problem, could be applied to vim.


Thanks in advance,
Corinna


--- os_unix.c.orig  2006-10-13 18:40:34.898586400 +0200
+++ os_unix.c   2006-10-13 19:01:44.398373000 +0200
@@ -2213,7 +2213,7 @@ mch_FullName(fname, buf, len, force)
 intforce;  /* also expand when already absolute 
path */
 {
 intl;
-#ifdef OS2
+#if defined (OS2) || defined (__CYGWIN__)
 intonly_drive; /* file name is only a drive letter */
 #endif
 #ifdef HAVE_FCHDIR
@@ -2236,7 +2236,7 @@ mch_FullName(fname, buf, len, force)
 * and then do the getwd() (and get back to where we were).
 * This will get the correct path name with ../ things.
 */
-#ifdef OS2
+#if defined (OS2) || defined (__CYGWIN__)
only_drive = 0;
if (((p = vim_strrchr(fname, '/')) != NULL)
|| ((p = vim_strrchr(fname, '\\')) != NULL)
@@ -2369,7 +2369,15 @@ mch_isFullName(fname)
(strchr((char *)fname,'[')  strchr((char *)fname,']'))||
(strchr((char *)fname,'')  strchr((char *)fname,''))   );
 # else
+#  ifdef __CYGWIN__
+/* POSIX and DOS paths are possible. */
+return (*fname == '/' || *fname == '~'
+   || (isalpha (fname[0])  fname[1] == ':'
+(fname[2] == '/' || fname[2] == '\\'))
+   || (fname[0] == '\\'  fname[1] == '\\'));
+#  else
 return (*fname == '/' || *fname == '~');
+#  endif
 # endif
 #endif
 }


-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
On Oct 13 21:16, Bram Moolenaar wrote:
 Corinna Vinschen wrote:
 
  I got a report on the Cygwin mailing list that the following message
  appears when trying to open /etc/hosts in vim:
  
E303: Unable to open swap file for /etc/hosts, recovery impossible
  
  What happens is this:
  
  /etc/hosts is by default a symbolic link which points to the hosts file
  in the Windows system directory.  The symbolic link is created as a link
  to the DOS path, for instance:
  
$ ls -l /etc/hosts
lrwxrwxrwx 1 corinna None 37 Oct 13 18:32 /etc/hosts - 
  c:\WINDOWS\system32\drivers\etc\hosts
  
  By stracing vim I found that vim was trying to create a swap file
  called /tmp/c:\WINDOWS\system32\drivers\etc\hosts.
  
  Cygwin is mostly treated as Unix target in vim, which is basically
  correct.  However, since Cygwin allows POSIX paths as well as DOS paths,
  there are both types of absolute paths.
  
  Below is a patch which works for me, though I'm not sure if it's
  complete enough to catch all cases.  There's code for OS2 in os_unix.c
  which I reused, plus a new definition in mch_isFullName for the absolute
  path on Cygwin.
  
  I'd be grateful if the below or a more feasible patch which solves the
  above problem, could be applied to vim.
 
 I think this fixes only one specific problem.  When Vim is compiled for
 Unix it does not recognize DOS paths.  And that matters in many places
 (e.g., search for CASE_INSENSITIVE_FILENAME and BACKSLASH_IN_FILENAME).
 Also behavior of a backslash in a file name changes.  Making Vim for
 Unix handle these things will be an awful lot of work...

True enough.  But maybe fixing these problems as they turn up might
be a helpful approach?  Anyway, what's noticable here is the fact
that this is a new problem in vim 7.  It wasn't present in vim 6.4
so it is a regression.


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
On Oct 13 21:33, Corinna Vinschen wrote:
 On Oct 13 21:16, Bram Moolenaar wrote:
  Corinna Vinschen wrote:
   [...]
   Below is a patch which works for me, though I'm not sure if it's
   complete enough to catch all cases.  There's code for OS2 in os_unix.c
   which I reused, plus a new definition in mch_isFullName for the absolute
   path on Cygwin.
   
   I'd be grateful if the below or a more feasible patch which solves the
   above problem, could be applied to vim.
  
  I think this fixes only one specific problem.  When Vim is compiled for
  Unix it does not recognize DOS paths.  And that matters in many places
  (e.g., search for CASE_INSENSITIVE_FILENAME and BACKSLASH_IN_FILENAME).
  Also behavior of a backslash in a file name changes.  Making Vim for
  Unix handle these things will be an awful lot of work...
 
 True enough.  But maybe fixing these problems as they turn up might
 be a helpful approach?  Anyway, what's noticable here is the fact
 that this is a new problem in vim 7.  It wasn't present in vim 6.4
 so it is a regression.

Interesting enough it works in 6.4 without doing anything similar to my
patch does to os_unix.c.  What's different in swap file handling between
6.4 and 7.0 so that it works in the former but doesn;t in the latter?


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Yakov Lerner

On 10/13/06, Corinna Vinschen [EMAIL PROTECTED] wrote:

Hi,

I got a report on the Cygwin mailing list that the following message
appears when trying to open /etc/hosts in vim:

  E303: Unable to open swap file for /etc/hosts, recovery impossible

What happens is this:

/etc/hosts is by default a symbolic link which points to the hosts file
in the Windows system directory.  The symbolic link is created as a link
to the DOS path, for instance:

  $ ls -l /etc/hosts
  lrwxrwxrwx 1 corinna None 37 Oct 13 18:32 /etc/hosts - 
c:\WINDOWS\system32\drivers\etc\hosts


I bet you can solve the problem by relinking /etc/hosts to
/cygdrive/c/windows/system32/drivers/etc/hosts.

This is how it *should* be linked.

It surprises me very much that your cygwin recognizes backslashes in
pathnames. I was under impression that cygwin does not recognize
backslashes in pathnames .. forward slashes as path separators.
I mean, I tried 'ls c:\windows' in cygwin and it does not work ..
strange  is it issue of version of cygwin ? I saw even
weirder  differences in cygwin behaviour ... fat32 vs ntfs differences...


Yakov



By stracing vim I found that vim was trying to create a swap file
called /tmp/c:\WINDOWS\system32\drivers\etc\hosts.

Cygwin is mostly treated as Unix target in vim, which is basically
correct.  However, since Cygwin allows POSIX paths as well as DOS paths,
there are both types of absolute paths.

Below is a patch which works for me, though I'm not sure if it's
complete enough to catch all cases.  There's code for OS2 in os_unix.c
which I reused, plus a new definition in mch_isFullName for the absolute
path on Cygwin.

I'd be grateful if the below or a more feasible patch which solves the
above problem, could be applied to vim.


Thanks in advance,
Corinna


--- os_unix.c.orig  2006-10-13 18:40:34.898586400 +0200
+++ os_unix.c   2006-10-13 19:01:44.398373000 +0200
@@ -2213,7 +2213,7 @@ mch_FullName(fname, buf, len, force)
 intforce;  /* also expand when already absolute 
path */
 {
 intl;
-#ifdef OS2
+#if defined (OS2) || defined (__CYGWIN__)
 intonly_drive; /* file name is only a drive letter */
 #endif
 #ifdef HAVE_FCHDIR
@@ -2236,7 +2236,7 @@ mch_FullName(fname, buf, len, force)
 * and then do the getwd() (and get back to where we were).
 * This will get the correct path name with ../ things.
 */
-#ifdef OS2
+#if defined (OS2) || defined (__CYGWIN__)
only_drive = 0;
if (((p = vim_strrchr(fname, '/')) != NULL)
|| ((p = vim_strrchr(fname, '\\')) != NULL)
@@ -2369,7 +2369,15 @@ mch_isFullName(fname)
(strchr((char *)fname,'[')  strchr((char *)fname,']'))||
(strchr((char *)fname,'')  strchr((char *)fname,''))   );
 # else
+#  ifdef __CYGWIN__
+/* POSIX and DOS paths are possible. */
+return (*fname == '/' || *fname == '~'
+   || (isalpha (fname[0])  fname[1] == ':'
+(fname[2] == '/' || fname[2] == '\\'))
+   || (fname[0] == '\\'  fname[1] == '\\'));
+#  else
 return (*fname == '/' || *fname == '~');
+#  endif
 # endif
 #endif
 }


--
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat



Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread A.J.Mechelynck

Corinna Vinschen wrote:

On Oct 13 21:33, Corinna Vinschen wrote:

On Oct 13 21:16, Bram Moolenaar wrote:

Corinna Vinschen wrote:

[...]
Below is a patch which works for me, though I'm not sure if it's
complete enough to catch all cases.  There's code for OS2 in os_unix.c
which I reused, plus a new definition in mch_isFullName for the absolute
path on Cygwin.

I'd be grateful if the below or a more feasible patch which solves the
above problem, could be applied to vim.

I think this fixes only one specific problem.  When Vim is compiled for
Unix it does not recognize DOS paths.  And that matters in many places
(e.g., search for CASE_INSENSITIVE_FILENAME and BACKSLASH_IN_FILENAME).
Also behavior of a backslash in a file name changes.  Making Vim for
Unix handle these things will be an awful lot of work...

True enough.  But maybe fixing these problems as they turn up might
be a helpful approach?  Anyway, what's noticable here is the fact
that this is a new problem in vim 7.  It wasn't present in vim 6.4
so it is a regression.


Interesting enough it works in 6.4 without doing anything similar to my
patch does to os_unix.c.  What's different in swap file handling between
6.4 and 7.0 so that it works in the former but doesn;t in the latter?


Corinna



Is your 6.4 Vim compiled for Cygwin or for native W32? What is the value of 
has(win32unix) ?



Best regards,
Tony.


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
On Oct 13 21:53, Yakov Lerner wrote:
 On 10/13/06, Corinna Vinschen [EMAIL PROTECTED] wrote:
 Hi,
 
 I got a report on the Cygwin mailing list that the following message
 appears when trying to open /etc/hosts in vim:
 
   E303: Unable to open swap file for /etc/hosts, recovery impossible
 
 What happens is this:
 
 /etc/hosts is by default a symbolic link which points to the hosts file
 in the Windows system directory.  The symbolic link is created as a link
 to the DOS path, for instance:
 
   $ ls -l /etc/hosts
   lrwxrwxrwx 1 corinna None 37 Oct 13 18:32 /etc/hosts - 
   c:\WINDOWS\system32\drivers\etc\hosts
 
 I bet you can solve the problem by relinking /etc/hosts to
 /cygdrive/c/windows/system32/drivers/etc/hosts.
 
 This is how it *should* be linked.

Sure, but that's not the problem.  If it's not /etc/hosts it's another
symlink created by a user.  DOS paths do work, usually.

 It surprises me very much that your cygwin recognizes backslashes in
 pathnames. I was under impression that cygwin does not recognize
 backslashes in pathnames .. forward slashes as path separators.
 I mean, I tried 'ls c:\windows' in cygwin and it does not work ..

Well, this isn't a Cygwin mailing list and what you're writing is not a
Cygwin problem.  Backslashes still have special meaning in POSIX shells.
Try

  ls c:\\windows

or

  ls 'c:\windows'


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Ilya Bobir

Yakov Lerner wrote:

[...]
I mean, I tried 'ls c:\windows' in cygwin and it does not work ..
strange  is it issue of version of cygwin ? I saw even
weirder  differences in cygwin behaviour ... fat32 vs ntfs differences...
Maybe this is because \ have a special meaning for bash or some other 
shell you use.  Try


   ls c:\\windows

works fine for me.

It is 100% off-topic on vim-dev list, so I'm sorry.



Yakov







Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread James Vega
On Fri, Oct 13, 2006 at 09:38:16PM +0200, Corinna Vinschen wrote:
 Interesting enough it works in 6.4 without doing anything similar to my
 patch does to os_unix.c.  What's different in swap file handling between
 6.4 and 7.0 so that it works in the former but doesn;t in the latter?

memline.c was changed for 7.0 as far as how Vim determined where to
store the swapfile when editing symlinks.  The change was to follow the
symlink, find the directory the actual file was in and key off that when
creating the swapfile so that editing the symlink and the actual file at
the same time would cause the 'swapfile already exists' message.  Maybe
this is related.  The relevant code is sectioned off by '#ifdef
HAVE_READLINK'/'#endif' sections in memline.c

James
-- 
GPG Key: 1024D/61326D40 2003-09-02 James Vega [EMAIL PROTECTED]


signature.asc
Description: Digital signature


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
On Oct 13 22:02, A.J.Mechelynck wrote:
 Corinna Vinschen wrote:
 Interesting enough it works in 6.4 without doing anything similar to my
 patch does to os_unix.c.  What's different in swap file handling between
 6.4 and 7.0 so that it works in the former but doesn;t in the latter?
 
 Is your 6.4 Vim compiled for Cygwin or for native W32? What is the value 
 of has(win32unix) ?

Hey, you're *seriously* asking this question? :)  has(win32unix) is 1
for both, vim 6.4 and 7.0.  I guess I didn't install a native vim for
at least 8 years or so.


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Corinna Vinschen
On Oct 13 16:06, James Vega wrote:
 On Fri, Oct 13, 2006 at 09:38:16PM +0200, Corinna Vinschen wrote:
  Interesting enough it works in 6.4 without doing anything similar to my
  patch does to os_unix.c.  What's different in swap file handling between
  6.4 and 7.0 so that it works in the former but doesn;t in the latter?
 
 memline.c was changed for 7.0 as far as how Vim determined where to
 store the swapfile when editing symlinks.  The change was to follow the
 symlink, find the directory the actual file was in and key off that when
 creating the swapfile so that editing the symlink and the actual file at
 the same time would cause the 'swapfile already exists' message.  Maybe
 this is related.  The relevant code is sectioned off by '#ifdef
 HAVE_READLINK'/'#endif' sections in memline.c

Thanks for this hint.  I'll look into that in the next couple of days.
It doesn't seem to be related to the actual directory in which to place
the swap file, though.  directory is set to /tmp in my example, so the
swap file should be created there.  And as the example shows, vim tries
to do that.  It just fails to extract the basename correctly from the
DOS path because it doesn't treat backslashes as path separators.

Btw., apparently vim doesn't use basename(3), even if the underlying
system provides it.  The Cygwin version of this function would return
the correct basename no matter what path separators have been used.


Corinna

-- 
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread Gary Johnson
On 2006-10-13, Corinna Vinschen [EMAIL PROTECTED] wrote:
 On Oct 13 21:53, Yakov Lerner wrote:
  On 10/13/06, Corinna Vinschen [EMAIL PROTECTED] wrote:
  Hi,
  
  I got a report on the Cygwin mailing list that the following message
  appears when trying to open /etc/hosts in vim:
  
E303: Unable to open swap file for /etc/hosts, recovery impossible
  
  What happens is this:
  
  /etc/hosts is by default a symbolic link which points to the hosts file
  in the Windows system directory.  The symbolic link is created as a link
  to the DOS path, for instance:
  
$ ls -l /etc/hosts
lrwxrwxrwx 1 corinna None 37 Oct 13 18:32 /etc/hosts - 
c:\WINDOWS\system32\drivers\etc\hosts
  
  I bet you can solve the problem by relinking /etc/hosts to
  /cygdrive/c/windows/system32/drivers/etc/hosts.
  
  This is how it *should* be linked.
 
 Sure, but that's not the problem.  If it's not /etc/hosts it's another
 symlink created by a user.  DOS paths do work, usually.

Hi Corinna,

I thought the purpose of Cygwin was to provide a Linux-like 
environment for applications, so that, for example, one could simply 
recompile under Cygwin an application written for Linux and not have 
to rewrite the file-handling routines to recognize DOS file names.
That's the purpose of the cygdrive directory, is it not?

It seems to me that if DOS paths do work, usually, it's because 
the application was written to deal with them or it never looks at 
any file names, but simply hands them whole to the Cygwin file I/O 
API.

As Yakov said, it seems to me that the proper solution is for Cygwin 
to link /etc/hosts to /cygdrive/c/windows/system32/drivers/etc/hosts.
If users have problems because they've mounted cygdrive someplace
else, or have created symbolic links to DOS file names, then to
quote someone on the cygwin list, WDDTT (Well Don't Do That Then).

Regards,
Gary

-- 
Gary Johnson | Agilent Technologies
[EMAIL PROTECTED] | Wireless Division
 | Spokane, Washington, USA


Re: [PATCH] cygwin: Trouble recognizing absolute path

2006-10-13 Thread James Vega
On Fri, Oct 13, 2006 at 10:34:40PM +0200, Corinna Vinschen wrote:
 On Oct 13 16:06, James Vega wrote:
  On Fri, Oct 13, 2006 at 09:38:16PM +0200, Corinna Vinschen wrote:
   Interesting enough it works in 6.4 without doing anything similar to my
   patch does to os_unix.c.  What's different in swap file handling between
   6.4 and 7.0 so that it works in the former but doesn;t in the latter?
  
  memline.c was changed for 7.0 as far as how Vim determined where to
  store the swapfile when editing symlinks.  The change was to follow the
  symlink, find the directory the actual file was in and key off that when
  creating the swapfile so that editing the symlink and the actual file at
  the same time would cause the 'swapfile already exists' message.  Maybe
  this is related.  The relevant code is sectioned off by '#ifdef
  HAVE_READLINK'/'#endif' sections in memline.c
 
 Thanks for this hint.  I'll look into that in the next couple of days.
 It doesn't seem to be related to the actual directory in which to place
 the swap file, though.  directory is set to /tmp in my example, so the
 swap file should be created there.

I misspoke slightly in my previous email.  The patch isn't purely about
where to store the file.  It primarily deals with determining what
actual file is being edited so that proper swapfile checking can be
performed.  In order to do this it has to resolve the symlink and
determines the absolute path for the file being edited.  It may be that
determining the absolute path is causing the mixup in path formats,
although that seems unlikely since it is a common function used
throughout Vim.

James
-- 
GPG Key: 1024D/61326D40 2003-09-02 James Vega [EMAIL PROTECTED]


signature.asc
Description: Digital signature