diff options
Diffstat (limited to 'lib-src')
-rw-r--r-- | lib-src/emacsclient.c | 47 |
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 } |