From 40264fdea9f9ef4da000bfe704316cabf6fd225a Mon Sep 17 00:00:00 2001 From: Alison Watson Date: Mon, 25 Nov 2019 01:00:00 -0500 Subject: [PATCH] make userdir handling vital, use XDG standard directories --- CMakeLists.txt | 2 - source/sys_sdl_unix.c | 98 ++++++++++++++++++++++++------------------- 2 files changed, 55 insertions(+), 45 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0a79965..0897bb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,8 +169,6 @@ add_executable(quake WIN32 target_compile_definitions( quake PUBLIC - -DDO_USERDIRS=1 - -DUSE_SDL2=1 -DUSE_CODEC_FLAC=1 -DUSE_CODEC_VORBIS=1 -DUSE_CODEC_OPUS=1 diff --git a/source/sys_sdl_unix.c b/source/sys_sdl_unix.c index 5338a69..6ff06d4 100644 --- a/source/sys_sdl_unix.c +++ b/source/sys_sdl_unix.c @@ -34,9 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include -#ifdef DO_USERDIRS #include -#endif #include @@ -228,42 +226,49 @@ static int Sys_NumCPUs (void) } #endif -static char cwd[MAX_OSPATH]; -#ifdef DO_USERDIRS -static char userdir[MAX_OSPATH]; +static char const *Sys_GetHomeDir(void) +{ + struct passwd *pwent; + + pwent = getpwuid(getuid()); + + if(pwent == NULL) + { + perror("getpwuid"); + return NULL; + } + + return pwent->pw_dir ? pwent->pw_dir : getenv("HOME"); +} + +static char const *Sys_GetUserDir(void) +{ + static char user_dir[MAX_OSPATH]; + static char app_name[] = "AGWQuake"; + + size_t n; + char const *home_dir; + #ifdef PLATFORM_OSX -#define SYS_USERDIR "Library/Application Support/QuakeSpasm" + if(!(home_dir = Sys_GetHomeDir())) + return NULL; + + q_snprintf(user_dir, sizeof(user_dir), "%s/Library/Application Support/%s", home_dir, app_name); #else -#define SYS_USERDIR ".quakespasm" + char const *system_dir; + + if((system_dir = getenv("XDG_DATA_HOME"))) + q_snprintf(user_dir, sizeof(user_dir), "%s/%s/%s", home_dir, system_dir, app_name); + else + { + if(!(home_dir = Sys_GetHomeDir())) + return NULL; + q_snprintf(user_dir, sizeof(user_dir), "%s/.local/share/%s", home_dir, app_name); + } #endif -static void Sys_GetUserdir (char *dst, size_t dstsize) -{ - size_t n; - const char *home_dir = NULL; - struct passwd *pwent; - - pwent = getpwuid( getuid() ); - if (pwent == NULL) - perror("getpwuid"); - else - home_dir = pwent->pw_dir; - if (home_dir == NULL) - home_dir = getenv("HOME"); - if (home_dir == NULL) - Sys_Error ("Couldn't determine userspace directory"); - -/* what would be a maximum path for a file in the user's directory... - * $HOME/SYS_USERDIR/game_dir/dirname1/dirname2/dirname3/filename.ext - * still fits in the MAX_OSPATH == 256 definition, but just in case : - */ - n = strlen(home_dir) + strlen(SYS_USERDIR) + 50; - if (n >= dstsize) - Sys_Error ("Insufficient array size for userspace directory"); - - q_snprintf (dst, dstsize, "%s/%s", home_dir, SYS_USERDIR); + return user_dir; } -#endif /* DO_USERDIRS */ #ifdef PLATFORM_OSX static char *OSX_StripAppBundle (char *dir) @@ -327,18 +332,25 @@ static void Sys_GetBasedir (char *argv0, char *dst, size_t dstsize) void Sys_Init (void) { - memset (cwd, 0, sizeof(cwd)); + static char cwd[MAX_OSPATH]; + + char const *user_dir; + + /* set base dir to current directory */ + memset(cwd, 0, sizeof(cwd)); Sys_GetBasedir(host_parms->argv[0], cwd, sizeof(cwd)); host_parms->basedir = cwd; -#ifndef DO_USERDIRS - host_parms->userdir = host_parms->basedir; /* code elsewhere relies on this ! */ -#else - memset (userdir, 0, sizeof(userdir)); - Sys_GetUserdir(userdir, sizeof(userdir)); - Sys_mkdir (userdir); - host_parms->userdir = userdir; -#endif - host_parms->numcpus = Sys_NumCPUs (); + + /* check for user directory, or use base dir */ + if((user_dir = Sys_GetUserDir())) + { + Sys_mkdir(user_dir); + host_parms->userdir = user_dir; + } + else + host_parms->userdir = host_parms->basedir; + + host_parms->numcpus = Sys_NumCPUs(); Sys_Printf("Detected %d CPUs.\n", host_parms->numcpus); }