#define MAX_GAME_PATHS 10
char *homePath;
-qboolean homePathUsesDot;
char installPath[ MAX_OS_PATH ];
int numBasePaths;
gets the user's home dir (for ~/.q3a)
*/
-#ifdef WIN32
-#include <shlobj.h>
-#endif
char *LokiGetHomeDir( qboolean *usedot )
{
*usedot = qtrue;
#ifndef Q_UNIX
- #ifndef WIN32
- return NULL;
- #else
- static char buf[MAX_OS_PATH];
- TCHAR mydocsdir[MAX_PATH + 1];
- if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir))
- {
- snprintf(buf, sizeof(buf), "%s/My Games", mydocsdir);
- *usedot = qfalse;
- return buf;
- }
- return NULL;
- #endif
+ return NULL;
#else
char *home;
uid_t id;
struct passwd *pwd;
+ static char homeBuf[MAX_OS_PATH];
/* get the home environment variable */
endpwent();
}
- #ifdef __APPLE__
- {
- static char foo[MAX_OSPATH];
- snprintf(foo, sizeof(foo), "%s/Library/Application Support", home);
- if(access(foo, X_OK) == 0)
- {
- *usedot = qfalse;
- home = foo;
- }
- }
- #endif
+ snprintf(homeBuf, sizeof(homeBuf), "%s/.", home);
/* return it */
- return home;
+ return homeBuf;
#endif
}
void LokiInitPaths( char *argv0 )
{
- #ifndef Q_UNIX
- char *home;
-
- /* this is kinda crap, but hey */
- strcpy( installPath, "../" );
-
+ if(!homePath)
+ {
/* get home dir */
- home = LokiGetHomeDir(&homePathUsesDot);
+ home = LokiGetHomeDir();
if( home == NULL )
home = ".";
/* set home path */
homePath = home;
+ }
+
+ #ifndef Q_UNIX
+ char *home;
+
+ /* this is kinda crap, but hey */
+ strcpy( installPath, "../" );
#else
char temp[ MAX_OS_PATH ];
char last0[ 2 ];
qboolean found;
- /* get home dir */
- home = LokiGetHomeDir(&homePathUsesDot);
- if( home == NULL )
- home = ".";
-
/* do some path divining */
strcpy( temp, argv0 );
if( strrchr( argv0, '/' ) )
*(strrchr( installPath, '/' )) = '\0';
*(strrchr( installPath, '/' ) + 1) = '\0';
}
-
- /* set home path */
- homePath = home;
#endif
}
{
int i;
char temp[ MAX_OS_PATH ];
+ int l, homePathLen;
if(!homePath)
return;
if( path == NULL || path[ 0 ] == '\0' )
return;
- /* concatenate home dir and path */
- sprintf( temp, "%s/%s", homePath, homePathUsesDot ? path : (path+1) );
-
-#ifdef WIN32
+ /* strip leading dot, if homePath does not end in /. */
+ homePathLen = strlen(homePath);
+ if(!strcmp(path, ".")
{
- /* on Win32, we ONLY add it if the directory already exists */
- GDir *dir;
- dir = g_dir_open (temp, 0, NULL);
- if(!dir)
- return;
- g_dir_close(dir);
+ /* -fs_homebase . means that -fs_home is to be used as is */
+ strcpy(temp, homePath);
+ }
+ else if(homePathLen >= 2 && !strcmp(homePath + homePathLen - 2, "/."))
+ {
+ /* remove trailing /. of homePath */
+ homePathLen -= 2;
+
+ /* concatenate home dir and path */
+ sprintf( temp, "%.*s/%s", homePathLen, homePath, path );
}
-#endif
+ else
+ {
+ /* remove leading . of path */
+ if(path[0] == '.')
+ ++path;
+ /* concatenate home dir and path */
+ sprintf( temp, "%s/%s", homePath, path );
+ }
+
/* make a hole */
for( i = (MAX_BASE_PATHS - 2); i >= 0; i-- )
basePaths[ i + 1 ] = basePaths[ i ];
argv[ i ] = NULL;
}
- /* -fs_nohomebase */
+ /* -fs_home */
+ else if( strcmp( argv[ i ], "-fs_home" ) == 0 )
+ {
+ if( ++i >= *argc )
+ Error( "Out of arguments: No path specified after %s.", argv[ i - 1 ] );
+ argv[ i - 1 ] = NULL;
+ homePath = argv[i];
+ /* do we want to do this:
+ if(!homeBasePath)
+ homeBasePath = "."; // if only -fs_home is set, this shall be the FULL path!
+ */
+ argv[ i ] = NULL;
+ }
+
+ /* -fs_homebase */
else if( strcmp( argv[ i ], "-fs_homebase" ) == 0 )
{
if( ++i >= *argc )