# HG changeset patch # User Juanma Barranquero # Date 1203509176 0 # Node ID 098ab8b8e2cb8580e26209d1c9200631a74f1481 # Parent 151fd1a3ee3f5fbb54ddfa16b3453e0b7a53436c (main) [WINDOWSNT]: Understand DRIVE:NAME, where NAME is relative to DRIVE'S current directory. diff -r 151fd1a3ee3f -r 098ab8b8e2cb lib-src/emacsclient.c --- a/lib-src/emacsclient.c Wed Feb 20 11:27:28 2008 +0000 +++ b/lib-src/emacsclient.c Wed Feb 20 12:06:16 2008 +0000 @@ -848,38 +848,6 @@ /* Both \xxx and \\xxx\yyy are absolute. */ if (filename[0] == '\\') return TRUE; - - /* - FIXME: There's a corner case not dealt with, "x:y", where: - - 1) x is a valid drive designation (usually a letter in the A-Z range) - and y is a path, relative to the current directory on drive x. This - is absolute, *after* fixing the y part to include the current - directory in x. - - 2) x is a relative file name, and y is an NTFS stream name. This is a - correct relative path, but it is very unusual. - - The trouble is that first case items are also valid examples of the - second case, i.e., "c:test" can be understood as drive:path or as - file:stream. - - The "right" fix would involve checking whether - - the current drive/partition is NTFS, - - x is a valid (and accesible) drive designator, - - x:y already exists as a file:stream in the current directory, - - y already exists on the current directory of drive x, - - the auspices are favorable, - and then taking an "informed decision" based on the above. - - Whatever the result, Emacs currently does a very bad job of dealing - with NTFS file:streams: it cannot visit them, and the only way to - create one is by setting `buffer-file-name' to point to it (either - manually or with emacsclient). So perhaps resorting to 1) and ignoring - 2) for now is the right thing to do. - - Anyway, something to decide After the Release. - */ #endif return FALSE; @@ -1535,8 +1503,30 @@ else relative = 1; } - else if (! file_name_absolute_p (argv[i])) - relative = 1; + else if (! file_name_absolute_p (argv[i])) +#ifndef WINDOWSNT + relative = 1; +#else + /* Call GetFullPathName so filenames of the form X:Y, where X is + a valid drive designator, are interpreted as drive:path, not + file:stream, and treated as absolute. + The user can still pass a file:stream if desired (for example, + .\X:Y, but it is not very useful, as Emacs currently does a + very bad job of dealing wih NTFS streams. */ + { + char *filename = (char *) xmalloc (MAX_PATH); + DWORD size; + + size = GetFullPathName (argv[i], MAX_PATH, filename, NULL); + if (size > 0 && size < MAX_PATH) + argv[i] = filename; + else + { + relative = 1; + free (filename); + } + } +#endif send_to_emacs (emacs_socket, "-file "); if (relative)