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
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
#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>
/* Return the current working directory. Returns NULL on errors.
- Any other returned value must be freed with free. This is used
+ Any other returned value must be freed with free. This is used
only when get_current_dir_name is not defined on the system. */
char*
get_current_dir_name ()
char **argv;
{
alternate_editor = egetenv ("ALTERNATE_EDITOR");
-#ifndef WINDOWSNT
- display = egetenv ("DISPLAY");
- if (display && strlen (display) == 0)
- display = NULL;
-#endif
while (1)
{
server_file = optarg;
break;
-#ifndef WINDOWSNT
+ /* We used to disallow this argument in w32, but it seems better
+ to allow it, for the occasional case where the user is
+ connecting with a w32 client to a server compiled with X11
+ support. */
+#if 1 /* !defined WINDOWS */
case 'd':
display = optarg;
break;
}
}
+ /* We used to set `display' to $DISPLAY by default, but this changed the
+ default behavior and is sometimes inconvenient. So instead of forcing
+ users to say "--display ''" when they want to use Emacs's existing tty
+ or display connection, we force them to use "--display $DISPLAY" if
+ they want Emacs to connect to their current display.
+ -c still implicitly passes --display $DISPLAY unless -t was specified
+ so as to try and mimick the behavior of `emacs' which either uses
+ the current tty or the current $DISPLAY. */
+ if (!current_frame && !tty && !display)
+ display = egetenv ("DISPLAY");
+
+ if (display && strlen (display) == 0)
+ display = NULL;
+
if (!tty && display)
window_system = 1;
-#if !defined (WINDOWSNT) && !defined (HAVE_CARBON)
- else
+#if !defined (WINDOWSNT)
+ else if (!current_frame)
tty = 1;
#endif
-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"
/* 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;
send_to_emacs (s, "-auth ");
send_to_emacs (s, auth_string);
- send_to_emacs (s, "\n");
+ send_to_emacs (s, " ");
return s;
}
if (emacs_socket)
send_to_emacs (emacs_socket, "-suspend \n");
- /* Unblock this signal and call the default handler by temprarily
+ /* Unblock this signal and call the default handler by temporarily
changing the handler and resignalling. */
sigprocmask (SIG_BLOCK, NULL, &set);
sigdelset (&set, signalnum);
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)