1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-07 06:50:23 -08:00

Set `default-directory' in *scratch* to the current directory of emacsclient.

* lib-src/emacsclient.c (get_current_dir_name): New function, copied here
  from sysdep.c.
  (main): Use it to send over the current directory.

* lisp/server.el (server-process-filter): Accept `-dir' command.  Set
  `default-directory' of the *scratch* buffer on connect, if applicable.

git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-539
This commit is contained in:
Karoly Lorentey 2006-03-26 16:34:35 +00:00
parent 59b3194ca9
commit 2828d5f9d4
3 changed files with 117 additions and 5 deletions

View file

@ -248,6 +248,83 @@ xstrdup (const char *s)
return result;
}
/* From sysdep.c */
#if !defined (HAVE_GET_CURRENT_DIR_NAME) || defined (BROKEN_GET_CURRENT_DIR_NAME)
/* Return the current working directory. Returns NULL on errors.
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 *buf;
char *pwd;
struct stat dotstat, pwdstat;
/* If PWD is accurate, use it instead of calling getwd. PWD is
sometimes a nicer name, and using it may avoid a fatal error if a
parent directory is searchable but not readable. */
if ((pwd = getenv ("PWD")) != 0
&& (IS_DIRECTORY_SEP (*pwd) || (*pwd && IS_DEVICE_SEP (pwd[1])))
&& stat (pwd, &pwdstat) == 0
&& stat (".", &dotstat) == 0
&& dotstat.st_ino == pwdstat.st_ino
&& dotstat.st_dev == pwdstat.st_dev
#ifdef MAXPATHLEN
&& strlen (pwd) < MAXPATHLEN
#endif
)
{
buf = (char *) malloc (strlen (pwd) + 1);
if (!buf)
return NULL;
strcpy (buf, pwd);
}
#ifdef HAVE_GETCWD
else
{
size_t buf_size = 1024;
buf = (char *) malloc (buf_size);
if (!buf)
return NULL;
for (;;)
{
if (getcwd (buf, buf_size) == buf)
break;
if (errno != ERANGE)
{
int tmp_errno = errno;
free (buf);
errno = tmp_errno;
return NULL;
}
buf_size *= 2;
buf = (char *) realloc (buf, buf_size);
if (!buf)
return NULL;
}
}
#else
else
{
/* We need MAXPATHLEN here. */
buf = (char *) malloc (MAXPATHLEN + 1);
if (!buf)
return NULL;
if (getwd (buf) == NULL)
{
int tmp_errno = errno;
free (buf);
errno = tmp_errno;
return NULL;
}
}
#endif
return buf;
}
#endif
/* In STR, insert a & before each &, each space, each newline, and
any initial -. Change spaces to underscores, too, so that the
return value never contains a space.
@ -709,6 +786,20 @@ To start the server in Emacs, type \"M-x server-start\".\n",
}
}
/* Send over our current directory. */
if (!current_frame)
{
char *dir = get_current_dir_name ();
if (dir)
{
fprintf (out, "-dir ");
quote_argument (dir, out);
fprintf (out, "/");
fprintf (out, " ");
free (dir);
}
}
retry:
if (nowait)
fprintf (out, "-nowait ");