*/
qboolean PK3_OpenLibrary (void)
{
- const char* dllname;
-
- // Already loaded?
- if (zlib_dll)
- return true;
-
+ const char* dllnames [] =
+ {
#ifdef WIN32
- dllname = "zlib.dll";
+ "zlib.dll",
#elif defined(MACOSX)
- dllname = "libz.dylib";
+ "libz.dylib",
#else
- dllname = "libz.so";
+ "libz.so.1",
+ "libz.so",
#endif
+ NULL
+ };
+
+ // Already loaded?
+ if (zlib_dll)
+ return true;
// Load the DLL
- if (! Sys_LoadLibrary (dllname, &zlib_dll, zlibfuncs))
+ if (! Sys_LoadLibrary (dllnames, &zlib_dll, zlibfuncs))
{
Con_Printf ("Compressed files support disabled\n");
return false;
then loads and adds pak1.pak pak2.pak ...
================
*/
-void FS_AddGameDirectory (char *dir)
+void FS_AddGameDirectory (const char *dir)
{
stringlist_t *list, *current;
searchpath_t *search;
}
+/*
+================
+FS_AddGameHierarchy
+================
+*/
+void FS_AddGameHierarchy (const char *dir)
+{
+ const char *homedir;
+
+ strlcpy (com_modname, dir, sizeof (com_modname));
+
+ // Add the common game directory
+ FS_AddGameDirectory (va("%s/%s", fs_basedir, dir));
+
+ // Add the personal game directory
+ homedir = getenv ("HOME");
+ if (homedir != NULL && homedir[0] != '\0')
+ FS_AddGameDirectory (va("%s/.darkplaces/%s", homedir, dir));
+}
+
+
/*
============
FS_FileExtension
}
// start up with GAMENAME by default (id1)
- strlcpy (com_modname, GAMENAME, sizeof (com_modname));
- FS_AddGameDirectory (va("%s/"GAMENAME, fs_basedir));
+ FS_AddGameHierarchy (GAMENAME);
Cvar_SetQuick (&scr_screenshot_name, gamescreenshotname);
// add the game-specific path, if any
if (gamedirname[0])
{
fs_modified = true;
- strlcpy (com_modname, gamedirname, sizeof (com_modname));
- FS_AddGameDirectory (va("%s/%s", fs_basedir, gamedirname));
+ FS_AddGameHierarchy (gamedirname);
}
// -game <gamedir>
{
i++;
fs_modified = true;
- strlcpy (com_modname, com_argv[i], sizeof (com_modname));
- FS_AddGameDirectory (va("%s/%s", fs_basedir, com_argv[i]));
+ FS_AddGameHierarchy (com_argv[i]);
Cvar_SetQuick (&scr_screenshot_name, com_modname);
}
}
return 1; // non-portable attempt to go to parent directory
// all: don't allow going to current directory (./) or parent directory (../ or /../)
if (strstr(path, "./"))
- return 2; // attempt to go to parent directory
+ return 2; // attempt to go outside the game directory
+ // Windows and UNIXes: don't allow absolute paths
+ if (path[0] == '/')
+ return 2; // attempt to go outside the game directory
// after all these checks we're pretty sure it's a / separated filename
// and won't do much if any harm
return false;