From fcaafa0d12075df1d9bf0e554d6de0085bdce3e1 Mon Sep 17 00:00:00 2001 From: aaronhance Date: Wed, 28 Sep 2022 16:04:51 +0100 Subject: [PATCH] Started aadding file handle stuff to volume manager --- src/driver/storage/volumemanager.pas | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/driver/storage/volumemanager.pas b/src/driver/storage/volumemanager.pas index d54de31e..89de38ba 100644 --- a/src/driver/storage/volumemanager.pas +++ b/src/driver/storage/volumemanager.pas @@ -63,6 +63,7 @@ type end; TStorage_Volume = record + volumeHandle : uint32; device : PStorage_device; sectorStart : uint32; sectorSize : uint32; @@ -81,12 +82,29 @@ type // creationT : TDateTime; // modifiedT : TDateTime; end; + + TFilehandleEntry = record + volume : PStorage_Volume; + fileName : pchar; + fileHandle : uint32; + openMode : TOpenMode; + writeMode : TWriteMode; + lock : Boolean; + closed : Boolean; + + end; + + PFilehandleEntry = ^TFilehandleEntry; var storageVolumes : PLinkedListBase; filesystems : PlinkedListBase; + fileHandles : PLinkedListBase; + + { Returns the number of volumes } + procedure init(); procedure register_filesystem(filesystem : PFilesystem); @@ -224,6 +242,9 @@ begin { setup lists } storageVolumes:= ll_New(sizeof(TFilesystem)); filesystems:= ll_New(sizeof(TFilesystem)); + fileHandles:= ll_New(sizeof(TFilehandleEntry)); + + { register commands } terminal.registerCommand('volume', @volume_command, 'Volume utility'); end; @@ -368,4 +389,43 @@ begin // if rootVolume = PStorage_Volume(0) then rootVolume:= volume; end; +procedure openFile(Handle : uint32; Filename : PChar; OpenMode : TOpenMode; WriteMode : TWriteMode; lock : boolean; Error : PError); +var + fileHandleEntree : PFilehandleEntry; + fileHandle : uInt32; + i : uint32; + elm : void; +begin + push_trace('VolumeManager.openFile'); + + //check if file is already open and if it is locked, if openmode is not read only + if OpenMode <> omReadOnly then begin + for i:=0 to LL_Size(fileHandles) - 1 do begin + elm := LL_Get(fileHandles, i); + if stringEquals(PFilehandleEntry(elm)^.filename, Filename) then begin + if PFilehandleEntry(elm)^.locked and (not PFilehandleEntry(elm)^.closed) then begin + Error^ := eFileInUse; + exit; + end; + end; + end; + end; + + //create filehandleentry + fileHandleEntree := PFilehandleEntry(kalloc(SizeOf(TFilehandleEntry))); + fileHandleEntree.fileName := Filename; + fileHandleEntree^.openMode := OpenMode; + fileHandleEntree^.writeMode := WriteMode; + fileHandleEntree^.lock := lock; + fileHandleEntree^.closed := false; + + //create filehandle + fileHandle := LL_Size(fileHandles); + + +end; + + +end; + end. \ No newline at end of file