XDG: Windows: resolve $LOCALAPPDATA, $TEMP (#5278)

After #4964 environment variables in the XDG "fallback" table are no
longer expanded.

Fallback to correctly expanded $LOCALAPPDATA, $TEMP. If that fails
(unlikely), fallback to hard-coded paths (e.g. ~/AppData/Local).

Closes #5255
This commit is contained in:
Rui Abreu Ferreira
2016-08-31 12:04:47 +01:00
committed by Justin M. Keyes
parent ca7a5c0ce7
commit 32156f06f7
2 changed files with 54 additions and 9 deletions

View File

@@ -16,20 +16,29 @@ static const char *xdg_env_vars[] = {
[kXDGDataDirs] = "XDG_DATA_DIRS",
};
#ifdef WIN32
static const char *const xdg_defaults_env_vars[] = {
[kXDGConfigHome] = "LOCALAPPDATA",
[kXDGDataHome] = "LOCALAPPDATA",
[kXDGCacheHome] = "TEMP",
[kXDGRuntimeDir] = NULL,
[kXDGConfigDirs] = NULL,
[kXDGDataDirs] = NULL,
};
#endif
/// Defaults for XDGVarType values
///
/// Used in case environment variables contain nothing. Need to be expanded.
static const char *const xdg_defaults[] = {
#ifdef WIN32
// Windows
[kXDGConfigHome] = "$LOCALAPPDATA",
[kXDGDataHome] = "$LOCALAPPDATA",
[kXDGCacheHome] = "$TEMP",
[kXDGConfigHome] = "~\\AppData\\Local",
[kXDGDataHome] = "~\\AppData\\Local",
[kXDGCacheHome] = "~\\AppData\\Local\\Temp",
[kXDGRuntimeDir] = NULL,
[kXDGConfigDirs] = NULL,
[kXDGDataDirs] = NULL,
#else
// Linux, BSD, CYGWIN, Apple
[kXDGConfigHome] = "~/.config",
[kXDGDataHome] = "~/.local/share",
[kXDGCacheHome] = "~/.cache",
@@ -50,7 +59,14 @@ char *stdpaths_get_xdg_var(const XDGVarType idx)
const char *const env = xdg_env_vars[idx];
const char *const fallback = xdg_defaults[idx];
const char *const env_val = os_getenv(env);
const char *env_val = os_getenv(env);
#ifdef WIN32
if (env_val == NULL) {
env_val = os_getenv(xdg_defaults_env_vars[idx]);
}
#endif
char *ret = NULL;
if (env_val != NULL) {
ret = xstrdup(env_val);