From 5229a229a606b25c2f620ba2b276f453ce99df51 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sun, 7 Dec 2014 11:14:52 +0100 Subject: [PATCH] Ignore .name directories and files Signed-off-by: Craig Robbins --- builtin/mainmenu/modmgr.lua | 46 ++++++------ builtin/mainmenu/tab_texturepacks.lua | 10 ++- src/filesys.cpp | 101 ++++++++++++-------------- 3 files changed, 76 insertions(+), 81 deletions(-) diff --git a/builtin/mainmenu/modmgr.lua b/builtin/mainmenu/modmgr.lua index dcd1eb25..f2938685 100644 --- a/builtin/mainmenu/modmgr.lua +++ b/builtin/mainmenu/modmgr.lua @@ -17,30 +17,32 @@ -------------------------------------------------------------------------------- function get_mods(path,retval,modpack) + local mods = core.get_dirlist(path, true) + + for i=1, #mods, 1 do + if mods[i]:sub(1,1) ~= "." then + local toadd = {} + local modpackfile = nil - local mods = core.get_dirlist(path,true) - for i=1,#mods,1 do - local toadd = {} - local modpackfile = nil + toadd.name = mods[i] + toadd.path = path .. DIR_DELIM .. mods[i] .. DIR_DELIM + if modpack ~= nil and + modpack ~= "" then + toadd.modpack = modpack + else + local filename = path .. DIR_DELIM .. mods[i] .. DIR_DELIM .. "modpack.txt" + local error = nil + modpackfile,error = io.open(filename,"r") + end - toadd.name = mods[i] - toadd.path = path .. DIR_DELIM .. mods[i] .. DIR_DELIM - if modpack ~= nil and - modpack ~= "" then - toadd.modpack = modpack - else - local filename = path .. DIR_DELIM .. mods[i] .. DIR_DELIM .. "modpack.txt" - local error = nil - modpackfile,error = io.open(filename,"r") - end - - if modpackfile ~= nil then - modpackfile:close() - toadd.is_modpack = true - table.insert(retval,toadd) - get_mods(path .. DIR_DELIM .. mods[i],retval,mods[i]) - else - table.insert(retval,toadd) + if modpackfile ~= nil then + modpackfile:close() + toadd.is_modpack = true + table.insert(retval,toadd) + get_mods(path .. DIR_DELIM .. mods[i],retval,mods[i]) + else + table.insert(retval,toadd) + end end end end diff --git a/builtin/mainmenu/tab_texturepacks.lua b/builtin/mainmenu/tab_texturepacks.lua index 97f96fb1..db5ac346 100644 --- a/builtin/mainmenu/tab_texturepacks.lua +++ b/builtin/mainmenu/tab_texturepacks.lua @@ -31,11 +31,13 @@ local function render_texture_pack_list(list) local retval = "" for i, v in ipairs(list) do - if retval ~= "" then - retval = retval .."," - end + if v:sub(1,1) ~= "." then + if retval ~= "" then + retval = retval .."," + end - retval = retval .. core.formspec_escape(v) + retval = retval .. core.formspec_escape(v) + end end return retval diff --git a/src/filesys.cpp b/src/filesys.cpp index b95986a9..4b16d2d3 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -52,19 +52,17 @@ std::vector GetDirListing(std::string pathstring) DirSpec = (LPTSTR) malloc (BUFSIZE); - if( DirSpec == NULL ) - { - errorstream<<"GetDirListing: Insufficient memory available"< (BUFSIZE - 2)) - { - errorstream<<"GetDirListing: Input directory is too large."< (BUFSIZE - 2)) { + errorstream<<"GetDirListing: Input directory is too large."< GetDirListing(std::string pathstring) // Find the first file in the directory. hFind = FindFirstFile(DirSpec, &FindFileData); - if (hFind == INVALID_HANDLE_VALUE) - { + if (hFind == INVALID_HANDLE_VALUE) { retval = (-1); goto Cleanup; - } - else - { + } else { // NOTE: // Be very sure to not include '..' in the results, it will // result in an epic failure when deleting stuff. @@ -92,8 +87,7 @@ std::vector GetDirListing(std::string pathstring) listing.push_back(node); // List all the other files in the directory. - while (FindNextFile(hFind, &FindFileData) != 0) - { + while (FindNextFile(hFind, &FindFileData) != 0) { DirListNode node; node.name = FindFileData.cFileName; node.dir = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; @@ -103,15 +97,14 @@ std::vector GetDirListing(std::string pathstring) dwError = GetLastError(); FindClose(hFind); - if (dwError != ERROR_NO_MORE_FILES) - { + if (dwError != ERROR_NO_MORE_FILES) { errorstream<<"GetDirListing: FindNextFile error. Error is " < GetDirListing(std::string pathstring) { std::vector listing; - DIR *dp; - struct dirent *dirp; - if((dp = opendir(pathstring.c_str())) == NULL) { + DIR *dp; + struct dirent *dirp; + if((dp = opendir(pathstring.c_str())) == NULL) { //infostream<<"Error("<d_name[0]!='.'){ - DirListNode node; - node.name = dirp->d_name; - if(node.name == "." || node.name == "..") - continue; + if(dirp->d_name == "." || dirp->d_name == "..") + continue; - int isdir = -1; // -1 means unknown + DirListNode node; + node.name = dirp->d_name; - /* - POSIX doesn't define d_type member of struct dirent and - certain filesystems on glibc/Linux will only return - DT_UNKNOWN for the d_type member. + int isdir = -1; // -1 means unknown - Also we don't know whether symlinks are directories or not. - */ + /* + POSIX doesn't define d_type member of struct dirent and + certain filesystems on glibc/Linux will only return + DT_UNKNOWN for the d_type member. + + Also we don't know whether symlinks are directories or not. + */ #ifdef _DIRENT_HAVE_D_TYPE - if(dirp->d_type != DT_UNKNOWN && dirp->d_type != DT_LNK) - isdir = (dirp->d_type == DT_DIR); + if(dirp->d_type != DT_UNKNOWN && dirp->d_type != DT_LNK) + isdir = (dirp->d_type == DT_DIR); #endif /* _DIRENT_HAVE_D_TYPE */ - /* - Was d_type DT_UNKNOWN, DT_LNK or nonexistent? - If so, try stat(). - */ - if(isdir == -1) - { - struct stat statbuf; - if (stat((pathstring + "/" + node.name).c_str(), &statbuf)) - continue; - isdir = ((statbuf.st_mode & S_IFDIR) == S_IFDIR); - } - node.dir = isdir; - listing.push_back(node); + /* + Was d_type DT_UNKNOWN, DT_LNK or nonexistent? + If so, try stat(). + */ + if(isdir == -1) { + struct stat statbuf; + if (stat((pathstring + "/" + node.name).c_str(), &statbuf)) + continue; + isdir = ((statbuf.st_mode & S_IFDIR) == S_IFDIR); } - } - closedir(dp); + node.dir = isdir; + listing.push_back(node); + } + closedir(dp); return listing; }