* bitmaps/README:
[bpt/emacs.git] / lib-src / emacsclient.c
index a39376b..8f0231d 100644 (file)
@@ -4,10 +4,10 @@
 
 This file is part of GNU Emacs.
 
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,13 +15,9 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA.  */
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
-#define NO_SHORTNAMES
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -68,15 +64,11 @@ Boston, MA 02110-1301, USA.  */
 #include <unistd.h>
 #endif
 
-#ifdef VMS
-# include "vms-pwd.h"
-#else /* not VMS */
 #ifdef WINDOWSNT
 # include <io.h>
 #else /* not WINDOWSNT */
 # include <pwd.h>
 #endif /* not WINDOWSNT */
-#endif /* not VMS */
 #include <sys/stat.h>
 
 #include <signal.h>
@@ -573,7 +565,7 @@ decode_options (argc, argv)
 
   if (!tty && display)
     window_system = 1;
-#if !defined (WINDOWSNT) && !defined (HAVE_CARBON)
+#if !defined (WINDOWSNT)
   else if (!current_frame)
     tty = 1;
 #endif
@@ -613,10 +605,8 @@ The following OPTIONS are accepted:\n\
 -c, --create-frame     Create a new frame instead of trying to\n\
                        use the current Emacs frame\n\
 -e, --eval             Evaluate the FILE arguments as ELisp expressions\n\
--n, --no-wait          Don't wait for the server to return\n"
-#ifndef WINDOWSNT
-"-d, --display=DISPLAY Visit the file in the given display\n"
-#endif
+-n, --no-wait          Don't wait for the server to return\n\
+-d, --display=DISPLAY  Visit the file in the given display\n"
 #ifndef NO_SOCKETS_IN_FILE_SYSTEM
 "-s, --socket-name=FILENAME\n\
                        Set filename of the UNIX socket for communication\n"
@@ -850,38 +840,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;
@@ -1537,8 +1495,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)