diff options
Diffstat (limited to 'Private')
| -rw-r--r-- | Private/FSKit/NewFS.hxx | 17 | ||||
| -rw-r--r-- | Private/KernelKit/FileManager.hpp | 2 | ||||
| -rw-r--r-- | Private/KernelKit/PEF.hpp | 4 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 2 | ||||
| -rw-r--r-- | Private/Source/AppMain.cxx | 20 | ||||
| -rw-r--r-- | Private/Source/FS/NewFS.cxx | 129 | ||||
| -rw-r--r-- | Private/Source/FileManager.cxx | 16 | ||||
| -rw-r--r-- | Private/Source/KernelHeap.cxx | 5 |
8 files changed, 133 insertions, 62 deletions
diff --git a/Private/FSKit/NewFS.hxx b/Private/FSKit/NewFS.hxx index b461666d..4a298c96 100644 --- a/Private/FSKit/NewFS.hxx +++ b/Private/FSKit/NewFS.hxx @@ -30,11 +30,7 @@ default. #define kNewFSInvalidCatalog -1 #define kNewFSNodeNameLen 256 -#ifdef __x86_64__ #define kNewFSMinimumSectorSz (512) -#else -#define kNewFSMinimumSectorSz (1024) -#endif // ifdef __x86_64__ #define kNewFSIdentLen 8 #define kNewFSIdent " NewFS" @@ -54,6 +50,8 @@ default. #define kNewFSCatalogKindDir 2 #define kNewFSCatalogKindAlias 3 +#define kNewFSForkSize (8192) + //! shared between network or //! other filesystems. Export forks as .zip when copying. #define kNewFSCatalogKindShared 4 @@ -125,7 +123,7 @@ struct PACKED NewCatalog final { NewOS::Lba DataForkSize; /// Size of all resource forks. - NewOS::Lba ResourceForkOverallSize; + NewOS::Lba ResourceForkSize; NewOS::Lba DataFork; NewOS::Lba ResourceFork; @@ -134,7 +132,10 @@ struct PACKED NewCatalog final { NewOS::Lba PrevSibling; }; -/// @brief Fork type. +/// @brief Fork type, contains a data page. +/// @note The way we store is way different than how other filesystems do, specific chunk of code are +/// written into either the data fork or resource fork, the resource fork is reserved for file metadata. +/// whereas the data fork is reserved for file data. struct PACKED NewFork final { NewCharType Name[kNewFSNodeNameLen]; @@ -237,10 +238,10 @@ class NewFSParser final { _Output NewCatalog* CreateCatalog(_Input const char* name); bool WriteCatalog(_Input _Output NewCatalog* catalog, - voidPtr data, SizeT sizeOfData); + voidPtr data, SizeT sizeOfData, _Input const char* forkName); VoidPtr ReadCatalog(_Input _Output NewCatalog* catalog, - SizeT dataSz); + SizeT dataSz, _Input const char* forkName); bool Seek(_Input _Output NewCatalog* catalog, SizeT off); diff --git a/Private/KernelKit/FileManager.hpp b/Private/KernelKit/FileManager.hpp index ab65bbe1..51bfb13c 100644 --- a/Private/KernelKit/FileManager.hpp +++ b/Private/KernelKit/FileManager.hpp @@ -130,7 +130,7 @@ class NewFilesystemManager final : public FilesystemManagerInterface { NewFSParser* GetImpl() noexcept; - public: + private: NewFSParser *fImpl{nullptr}; }; diff --git a/Private/KernelKit/PEF.hpp b/Private/KernelKit/PEF.hpp index fe7430ab..2b85196e 100644 --- a/Private/KernelKit/PEF.hpp +++ b/Private/KernelKit/PEF.hpp @@ -103,7 +103,7 @@ enum { #define kPefStart "__ImageStart" -#define kPefForkKind "PEF!" -#define kPefForkKindFAT "FEP!" +#define kPefForkKind kPefMagic +#define kPefForkKindFAT kPefMagicFat #endif /* ifndef __PEF__ */ diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index c916978f..7b3c1d93 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -270,7 +270,7 @@ private: catalogKind->DataForkSize += blob->fBlobSz; } else { catalogKind->ResourceFork = (startLba + sizeof(NewCatalog)); - catalogKind->ResourceForkOverallSize += blob->fBlobSz; + catalogKind->ResourceForkSize += blob->fBlobSz; } /// before going to forks, we must check for the catalog name first. diff --git a/Private/Source/AppMain.cxx b/Private/Source/AppMain.cxx index 966172df..d9c02843 100644 --- a/Private/Source/AppMain.cxx +++ b/Private/Source/AppMain.cxx @@ -41,19 +41,33 @@ EXTERN_C NewOS::Void AppMain(NewOS::Void) { NewOS::rt_string_len("EditableText")); theFork.Kind = NewOS::kNewFSDataForkKind; - theFork.DataSize = cDataSz; + theFork.DataSize = kNewFSForkSize; textCatalog = newFS->GetImpl()->CreateCatalog("/EditableText"); newFS->GetImpl()->CreateFork(textCatalog, theFork); - newFS->GetImpl()->WriteCatalog(textCatalog, theData, cDataSz); + newFS->GetImpl()->WriteCatalog(textCatalog, theData, cDataSz, "EditableText"); + + NewFork theForkPreview{0}; + + theForkPreview.Kind = NewOS::kNewFSDataForkKind; + theForkPreview.DataSize = kNewFSForkSize; + + NewOS::rt_copy_memory((NewOS::VoidPtr) "EditableTextPreview", + (NewOS::VoidPtr)theForkPreview.Name, + NewOS::rt_string_len("EditableTextPreview")); + + NewOS::Char theDataPreview[cDataSz] = { "NewKernel Info:\r\tNewKernel!" }; + newFS->GetImpl()->CreateFork(textCatalog, theForkPreview); + + newFS->GetImpl()->WriteCatalog(textCatalog, theDataPreview, cDataSz, "EditableTextPreview"); } else { NewOS::kcout << "Catalog already exists.\r"; } char* buf = nullptr; - buf = (NewOS::Char*)newFS->GetImpl()->ReadCatalog(newFS->GetImpl()->GetCatalog("/EditableText"), 512); + buf = (NewOS::Char*)newFS->GetImpl()->ReadCatalog(newFS->GetImpl()->GetCatalog("/EditableText"), 512, "EditableTextPreview"); NewOS::kcout << buf << NewOS::endl; } diff --git a/Private/Source/FS/NewFS.cxx b/Private/Source/FS/NewFS.cxx index 2a85d394..c9df501d 100644 --- a/Private/Source/FS/NewFS.cxx +++ b/Private/Source/FS/NewFS.cxx @@ -27,22 +27,63 @@ _Output NewFork* NewFSParser::CreateFork(_Input NewCatalog* catalog, _Input NewFork& theFork) { if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return nullptr; - if (catalog && theFork.Name[0] != 0 && theFork.DataSize > 0) { + if (catalog && theFork.Name[0] != 0 && theFork.DataSize == kNewFSForkSize) { Lba lba = (theFork.Kind == kNewFSDataForkKind) ? catalog->DataFork : catalog->ResourceFork; - kcout << "Data-Fork-LBA: " << hex_number(lba) << endl; + kcout << "Data-Fork-Lba: " << hex_number(lba) << endl; if (lba <= kNewFSCatalogStartAddress) return nullptr; - theFork.DataOffset = lba - sizeof(NewFork); - auto drv = sMountpointInterface.GetAddressOf(this->fDriveIndex); /// special treatment. rt_copy_memory((VoidPtr) "fs/newfs-packet", drv->fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); + NewFork cpyFork{ 0 }; + NewFork prevFork{0}; + Lba lbaOfPreviousFork = lba; + + while (cpyFork.Name[0] == 0) { + if (lba <= kNewFSCatalogStartAddress) break; + + drv->fPacket.fLba = lba; + drv->fPacket.fPacketSize = sizeof(NewFork); + drv->fPacket.fPacketContent = &cpyFork; + + drv->fInput(&drv->fPacket); + + kcout << "New OS: Next-Fork: " << hex_number(cpyFork.NextSibling) << endl; + + if (cpyFork.Flags == kNewFSFlagCreated) { + kcout << "New OS: Fork already exists.\r"; + if (StringBuilder::Equals(cpyFork.Name, theFork.Name)) + return nullptr; + + lbaOfPreviousFork = lba; + lba = cpyFork.NextSibling; + + prevFork = cpyFork; + } else { + break; + } + } + + + if (lba >= kNewFSCatalogStartAddress) { + prevFork.NextSibling = lba; + + drv->fOutput(&drv->fPacket); + } + + constexpr auto cForkPadding = 4; + + theFork.Flags = kNewFSFlagCreated; + theFork.DataOffset = lba - sizeof(NewFork) * cForkPadding; + theFork.PreviousSibling = lbaOfPreviousFork; + theFork.NextSibling = theFork.DataOffset - theFork.DataSize; + drv->fPacket.fLba = lba; drv->fPacket.fPacketSize = sizeof(NewFork); drv->fPacket.fPacketContent = &theFork; @@ -50,6 +91,7 @@ _Output NewFork* NewFSParser::CreateFork(_Input NewCatalog* catalog, drv->fOutput(&drv->fPacket); kcout << "New OS: Wrote fork data at: " << hex_number(theFork.DataOffset) << endl; + kcout << "New OS: Wrote fork at: " << hex_number(lba) << endl; return &theFork; } @@ -179,11 +221,11 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name, return nullptr; } - constexpr SizeT cDefaultForkSize = 8196; + constexpr SizeT cDefaultForkSize = kNewFSForkSize; NewCatalog* catalogChild = new NewCatalog(); - catalogChild->ResourceForkOverallSize = cDefaultForkSize; + catalogChild->ResourceForkSize = cDefaultForkSize; catalogChild->DataForkSize = cDefaultForkSize; catalogChild->NextSibling = 0UL; @@ -200,10 +242,6 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name, Lba startFree = catalogChild->PrevSibling + catalog->NextSibling; - kcout << "Free-Catalog: " << hex_number(startFree) << endl; - kcout << "New-Catalog: " << name << endl; - kcout << "Parent-Catalog: " << parentName << endl; - rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); @@ -235,8 +273,7 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name, NewPartitionBlock* partBlock = (NewPartitionBlock*)sectorBufPartBlock; - catalogChild->DataFork = - partBlock->DiskSize - startFree - sizeof(NewCatalog); + catalogChild->DataFork = partBlock->DiskSize - partBlock->StartCatalog; kcout << "DataFork: " << hex_number(catalogChild->DataFork) << endl; @@ -250,9 +287,7 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name, rt_string_len("x-kind/dir")); } - catalogChild->NextSibling = sizeof(NewCatalog) + - catalogChild->DataForkSize + - catalogChild->ResourceForkOverallSize; + catalogChild->NextSibling = sizeof(NewCatalog); rt_copy_memory(catalogChild, catalogBuf, sizeof(NewCatalog)); @@ -278,8 +313,6 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name, drive->fOutput(&drive->fPacket); - kcout << "Edit-Catalog: " << prevCatalog->Name << endl; - drive->fPacket.fPacketContent = sectorBufPartBlock; drive->fPacket.fPacketSize = kNewFSMinimumSectorSz; drive->fPacket.fLba = kNewFSAddressAsLba; @@ -397,7 +430,7 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive) { /// @param data the data. /// @return if the catalog w rote the contents successfully. bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data, - SizeT sizeOfData) { + SizeT sizeOfData, _Input const char* forkName) { if (sizeOfData > catalog->DataForkSize) return false; if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return false; @@ -412,12 +445,13 @@ bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data, auto startFork = catalog->DataFork; /// sanity check of the fork position as the condition to run the loop. - if (startFork >= kNewFSCatalogStartAddress) { + while (startFork >= kNewFSCatalogStartAddress) { drive->fPacket.fPacketContent = forkData; drive->fPacket.fPacketSize = sizeof(NewFork); drive->fPacket.fLba = startFork; drive->fInput(&drive->fPacket); + kcout << "Fork-Name: " << forkData->Name << endl; /// sanity check the fork. if (forkData->DataOffset <= kNewFSCatalogStartAddress) { @@ -429,15 +463,24 @@ bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data, return false; } - drive->fPacket.fPacketContent = data; - drive->fPacket.fPacketSize = sizeOfData; - drive->fPacket.fLba = forkData->DataOffset; + if (forkData->Flags != kNewFSFlagUnallocated && + forkData->Flags != kNewFSFlagDeleted && + StringBuilder::Equals(forkData->Name, forkName)) { + drive->fPacket.fPacketContent = data; + drive->fPacket.fPacketSize = sizeOfData; + drive->fPacket.fLba = forkData->DataOffset; + kcout << "Fork-Offset: " << hex_number(forkData->DataOffset) << endl; - drive->fOutput(&drive->fPacket); + drive->fOutput(&drive->fPacket); - return true; + delete forkData; + return true; + } + + startFork = forkData->NextSibling; } + delete forkData; return false; } @@ -576,7 +619,7 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName) { /// @param dataSz /// @return VoidPtr NewFSParser::ReadCatalog(_Input _Output NewCatalog* catalog, - SizeT dataSz) { + _Input SizeT dataSz, _Input const char* forkName) { if (!catalog) { DbgLastError() = kErrorFileNotFound; return nullptr; @@ -596,23 +639,36 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NewCatalog* catalog, rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime, rt_string_len("fs/newfs-packet")); - drive->fPacket.fLba = dataForkLba; - drive->fPacket.fPacketSize = sizeof(NewFork); - drive->fPacket.fPacketContent = sectorBuf; + NewFork* forkData = nullptr; - drive->fInput(&drive->fPacket); + while (dataForkLba >= kNewFSCatalogStartAddress) { + drive->fPacket.fLba = dataForkLba; + drive->fPacket.fPacketSize = sizeof(NewFork); + drive->fPacket.fPacketContent = sectorBuf; + + drive->fInput(&drive->fPacket); - NewFork* forkData = (NewFork*)sectorBuf; + forkData = (NewFork*)sectorBuf; - kcout << "Fork-Name: " << forkData->Name << endl; + kcout << "Fork-Name: " << forkData->Name << endl; - if (forkData->DataOffset <= kNewFSCatalogStartAddress || - dataSz > forkData->DataSize) { - delete[] sectorBuf; + if (forkData->DataOffset <= kNewFSCatalogStartAddress) { + delete[] sectorBuf; - kcout << "Fail-Data-Offset: " << hex_number(forkData->DataOffset) << endl; + kcout << "Fail-Data-Offset: " << hex_number(forkData->DataOffset) << endl; - return nullptr; + return nullptr; + } + + if (StringBuilder::Equals(forkName, forkData->Name)) + break; + + dataForkLba = forkData->NextSibling; + } + + if (dataForkLba <= kNewFSCatalogStartAddress) { + delete[] sectorBuf; + return nullptr; } Char* forkBuf = new Char[dataSz]; @@ -624,7 +680,6 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NewCatalog* catalog, drive->fInput(&drive->fPacket); delete[] sectorBuf; - return forkBuf; } diff --git a/Private/Source/FileManager.cxx b/Private/Source/FileManager.cxx index aab3cff0..a8c8ad47 100644 --- a/Private/Source/FileManager.cxx +++ b/Private/Source/FileManager.cxx @@ -70,10 +70,13 @@ NodePtr NewFilesystemManager::Open(const char* path, const char* r) { /// @param data /// @param flags /// @return -Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, - Int32 flags, SizeT size) { +Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, Int32 flags, + SizeT size) { + constexpr const char* cReadAllFork = kNewFSDataFork; + if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile) - fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size); + fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size, + cReadAllFork); } /** @@ -87,8 +90,11 @@ Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, /// @param sz /// @return VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz) { + constexpr const char* cReadAllFork = kNewFSDataFork; + if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile) - return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz); + return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz, + cReadAllFork); return nullptr; } @@ -124,5 +130,5 @@ bool NewFilesystemManager::Rewind(NodePtr node) { /// @brief The filesystem implementation. /// @return NewFSParser* NewFilesystemManager::GetImpl() noexcept { return fImpl; } -#endif // __FSKIT_NEWFS__ +#endif // __FSKIT_NEWFS__ } // namespace NewOS diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx index 52b9bafb..b3584f2f 100644 --- a/Private/Source/KernelHeap.cxx +++ b/Private/Source/KernelHeap.cxx @@ -62,9 +62,6 @@ VoidPtr ke_new_ke_heap(SizeT sz, const bool rw, const bool user) { ++kHeapCount; - NewOS::kcout << "New OS: Allocate: " << hex_number((IntPtr)wrapper.VirtualAddress() + - sizeof(Detail::HeapInformationBlock)) << endl; - return reinterpret_cast<VoidPtr>(wrapper.VirtualAddress() + sizeof(Detail::HeapInformationBlock)); } @@ -81,8 +78,6 @@ Int32 ke_delete_ke_heap(VoidPtr heapPtr) { reinterpret_cast<Detail::HeapInformationBlockPtr>( (UIntPtr)heapPtr - sizeof(Detail::HeapInformationBlock)); - NewOS::kcout << "New OS: Freeing: " << hex_number((UIntPtr)virtualAddress) << endl; - if (virtualAddress && virtualAddress->fMagic == kKernelHeapMagic) { if (!virtualAddress->fPresent) { return -kErrorHeapNotPresent; |
