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
This commit is contained in:
parent
55b9530a56
commit
67253f9e9b
8 changed files with 44 additions and 22 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 <string.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 <string.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue