]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/vfspk3/vfs.cpp
handle forbidden dir exclusions properly now
[xonotic/netradiant.git] / plugins / vfspk3 / vfs.cpp
index e548c6eba5e50055b9fe41e97ec942fb9abfbcc4..86a2ac85f4cead9909bd9a033ac73e255fb1f4ed 100644 (file)
@@ -60,6 +60,7 @@ ArchiveModules& FileSystemQ3API_getArchiveModules();
 #include "stream/stringstream.h"
 #include "os/path.h"
 #include "moduleobservers.h"
+#include "filematch.h"
 
 
 #define VFS_MAXDIRS 64
@@ -91,6 +92,8 @@ typedef std::list<archive_entry_t> archives_t;
 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;
@@ -297,6 +300,40 @@ typedef std::set<CopiedString, PakLess> Archives;
 // 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;
 
@@ -352,6 +389,16 @@ void InitDirectory(const char* directory, ArchiveModules& archiveModules)
         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"))
@@ -427,6 +474,7 @@ void Shutdown()
   g_archives.clear();
 
   g_numDirs = 0;
+  g_numForbiddenDirs = 0;
 }
 
 #define VFS_SEARCH_PAK 0x1