summaryrefslogtreecommitdiff
path: root/lib-src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2019-08-30 00:24:07 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2019-08-30 00:24:47 -0700
commit44f15b63dbe9a45921573197e08c8aaaed08412a (patch)
tree004ad6c462f0ceb19b5f24c535fcaa614d21043a /lib-src
parenta4144af909c3a6baf381659bf158e254b28ee002 (diff)
downloademacs-44f15b63dbe9a45921573197e08c8aaaed08412a.tar.gz
emacsclient: adjust to new config file location
* lib-src/emacsclient.c (open_config): New arg XDG, to respect XDG_CONFIG_HOME, consistently with Emacs proper. Caller changed. Use XDG convention if available, falling back on the old names if not.
Diffstat (limited to 'lib-src')
-rw-r--r--lib-src/emacsclient.c47
1 files changed, 32 insertions, 15 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index ba2721e8bc9..e9469f77c5e 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -914,22 +914,38 @@ initialize_sockets (void)
#endif /* WINDOWSNT */
-/* If the home directory is HOME, return the configuration file with
- basename CONFIG_FILE. Fail if there is no home directory or if the
- configuration file could not be opened. */
+/* If the home directory is HOME, and XDG_CONFIG_HOME's value is XDG,
+ return the configuration file with basename CONFIG_FILE. Fail if
+ the configuration file could not be opened. */
static FILE *
-open_config (char const *home, char const *config_file)
+open_config (char const *home, char const *xdg, char const *config_file)
{
- if (!home)
- return NULL;
- ptrdiff_t homelen = strlen (home);
- static char const emacs_d_server[] = "/.emacs.d/server/";
- ptrdiff_t suffixsize = sizeof emacs_d_server + strlen (config_file);
- char *configname = xmalloc (homelen + suffixsize);
- strcpy (stpcpy (stpcpy (configname, home), emacs_d_server), config_file);
-
- FILE *config = fopen (configname, "rb");
+ ptrdiff_t xdgsubdirsize = xdg ? strlen (xdg) + sizeof "/emacs/server/" : 0;
+ ptrdiff_t homesuffixsizemax = max (sizeof "/.config/emacs/server/",
+ sizeof "/.emacs.d/server/");
+ ptrdiff_t homesubdirsizemax = home ? strlen (home) + homesuffixsizemax : 0;
+ char *configname = xmalloc (max (xdgsubdirsize, homesubdirsizemax)
+ + strlen (config_file));
+ FILE *config;
+ if (xdg || home)
+ {
+ strcpy ((xdg
+ ? stpcpy (stpcpy (configname, xdg), "/emacs/server/")
+ : stpcpy (stpcpy (configname, home), "/.config/emacs/server/")),
+ config_file);
+ config = fopen (configname, "rb");
+ }
+ else
+ config = NULL;
+
+ if (! config && home)
+ {
+ strcpy (stpcpy (stpcpy (configname, home), "/.emacs.d/server/"),
+ config_file);
+ config = fopen (configname, "rb");
+ }
+
free (configname);
return config;
}
@@ -949,10 +965,11 @@ get_server_config (const char *config_file, struct sockaddr_in *server,
config = fopen (config_file, "rb");
else
{
- config = open_config (egetenv ("HOME"), config_file);
+ char const *xdg = egetenv ("XDG_CONFIG_HOME");
+ config = open_config (egetenv ("HOME"), xdg, config_file);
#ifdef WINDOWSNT
if (!config)
- config = open_config (egetenv ("APPDATA"), config_file);
+ config = open_config (egetenv ("APPDATA"), xdg, config_file);
#endif
}