initial experimental support for user directories, based on uhexen2 and tyrquake: ** against quakespasm svn revision 906. ** on-the-fly game directory switching not supported yet. ** minimally tested, needs more work. Index: Quake/sys_sdl_unix.c =================================================================== --- Quake/sys_sdl_unix.c (revision 906) +++ Quake/sys_sdl_unix.c (working copy) @@ -20,6 +20,8 @@ */ +#define USE_PASSWORD_FILE 1 + #include "quakedef.h" #include @@ -29,6 +31,9 @@ #include #include #include +#if USE_PASSWORD_FILE +#include +#endif /* USE_PASSWORD_FILE */ #if defined(SDL_FRAMEWORK) || defined(NO_SDL_CONFIG) #include @@ -143,9 +148,43 @@ return -1; } +#define SYS_USERDIR ".quakespasm" +static char userdir[MAX_OSPATH]; + +static void Sys_GetUserdir (char *dst, size_t dstsize) +{ + size_t n; + const char *home_dir = NULL; +#if USE_PASSWORD_FILE + struct passwd *pwent; + + pwent = getpwuid( getuid() ); + if (pwent == NULL) + perror("getpwuid"); + else + home_dir = pwent->pw_dir; +#endif + 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); +} + void Sys_Init (void) { - host_parms->userdir = host_parms->basedir; /* TODO: implement properly! */ + Sys_GetUserdir(userdir, sizeof(userdir)); + Sys_mkdir (userdir); + host_parms->userdir = userdir; } void Sys_mkdir (const char *path) Index: Quake/common.c =================================================================== --- Quake/common.c (revision 906) +++ Quake/common.c (working copy) @@ -1919,6 +1919,7 @@ static void COM_AddGameDirectory (const searchpath_t *search; pack_t *pak, *qspak; char pakfile[MAX_OSPATH]; + qboolean been_here = false; q_strlcpy (com_gamedir, va("%s/%s", base, dir), sizeof(com_gamedir)); @@ -1927,6 +1928,7 @@ static void COM_AddGameDirectory (const path_id = com_searchpaths->path_id << 1; else path_id = 1U; +_add_path: // add the directory to the search path search = (searchpath_t *) Z_Malloc(sizeof(searchpath_t)); search->path_id = path_id; @@ -1943,6 +1945,7 @@ static void COM_AddGameDirectory (const qspak = NULL; else { qboolean old = com_modified; + if (been_here) base = host_parms->basedir; q_snprintf (pakfile, sizeof(pakfile), "%s/quakespasm.pak", base); qspak = COM_LoadPackFile (pakfile); com_modified = old; @@ -1963,6 +1966,14 @@ static void COM_AddGameDirectory (const } if (!pak) break; } + + if (!been_here && host_parms->userdir != host_parms->basedir) + { + been_here = true; + q_strlcpy(com_gamedir, va("%s/%s", host_parms->userdir, dir), sizeof(com_gamedir)); + Sys_mkdir(com_gamedir); + goto _add_path; + } } /*