Prevent loading anything except the GRP from the Steam or GOG Duke3D install directories. Loading DUKE.RTS from those paths will be resolved later.

git-svn-id: https://svn.eduke32.com/eduke32@3637 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2013-04-05 07:48:20 +00:00
parent 73cb94b389
commit e20b834ea8
5 changed files with 100 additions and 19 deletions

View file

@ -23,6 +23,7 @@ void agecache(void);
extern int32_t pathsearchmode; // 0 = gamefs mode (default), 1 = localfs mode (editor's mode) extern int32_t pathsearchmode; // 0 = gamefs mode (default), 1 = localfs mode (editor's mode)
int32_t addsearchpath(const char *p); int32_t addsearchpath(const char *p);
int32_t removesearchpath(const char *p);
int32_t findfrompath(const char *fn, char **where); int32_t findfrompath(const char *fn, char **where);
int32_t openfrompath(const char *fn, int32_t flags, int32_t mode); int32_t openfrompath(const char *fn, int32_t flags, int32_t mode);
BFILE *fopenfrompath(const char *fn, const char *mode); BFILE *fopenfrompath(const char *fn, const char *mode);

View file

@ -353,11 +353,9 @@ int32_t addsearchpath(const char *p)
} }
Bstrcpy(srch->path, path); Bstrcpy(srch->path, path);
for (s=srch->path; *s; s++) for (s=srch->path; *s; s++);
{
/* do nothing */
}
s--; s--;
if (s<srch->path || toupperlookup[*s] != '/') if (s<srch->path || toupperlookup[*s] != '/')
Bstrcat(srch->path, "/"); Bstrcat(srch->path, "/");
@ -373,6 +371,58 @@ int32_t addsearchpath(const char *p)
return 0; return 0;
} }
int32_t removesearchpath(const char *p)
{
searchpath_t *srch;
char *s;
char *path = (char *)Bmalloc(Bstrlen(p) + 2);
Bstrcpy(path, p);
if (path[Bstrlen(path)-1] == '\\')
path[Bstrlen(path)-1] = 0;
for (s=path; *s; s++);
s--;
if (s<path || toupperlookup[*s] != '/')
Bstrcat(path, "/");
Bcorrectfilename(path,0);
for (srch = searchpathhead; srch; srch = srch->next)
{
if (!Bstrncmp(path, srch->path, srch->pathlen))
{
// initprintf("Removing %s from path stack\n", path);
if (srch == searchpathhead)
searchpathhead = srch->next;
else
{
searchpath_t *sp;
for (sp = searchpathhead; sp; sp = sp->next)
{
if (sp->next == srch)
{
// initprintf("matched %s\n", srch->path);
sp->next = srch->next;
break;
}
}
}
Bfree(srch->path);
Bfree(srch);
break;
}
}
Bfree(path);
return 0;
}
int32_t findfrompath(const char *fn, char **where) int32_t findfrompath(const char *fn, char **where)
{ {
searchpath_t *sp; searchpath_t *sp;

View file

@ -218,17 +218,28 @@ void G_ExtPreInit(void)
} }
#ifdef _WIN32 #ifdef _WIN32
const char * G_GetSteamPath(void) const char * G_GetInstallPath(int32_t insttype)
{ {
static char spath[BMAX_PATH]; static char spath[NUMINSTPATHS][BMAX_PATH];
static int32_t success = -1; static int32_t success[NUMINSTPATHS] = { -1, -1 };
int32_t siz = BMAX_PATH; int32_t siz = BMAX_PATH;
if (success == -1) // this still needs to be fixed for win64 builds
success = SHGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App 225140", "InstallLocation", NULL, spath, (LPDWORD)&siz); if (success[insttype] == -1)
{
switch (insttype)
{
case INSTPATH_STEAM:
success[insttype] = SHGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Steam App 225140", "InstallLocation", NULL, spath[insttype], (LPDWORD)&siz);
break;
case INSTPATH_GOG:
success[insttype] = SHGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\GOG.com\\GOGDUKE3D", "PATH", NULL, spath[insttype], (LPDWORD)&siz);
break;
}
}
if (success == ERROR_SUCCESS) if (success[insttype] == ERROR_SUCCESS)
return spath; return spath[insttype];
return NULL; return NULL;
} }
@ -247,21 +258,18 @@ void G_AddSearchPaths(void)
#elif defined (_WIN32) #elif defined (_WIN32)
// detect Steam and GOG versions of Duke3D // detect Steam and GOG versions of Duke3D
char buf[BMAX_PATH]; char buf[BMAX_PATH];
int32_t siz = BMAX_PATH, ret;
if (G_GetSteamPath()) if (G_GetInstallPath(INSTPATH_STEAM))
{ {
Bsprintf(buf, "%s/gameroot/classic", G_GetSteamPath()); Bsprintf(buf, "%s/gameroot", G_GetInstallPath(INSTPATH_STEAM));
addsearchpath(buf); addsearchpath(buf);
Bsprintf(buf, "%s/gameroot/addons", G_GetSteamPath()); Bsprintf(buf, "%s/gameroot/addons", G_GetInstallPath(INSTPATH_STEAM));
addsearchpath(buf); addsearchpath(buf);
} }
ret = SHGetValueA(HKEY_LOCAL_MACHINE, "SOFTWARE\\GOG.com\\GOGDUKE3D", "PATH", NULL, buf, (LPDWORD)&siz); if (G_GetInstallPath(INSTPATH_GOG))
addsearchpath(G_GetInstallPath(INSTPATH_GOG));
if (ret == ERROR_SUCCESS)
addsearchpath(buf);
#endif #endif
} }

View file

@ -27,6 +27,12 @@ enum Games_t {
GAMECOUNT GAMECOUNT
}; };
enum instpath_t {
INSTPATH_STEAM,
INSTPATH_GOG,
NUMINSTPATHS
};
extern const char *defaultgamegrp[GAMECOUNT]; extern const char *defaultgamegrp[GAMECOUNT];
extern const char *defaultdeffilename[GAMECOUNT]; extern const char *defaultdeffilename[GAMECOUNT];
extern const char *defaultconfilename; extern const char *defaultconfilename;
@ -55,4 +61,6 @@ extern void G_ExtPreInit(void);
extern void G_AddSearchPaths(void); extern void G_AddSearchPaths(void);
extern const char * G_GetInstallPath(int32_t insttype);
#endif #endif

View file

@ -10452,6 +10452,20 @@ int32_t app_main(int32_t argc, const char **argv)
} }
} }
#ifdef _WIN32
if (G_GetInstallPath(INSTPATH_STEAM))
{
Bsprintf(buf, "%s/gameroot", G_GetInstallPath(INSTPATH_STEAM));
removesearchpath(buf);
Bsprintf(buf, "%s/gameroot/addons", G_GetInstallPath(INSTPATH_STEAM));
removesearchpath(buf);
}
if (G_GetInstallPath(INSTPATH_GOG))
removesearchpath(G_GetInstallPath(INSTPATH_GOG));
#endif
if (g_modDir[0] != '/') if (g_modDir[0] != '/')
G_LoadGroupsInDir(g_modDir); G_LoadGroupsInDir(g_modDir);