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);