From 67253f9e9b005456a4bfc4d25a7e572519a4c54f Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Sun, 18 Apr 2004 14:49:50 +0000 Subject: [PATCH] Added support for attribute searching with extend fcbs. Added support for volume label searching on Virtual Drives. Added warnings for volume searching on Drive Fat. Improved support for Filelabel searching on drive_local to include fcbfinds Added Drivelabel "DOSBOX" to Virtual Drives. Changed default Label for localdrives to "NO_LABEL". Made DOS_FindFirst fcb finds aware. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1770 --- include/dos_inc.h | 6 ++++-- include/dos_system.h | 4 ++-- src/dos/dos_classes.cpp | 9 ++++++++- src/dos/dos_files.cpp | 11 +++++++---- src/dos/drive_fat.cpp | 7 +++++-- src/dos/drive_local.cpp | 11 ++++++----- src/dos/drive_virtual.cpp | 8 +++++++- src/dos/drives.h | 10 +++++----- 8 files changed, 44 insertions(+), 22 deletions(-) diff --git a/include/dos_inc.h b/include/dos_inc.h index 8d733600..6724f168 100644 --- a/include/dos_inc.h +++ b/include/dos_inc.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_inc.h,v 1.40 2004-04-13 12:08:43 qbix79 Exp $ */ +/* $Id: dos_inc.h,v 1.41 2004-04-18 14:49:48 qbix79 Exp $ */ #ifndef DOS_H_ #define DOS_H_ @@ -121,7 +121,7 @@ bool DOS_OpenFile(char * name,Bit8u flags,Bit16u * entry); bool DOS_OpenFileExtended(char *name, Bit16u flags, Bit16u createAttr, Bit16u action, Bit16u *entry, Bit16u* status); bool DOS_CreateFile(char * name,Bit16u attribute,Bit16u * entry); bool DOS_UnlinkFile(char * name); -bool DOS_FindFirst(char *search,Bit16u attr); +bool DOS_FindFirst(char *search,Bit16u attr,bool fcb_findfirst=false); bool DOS_FindNext(void); bool DOS_Canonicalize(char * name,char * big); bool DOS_CreateTempFile(char * name,Bit16u * entry); @@ -461,6 +461,8 @@ public: void SetRandom(Bit32u _random); Bit8u GetDrive(void); bool Extended(void); + void GetAttr(Bit8u & attr); + void SetAttr(Bit8u attr); private: bool extended; PhysPt real_pt; diff --git a/include/dos_system.h b/include/dos_system.h index 6eb0b4d6..d3f0d772 100644 --- a/include/dos_system.h +++ b/include/dos_system.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_system.h,v 1.22 2004-04-13 12:08:43 qbix79 Exp $ */ +/* $Id: dos_system.h,v 1.23 2004-04-18 14:49:48 qbix79 Exp $ */ #ifndef DOSSYSTEM_H_ #define DOSSYSTEM_H_ @@ -217,7 +217,7 @@ public: virtual bool RemoveDir(char * _dir)=0; virtual bool MakeDir(char * _dir)=0; virtual bool TestDir(char * _dir)=0; - virtual bool FindFirst(char * _dir,DOS_DTA & dta)=0; + virtual bool FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst=false)=0; virtual bool FindNext(DOS_DTA & dta)=0; virtual bool GetFileAttr(char * name,Bit16u * attr)=0; virtual bool Rename(char * oldname,char * newname)=0; diff --git a/src/dos/dos_classes.cpp b/src/dos/dos_classes.cpp index 62ebdf95..38b79d28 100644 --- a/src/dos/dos_classes.cpp +++ b/src/dos/dos_classes.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_classes.cpp,v 1.35 2004-02-28 16:35:14 qbix79 Exp $ */ +/* $Id: dos_classes.cpp,v 1.36 2004-04-18 14:49:48 qbix79 Exp $ */ #include #include @@ -428,3 +428,10 @@ void DOS_FCB::GetName(char * fillname) { fillname[14]=0; } +void DOS_FCB::GetAttr(Bit8u& attr) { + if(extended) attr=mem_readb(pt - 1); +} + +void DOS_FCB::SetAttr(Bit8u attr) { + if(extended) mem_writeb(pt - 1,attr); +} diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index 121a9eae..6b3ad232 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_files.cpp,v 1.54 2004-04-18 10:36:28 qbix79 Exp $ */ +/* $Id: dos_files.cpp,v 1.55 2004-04-18 14:49:48 qbix79 Exp $ */ #include #include @@ -217,7 +217,7 @@ bool DOS_Rename(char * oldname,char * newname) { return false; } -bool DOS_FindFirst(char * search,Bit16u attr) { +bool DOS_FindFirst(char * search,Bit16u attr,bool fcb_findfirst) { DOS_DTA dta(dos.dta); Bit8u drive;char fullsearch[DOS_PATHLENGTH]; char dir[DOS_PATHLENGTH];char pattern[DOS_PATHLENGTH]; @@ -234,7 +234,7 @@ bool DOS_FindFirst(char * search,Bit16u attr) { strcpy(dir,fullsearch); } dta.SetupSearch(drive,(Bit8u)attr,pattern); - if (Drives[drive]->FindFirst(dir,dta)) return true; + if (Drives[drive]->FindFirst(dir,dta,fcb_findfirst)) return true; return false; } @@ -722,6 +722,7 @@ static void SaveFindResult(DOS_FCB & find_fcb) { DOS_FCB fcb(RealSeg(dos.dta),RealOff(dos.dta)); fcb.Create(find_fcb.Extended()); fcb.SetName(drive,file_name,ext); + fcb.SetAttr(attr); /* Only adds attribute if fcb is extended */ fcb.SetSizeDateTime(size,date,time); } @@ -777,7 +778,9 @@ bool DOS_FCBFindFirst(Bit16u seg,Bit16u offset) DOS_FCB fcb(seg,offset); RealPt old_dta=dos.dta;dos.dta=dos.tables.tempdta; char name[DOS_FCBNAME];fcb.GetName(name); - bool ret=DOS_FindFirst(name,DOS_ATTR_ARCHIVE); + Bit8u attr = DOS_ATTR_ARCHIVE; + fcb.GetAttr(attr); /* Gets search attributes if extended */ + bool ret=DOS_FindFirst(name,attr,true); dos.dta=old_dta; if (ret) SaveFindResult(fcb); return ret; diff --git a/src/dos/drive_fat.cpp b/src/dos/drive_fat.cpp index 845bdeee..e9cb8577 100644 --- a/src/dos/drive_fat.cpp +++ b/src/dos/drive_fat.cpp @@ -770,9 +770,12 @@ bool fatDrive::FileUnlink(char * name) { return true; } -bool fatDrive::FindFirst(char *_dir, DOS_DTA &dta) { +bool fatDrive::FindFirst(char *_dir, DOS_DTA &dta,bool fcb_findfirst) { direntry dummyClust; - + Bit8u attr;char pattern[DOS_NAMELENGTH_ASCII]; + dta.GetSearchParams(attr,pattern); + if(attr & DOS_ATTR_VOLUME) //check for root dir or fcb_findfirst + LOG(LOG_DOSMISC,LOG_WARN)("findfirst for volumelabel used on fatDrive. Unhandled!!!!!"); if(!getDirClustNum(_dir, &cwdDirCluster, false)) return false; dta.SetDirID(0); return FindNextInternal(cwdDirCluster, dta, &dummyClust); diff --git a/src/dos/drive_local.cpp b/src/dos/drive_local.cpp index 8d54929a..7d50886d 100644 --- a/src/dos/drive_local.cpp +++ b/src/dos/drive_local.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drive_local.cpp,v 1.47 2004-04-13 12:08:43 qbix79 Exp $ */ +/* $Id: drive_local.cpp,v 1.48 2004-04-18 14:49:50 qbix79 Exp $ */ #include #include @@ -127,7 +127,7 @@ bool localDrive::FileUnlink(char * name) { }; -bool localDrive::FindFirst(char * _dir,DOS_DTA & dta) { +bool localDrive::FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst) { char tempDir[CROSS_LEN]; strcpy(tempDir,basedir); @@ -152,11 +152,12 @@ bool localDrive::FindFirst(char * _dir,DOS_DTA & dta) { Bit8u sAttr; dta.GetSearchParams(sAttr,tempDir); - if ((sAttr & DOS_ATTR_VOLUME) && (*_dir==0)) { + if ( (sAttr & DOS_ATTR_VOLUME) && ( (*_dir==0) || fcb_findfirst ) ) { // Get Volume Label (DOS_ATTR_VOLUME) and only in basedir + // or it's a fcb findfirst as that always returns label if ( strcmp(dirCache.GetLabel(), "") == 0 ) { LOG(LOG_DOSMISC,LOG_ERROR)("DRIVELABEL REQUESTED: none present, returned NOLABEL"); - dta.SetResult("NOLABEL",0,0,0,DOS_ATTR_VOLUME); + dta.SetResult("NO_LABEL",0,0,0,DOS_ATTR_VOLUME); return true; } @@ -532,7 +533,7 @@ bool cdromDrive::GetFileAttr(char * name,Bit16u * attr) return result; }; -bool cdromDrive::FindFirst(char * _dir,DOS_DTA & dta) +bool cdromDrive::FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst) { // If media has changed, reInit drivecache. if (MSCDEX_HasMediaChanged(subUnit)) { diff --git a/src/dos/drive_virtual.cpp b/src/dos/drive_virtual.cpp index d40a9a5c..ccd2aa86 100644 --- a/src/dos/drive_virtual.cpp +++ b/src/dos/drive_virtual.cpp @@ -185,8 +185,14 @@ bool Virtual_Drive::FileExists(const char* name){ return false; } -bool Virtual_Drive::FindFirst(char * _dir,DOS_DTA & dta) { +bool Virtual_Drive::FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst) { search_file=first_file; + Bit8u attr;char pattern[DOS_NAMELENGTH_ASCII]; + dta.GetSearchParams(attr,pattern); + if(attr & DOS_ATTR_VOLUME) { + dta.SetResult("DOSBOX",0,0,0,DOS_ATTR_ARCHIVE); + return true; + } return FindNext(dta); } diff --git a/src/dos/drives.h b/src/dos/drives.h index 526386e8..ba6eb569 100644 --- a/src/dos/drives.h +++ b/src/dos/drives.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drives.h,v 1.20 2004-04-03 19:22:33 canadacow Exp $ */ +/* $Id: drives.h,v 1.21 2004-04-18 14:49:50 qbix79 Exp $ */ #ifndef _DRIVES_H__ #define _DRIVES_H__ @@ -38,7 +38,7 @@ public: virtual bool RemoveDir(char * dir); virtual bool MakeDir(char * dir); virtual bool TestDir(char * dir); - virtual bool FindFirst(char * _dir,DOS_DTA & dta); + virtual bool FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst=false); virtual bool FindNext(DOS_DTA & dta); virtual bool GetFileAttr(char * name,Bit16u * attr); virtual bool Rename(char * oldname,char * newname); @@ -129,7 +129,7 @@ public: virtual bool RemoveDir(char * dir); virtual bool MakeDir(char * dir); virtual bool TestDir(char * dir); - virtual bool FindFirst(char * _dir,DOS_DTA & dta); + virtual bool FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst=false); virtual bool FindNext(DOS_DTA & dta); virtual bool GetFileAttr(char * name,Bit16u * attr); virtual bool Rename(char * oldname,char * newname); @@ -195,7 +195,7 @@ public: virtual bool MakeDir(char * dir); virtual bool Rename(char * oldname,char * newname); virtual bool GetFileAttr(char * name,Bit16u * attr); - virtual bool FindFirst(char * _dir,DOS_DTA & dta); + virtual bool FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst=false); virtual void SetDir(const char* path); virtual bool isRemote(void); private: @@ -213,7 +213,7 @@ public: bool RemoveDir(char * dir); bool MakeDir(char * dir); bool TestDir(char * dir); - bool FindFirst(char * _dir,DOS_DTA & dta); + bool FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst); bool FindNext(DOS_DTA & dta); bool GetFileAttr(char * name,Bit16u * attr); bool Rename(char * oldname,char * newname);