From 84dbcce5d53242583b9f60e670a305d8fb0459ad Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 5 Feb 2010 08:37:17 +0000 Subject: [PATCH] No . or .. in root dir for isos.(GT Racing 97) (ripsaw,rc1) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3543 --- src/dos/drive_iso.cpp | 10 +++++++--- src/dos/drives.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dos/drive_iso.cpp b/src/dos/drive_iso.cpp index 4135d734..bfcdd6f2 100644 --- a/src/dos/drive_iso.cpp +++ b/src/dos/drive_iso.cpp @@ -246,7 +246,10 @@ bool isoDrive::FindFirst(char *dir, DOS_DTA &dta, bool fcb_findfirst) { } // get a directory iterator and save its id in the dta - dta.SetDirID((Bit16u)GetDirIterator(&de)); + int dirIterator = GetDirIterator(&de); + bool isRoot = (*dir == 0); + dirIterators[dirIterator].root = isRoot; + dta.SetDirID((Bit16u)dirIterator); Bit8u attr; char pattern[ISO_MAXPATHNAME]; @@ -260,7 +263,7 @@ bool isoDrive::FindFirst(char *dir, DOS_DTA &dta, bool fcb_findfirst) { DOS_SetError(DOSERR_NO_MORE_FILES); return false; } - } else if ((attr & DOS_ATTR_VOLUME) && (*dir == 0) && !fcb_findfirst) { + } else if ((attr & DOS_ATTR_VOLUME) && isRoot && !fcb_findfirst) { if (WildFileCmp(discLabel,pattern)) { // Get Volume Label (DOS_ATTR_VOLUME) and only in basedir and if it matches the searchstring dta.SetResult(discLabel, 0, 0, 0, DOS_ATTR_VOLUME); @@ -277,6 +280,7 @@ bool isoDrive::FindNext(DOS_DTA &dta) { dta.GetSearchParams(attr, pattern); int dirIterator = dta.GetDirID(); + bool isRoot = dirIterators[dirIterator].root; isoDirEntry de; while (GetNextDirEntry(dirIterator, &de)) { @@ -285,7 +289,7 @@ bool isoDrive::FindNext(DOS_DTA &dta) { else findAttr |= DOS_ATTR_ARCHIVE; if (IS_HIDDEN(de.fileFlags)) findAttr |= DOS_ATTR_HIDDEN; - if (WildFileCmp((char*)de.ident, pattern) + if (!(isRoot && de.ident[0]=='.') && WildFileCmp((char*)de.ident, pattern) && !(~attr & findAttr & (DOS_ATTR_DIRECTORY | DOS_ATTR_HIDDEN | DOS_ATTR_SYSTEM))) { /* file is okay, setup everything to be copied in DTA Block */ diff --git a/src/dos/drives.h b/src/dos/drives.h index 3a544872..f6198c56 100644 --- a/src/dos/drives.h +++ b/src/dos/drives.h @@ -345,6 +345,7 @@ private: struct DirIterator { bool valid; + bool root; Bit32u currentSector; Bit32u endSector; Bit32u pos;