diff --git a/src/login.c b/src/login.c index 0c63ad5..7788d49 100644 --- a/src/login.c +++ b/src/login.c @@ -303,21 +303,41 @@ void remove_utmp_entry(struct utmp *entry) { void xauth(const char* display_name, const char* shell, char* pwd) { - const char* xauth_file = ".lyxauth"; + const char* xauth_file = "lyxauth"; char* xauth_dir = getenv("XDG_RUNTIME_DIR"); if ((xauth_dir == NULL) || (*xauth_dir == '\0')) { - xauth_dir = getenv("XDG_CONFIG_DIR"); + xauth_dir = getenv("XDG_CONFIG_HOME"); + struct stat sb; if ((xauth_dir == NULL) || (*xauth_dir == '\0')) + { + xauth_dir = strdup(pwd); + strcat(xauth_dir, "/.config"); + stat(xauth_dir, &sb); + if (S_ISDIR(sb.st_mode)) + { + strcat(xauth_dir, "/ly"); + } + else + { + xauth_dir = pwd; + xauth_file = ".lyxauth"; + } + } + else + { + strcat(xauth_dir, "/ly"); + } + + // If .config/ly/ or XDG_CONFIG_HOME/ly/ doesn't exist and can't create the directory, use pwd + // Passing pwd beforehand is safe since stat will always evaluate false + stat(xauth_dir, &sb); + if (!S_ISDIR(sb.st_mode) && mkdir(xauth_dir, 0777) == -1) { xauth_dir = pwd; - xauth_file = "lyxauth"; + xauth_file = ".lyxauth"; } } - else - { - xauth_file = "lyxauth"; - } // trim trailing slashes int i = strlen(xauth_dir) - 1;