From 90daf1718b1503dc2be33d945994124399c06883 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Sat, 6 Nov 2010 13:58:43 +0000 Subject: [PATCH] Close sourcefile if open in FCB_Rename. Fixes ancient dutch version of wordstart Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3657 --- src/dos/dos_files.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index 1734035e..6ae2f439 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -1166,9 +1166,29 @@ bool DOS_FCBDeleteFile(Bit16u seg,Bit16u offset){ bool DOS_FCBRenameFile(Bit16u seg, Bit16u offset){ DOS_FCB fcbold(seg,offset); DOS_FCB fcbnew(seg,offset+16); + if(!fcbold.Valid()) return false; char oldname[DOS_FCBNAME]; char newname[DOS_FCBNAME]; fcbold.GetName(oldname);fcbnew.GetName(newname); + + /* Check, if sourcefile is still open. This was possible in DOS, but modern oses don't like this */ + Bit8u drive; char fullname[DOS_PATHLENGTH]; + if (!DOS_MakeName(oldname,fullname,&drive)) return false; + + DOS_PSP psp(dos.psp()); + for (Bit8u i=0;iIsOpen() && Files[i]->IsName(fullname)) { + Bit16u handle = psp.FindEntryByHandle(i); + if (handle == 0xFF) { + // This shouldnt happen + LOG(LOG_FILES,LOG_ERROR)("DOS: File %s is opened but has no psp entry.",oldname); + return false; + } + DOS_CloseFile(handle); + } + } + + /* Rename the file */ return DOS_Rename(oldname,newname); }