From 50f271cb5a8a9cc415efb465023724d3d73937c8 Mon Sep 17 00:00:00 2001 From: Juanma Barranquero Date: Wed, 20 Feb 2008 12:06:52 +0000 Subject: [PATCH] (main) [WINDOWSNT]: Understand DRIVE:NAME, where NAME is relative to DRIVE'S current directory. --- lib-src/ChangeLog | 5 ++++ lib-src/emacsclient.c | 58 ++++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 1fee2324f54..3ce9155764a 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,8 @@ +2008-02-20 Juanma Barranquero + + * emacsclient.c (main) [WINDOWSNT]: Understand DRIVE:NAME, + where NAME is relative to DRIVE'S current directory. + 2008-02-15 Juanma Barranquero * emacsclient.c (print_help_and_exit): Show -d option on Windows. diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 7c537eb8c4e..1ccd8356ad2 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -848,38 +848,6 @@ file_name_absolute_p (filename) /* 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 @@ main (argc, argv) 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) -- 2.39.2