#include "stream/stringstream.h"
#include "os/path.h"
#include "moduleobservers.h"
+#include "filematch.h"
#define VFS_MAXDIRS 64
static archives_t g_archives;
static char g_strDirs[VFS_MAXDIRS][PATH_MAX+1];
static int g_numDirs;
+static char g_strForbiddenDirs[VFS_MAXDIRS][PATH_MAX+1];
+static int g_numForbiddenDirs = 0;
static bool g_bUsePak = true;
ModuleObservers g_observers;
// reads all pak files from a dir
void InitDirectory(const char* directory, ArchiveModules& archiveModules)
{
+ int j;
+
+ g_numForbiddenDirs = 0;
+ StringTokeniser st(GlobalRadiant().getGameDescriptionKeyValue("forbidden_paths"), " ");
+ for(j = 0; j < VFS_MAXDIRS; ++j)
+ {
+ const char *t = st.getToken();
+ if(string_empty(t))
+ break;
+ strncpy(g_strForbiddenDirs[g_numForbiddenDirs], t, PATH_MAX);
+ g_strForbiddenDirs[g_numForbiddenDirs][PATH_MAX] = '\0';
+ ++g_numForbiddenDirs;
+ }
+
+ for(j = 0; j < g_numForbiddenDirs; ++j)
+ {
+ char* dbuf = g_strdup(directory);
+ if(*dbuf && dbuf[strlen(dbuf)-1] == '/')
+ dbuf[strlen(dbuf)-1] = 0;
+ const char *p = strrchr(dbuf, '/');
+ p = (p ? (p+1) : dbuf);
+ if(matchpattern(p, g_strForbiddenDirs[j], TRUE))
+ {
+ g_free(dbuf);
+ break;
+ }
+ g_free(dbuf);
+ }
+ if(j < g_numForbiddenDirs)
+ {
+ printf("Directory %s matched by forbidden dirs, removed\n", directory);
+ return;
+ }
+
if (g_numDirs == VFS_MAXDIRS)
return;
if(name == 0)
break;
+ for(j = 0; j < g_numForbiddenDirs; ++j)
+ {
+ const char *p = strrchr(name, '/');
+ p = (p ? (p+1) : name);
+ if(matchpattern(p, g_strForbiddenDirs[j], TRUE))
+ break;
+ }
+ if(j < g_numForbiddenDirs)
+ continue;
+
const char *ext = strrchr (name, '.');
if(ext && !string_compare_nocase_upper(ext, ".pk3dir"))
g_archives.clear();
g_numDirs = 0;
+ g_numForbiddenDirs = 0;
}
#define VFS_SEARCH_PAK 0x1