summaryrefslogtreecommitdiffhomepage
path: root/Private/Source/FS
diff options
context:
space:
mode:
authorAmlal <amlalelmahrouss@icloud.com>2024-04-30 06:17:59 +0000
committerAmlal <amlalelmahrouss@icloud.com>2024-04-30 06:17:59 +0000
commit094218bcd2befe8c57d042db7a2945791f29c7a6 (patch)
tree045a19e28860280a29bb8fc218a6909343691878 /Private/Source/FS
parenta06c8a375f0c5f5e3613e9fe8228cebf442731ba (diff)
parentf86125cf437fb49587d588413d69646959a58541 (diff)
Merged in MHR-18 (pull request #10)
MHR-18
Diffstat (limited to 'Private/Source/FS')
-rw-r--r--Private/Source/FS/NewFS.cxx321
1 files changed, 199 insertions, 122 deletions
diff --git a/Private/Source/FS/NewFS.cxx b/Private/Source/FS/NewFS.cxx
index 57f61cd2..2a85d394 100644
--- a/Private/Source/FS/NewFS.cxx
+++ b/Private/Source/FS/NewFS.cxx
@@ -11,6 +11,7 @@
#include <FSKit/NewFS.hxx>
#include <KernelKit/HError.hpp>
#include <NewKit/Crc32.hpp>
+#include <NewKit/KernelCheck.hpp>
#include <NewKit/String.hpp>
#include <NewKit/Utils.hpp>
@@ -24,41 +25,32 @@ STATIC MountpointInterface sMountpointInterface;
/// @return the fork
_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) {
- theFork.Flags = kNewFSFlagCreated;
Lba lba = (theFork.Kind == kNewFSDataForkKind) ? catalog->DataFork
: catalog->ResourceFork;
- if (lba <= kNewFSCatalogStartAddress) return nullptr;
+ kcout << "Data-Fork-LBA: " << hex_number(lba) << endl;
- theFork.DataOffset = lba + sizeof(NewFork);
+ if (lba <= kNewFSCatalogStartAddress) return nullptr;
- if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return nullptr;
+ theFork.DataOffset = lba - sizeof(NewFork);
auto drv = sMountpointInterface.GetAddressOf(this->fDriveIndex);
- Char cpyFork[sizeof(NewFork)] = {0};
-
- drv->fPacket.fLba = lba + sizeof(NewCatalog);
- drv->fPacket.fPacketSize = sizeof(NewFork);
- drv->fPacket.fPacketContent = (VoidPtr)cpyFork;
-
- drv->fInput(&drv->fPacket);
-
- NewFork* cpyForkStruct = (NewFork*)cpyFork;
-
- if (cpyForkStruct->Flags == kNewFSFlagCreated) return nullptr;
-
/// special treatment.
rt_copy_memory((VoidPtr) "fs/newfs-packet", drv->fPacket.fPacketMime,
rt_string_len("fs/newfs-packet"));
drv->fPacket.fLba = lba;
drv->fPacket.fPacketSize = sizeof(NewFork);
- drv->fPacket.fPacketContent = (VoidPtr)&theFork;
+ drv->fPacket.fPacketContent = &theFork;
drv->fOutput(&drv->fPacket);
+ kcout << "New OS: Wrote fork data at: " << hex_number(theFork.DataOffset) << endl;
+
return &theFork;
}
@@ -74,6 +66,7 @@ _Output NewFork* NewFSParser::FindFork(_Input NewCatalog* catalog,
Boolean isDataFork) {
auto drv = sMountpointInterface.GetAddressOf(this->fDriveIndex);
NewFork* theFork = nullptr;
+
Lba lba = isDataFork ? catalog->DataFork : catalog->ResourceFork;
while (lba != 0) {
@@ -147,35 +140,35 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name,
return checkForCpy;
}
- char copyName[kNewFSNodeNameLen] = {0};
+ char parentName[kNewFSNodeNameLen] = {0};
for (SizeT indexName = 0UL; indexName < rt_string_len(name); ++indexName) {
- copyName[indexName] = name[indexName];
+ parentName[indexName] = name[indexName];
}
- if (*copyName == 0) {
+ if (*parentName == 0) {
DbgLastError() = kErrorFileNotFound;
return nullptr;
}
for (SizeT indexFill = 0; indexFill < rt_string_len(name); ++indexFill) {
- copyName[indexFill] = name[indexFill];
+ parentName[indexFill] = name[indexFill];
}
- SizeT indexReverseCopy = rt_string_len(copyName);
+ SizeT indexReverseCopy = rt_string_len(parentName);
// zero character.
- copyName[--indexReverseCopy] = 0;
+ parentName[--indexReverseCopy] = 0;
// mandatory / character.
- copyName[--indexReverseCopy] = 0;
+ parentName[--indexReverseCopy] = 0;
- while (copyName[indexReverseCopy] != '/') {
- copyName[indexReverseCopy] = 0;
+ while (parentName[indexReverseCopy] != '/') {
+ parentName[indexReverseCopy] = 0;
--indexReverseCopy;
}
- NewCatalog* catalog = this->FindCatalog(copyName, outLba);
+ NewCatalog* catalog = this->FindCatalog(parentName, outLba);
if (!catalog) {
return nullptr;
@@ -186,7 +179,7 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name,
return nullptr;
}
- constexpr SizeT cDefaultForkSize = 8192;
+ constexpr SizeT cDefaultForkSize = 8196;
NewCatalog* catalogChild = new NewCatalog();
@@ -195,29 +188,33 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name,
catalogChild->NextSibling = 0UL;
catalogChild->PrevSibling = outLba;
- catalogChild->Flags = flags;
catalogChild->Kind = kind;
- catalogChild->Flags |= kNewFSFlagCreated;
+ catalogChild->Flags = kNewFSFlagCreated;
rt_copy_memory((VoidPtr)name, (VoidPtr)catalogChild->Name,
rt_string_len(name));
- UInt16 sectorBuf[kNewFSMinimumSectorSz] = {0};
+ UInt16 catalogBuf[kNewFSMinimumSectorSz] = {0};
auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
Lba startFree = catalogChild->PrevSibling + catalog->NextSibling;
- kcout << "Next-Catalog: " << hex_number(startFree) << endl;
+ kcout << "Free-Catalog: " << hex_number(startFree) << endl;
+ kcout << "New-Catalog: " << name << endl;
+ kcout << "Parent-Catalog: " << parentName << endl;
- drive->fPacket.fPacketContent = sectorBuf;
+ rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime,
+ rt_string_len("fs/newfs-packet"));
+
+ drive->fPacket.fPacketContent = catalogBuf;
drive->fPacket.fPacketSize = kNewFSMinimumSectorSz;
drive->fPacket.fLba = startFree;
drive->fInput(&drive->fPacket);
while (drive->fPacket.fPacketGood) {
- NewCatalog* nextSibling = (NewCatalog*)sectorBuf;
+ NewCatalog* nextSibling = (NewCatalog*)catalogBuf;
if (startFree <= kNewFSAddressAsLba) {
delete catalogChild;
@@ -227,80 +224,82 @@ _Output NewCatalog* NewFSParser::CreateCatalog(_Input const char* name,
}
/// allocation or reallocation or catalog...
- if ((nextSibling->Name[0] == 0 &&
- nextSibling->Flags != kNewFSFlagCreated)) {
- catalogChild->DataFork = startFree + sizeof(NewCatalog);
- catalogChild->ResourceFork =
- startFree + sizeof(NewCatalog) + catalogChild->DataForkSize;
+ if (nextSibling->Flags != kNewFSFlagCreated) {
+ Char sectorBufPartBlock[kNewFSMinimumSectorSz] = {0};
- if ((nextSibling->Flags != kNewFSFlagCreated)) {
- nextSibling->Flags = kNewFSFlagCreated;
+ drive->fPacket.fPacketContent = sectorBufPartBlock;
+ drive->fPacket.fPacketSize = kNewFSMinimumSectorSz;
+ drive->fPacket.fLba = kNewFSAddressAsLba;
- drive->fPacket.fPacketContent = catalogChild;
- drive->fPacket.fPacketSize = sizeof(NewCatalog);
- drive->fPacket.fLba = startFree;
+ drive->fInput(&drive->fPacket);
- if (catalogChild->Kind == kNewFSCatalogKindFile) {
- rt_copy_memory((VoidPtr) "x-kind/file", (VoidPtr)catalogChild->Mime,
- rt_string_len("x-kind/file"));
- } else {
- rt_copy_memory((VoidPtr) "x-kind/dir", (VoidPtr)catalogChild->Mime,
- rt_string_len("x-kind/dir"));
- }
+ NewPartitionBlock* partBlock = (NewPartitionBlock*)sectorBufPartBlock;
- catalogChild->NextSibling = sizeof(NewCatalog) +
- catalogChild->DataForkSize +
- catalogChild->ResourceForkOverallSize;
+ catalogChild->DataFork =
+ partBlock->DiskSize - startFree - sizeof(NewCatalog);
- drive->fOutput(&drive->fPacket);
+ kcout << "DataFork: " << hex_number(catalogChild->DataFork) << endl;
- kcout << "New OS: Create new catalog successfully!\r\n";
+ catalogChild->ResourceFork = catalogChild->DataFork;
- Char sectBuf[sizeof(NewCatalog)] = {0};
+ if (catalogChild->Kind == kNewFSCatalogKindFile) {
+ rt_copy_memory((VoidPtr) "x-kind/file", (VoidPtr)catalogChild->Mime,
+ rt_string_len("x-kind/file"));
+ } else {
+ rt_copy_memory((VoidPtr) "x-kind/dir", (VoidPtr)catalogChild->Mime,
+ rt_string_len("x-kind/dir"));
+ }
- drive->fPacket.fPacketContent = sectBuf;
- drive->fPacket.fPacketSize = sizeof(NewCatalog);
- drive->fPacket.fLba = catalogChild->PrevSibling;
+ catalogChild->NextSibling = sizeof(NewCatalog) +
+ catalogChild->DataForkSize +
+ catalogChild->ResourceForkOverallSize;
- drive->fInput(&drive->fPacket);
+ rt_copy_memory(catalogChild, catalogBuf, sizeof(NewCatalog));
- NewCatalog* prevCatalog = (NewCatalog*)sectBuf;
- prevCatalog->NextSibling = startFree;
+ drive->fPacket.fPacketContent = catalogBuf;
+ drive->fPacket.fPacketSize = sizeof(NewCatalog);
+ drive->fPacket.fLba = startFree;
- drive->fOutput(&drive->fPacket);
+ drive->fOutput(&drive->fPacket);
- kcout << "Edit-Catalog: " << prevCatalog->Name << endl;
+ kcout << "New OS: Create new catalog, status: "
+ << hex_number(nextSibling->Flags) << endl;
- Char sectorBufPartBlock[kNewFSMinimumSectorSz] = {0};
+ Char sectBuf[sizeof(NewCatalog)] = {0};
- drive->fPacket.fPacketContent = sectorBufPartBlock;
- drive->fPacket.fPacketSize = kNewFSMinimumSectorSz;
- drive->fPacket.fLba = kNewFSAddressAsLba;
+ drive->fPacket.fPacketContent = sectBuf;
+ drive->fPacket.fPacketSize = sizeof(NewCatalog);
+ drive->fPacket.fLba = catalogChild->PrevSibling;
- drive->fInput(&drive->fPacket);
+ drive->fInput(&drive->fPacket);
- NewPartitionBlock* partBlock = (NewPartitionBlock*)sectorBufPartBlock;
+ NewCatalog* prevCatalog = (NewCatalog*)sectBuf;
+ prevCatalog->NextSibling = startFree;
- partBlock->SectorCount -= 1;
- partBlock->CatalogCount += 1;
- partBlock->FreeCatalog -= 1;
+ drive->fOutput(&drive->fPacket);
- drive->fOutput(&drive->fPacket);
+ kcout << "Edit-Catalog: " << prevCatalog->Name << endl;
- delete catalog;
- return catalogChild;
- } else {
- delete catalog;
- return nullptr;
- }
+ drive->fPacket.fPacketContent = sectorBufPartBlock;
+ drive->fPacket.fPacketSize = kNewFSMinimumSectorSz;
+ drive->fPacket.fLba = kNewFSAddressAsLba;
+
+ drive->fInput(&drive->fPacket);
+
+ partBlock->SectorCount -= 1;
+ partBlock->CatalogCount += 1;
+ partBlock->FreeCatalog -= 1;
+
+ drive->fOutput(&drive->fPacket);
+
+ delete catalog;
+ return catalogChild;
}
//// @note that's how we find the next catalog in the partition block.
- startFree += sizeof(NewFork) + sizeof(NewCatalog) +
- nextSibling->DataForkSize +
- nextSibling->ResourceForkOverallSize;
+ startFree += sizeof(NewFork) + sizeof(NewCatalog) + cDefaultForkSize;
- drive->fPacket.fPacketContent = sectorBuf;
+ drive->fPacket.fPacketContent = catalogBuf;
drive->fPacket.fPacketSize = kNewFSMinimumSectorSz;
drive->fPacket.fLba = startFree;
@@ -318,6 +317,9 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive) {
/// verify disk.
drive->fVerify(&drive->fPacket);
+ rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime,
+ rt_string_len("fs/newfs-packet"));
+
/// if disk isn't good, then error out.
if (false == drive->fPacket.fPacketGood) {
DbgLastError() = kErrorDiskIsCorrupted;
@@ -357,7 +359,7 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive) {
partBlock->Kind = kNewFSPartitionTypeStandard;
partBlock->StartCatalog = kNewFSCatalogStartAddress;
- partBlock->Flags |= kNewFSPartitionTypeStandard;
+ partBlock->Flags = kNewFSPartitionTypeStandard;
partBlock->CatalogCount = sectorCount / sizeof(NewCatalog);
partBlock->SectorCount = sectorCount;
partBlock->DiskSize = diskSize;
@@ -369,10 +371,19 @@ bool NewFSParser::Format(_Input _Output DriveTrait* drive) {
drive->fOutput(&drive->fPacket);
+ kcout << "Drive-Kind: " << drive->fDriveKind() << endl;
+
+ kcout << "Partition-Name: " << partBlock->PartitionName << endl;
+ kcout << "Start-Catalog: " << hex_number(partBlock->StartCatalog) << endl;
+ kcout << "Catalog-Count: " << hex_number(partBlock->CatalogCount) << endl;
+ kcout << "Free-Catalog: " << hex_number(partBlock->FreeCatalog) << endl;
+ kcout << "Free-Sectors: " << hex_number(partBlock->FreeSectors) << endl;
+ kcout << "Sector-Size: " << hex_number(partBlock->SectorSize) << endl;
+
return true;
}
- kcout << "New OS: PartitionBlock already exists.\r\n";
+ kcout << "New OS: PartitionBlock already exists.\r";
/// return success as well, do not ignore that partition.
return true;
@@ -391,9 +402,13 @@ bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data,
if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return false;
NewFork* forkData = new NewFork();
+ rt_set_memory(forkData, 0, sizeof(NewFork));
auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
+ rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime,
+ rt_string_len("fs/newfs-packet"));
+
auto startFork = catalog->DataFork;
/// sanity check of the fork position as the condition to run the loop.
@@ -404,18 +419,12 @@ bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data,
drive->fInput(&drive->fPacket);
- /// check if fork even exists.
- if (forkData->Flags != kNewFSFlagCreated) {
- DbgLastError() = kErrorDiskIsCorrupted;
-
- delete forkData;
- return false;
- }
-
/// sanity check the fork.
if (forkData->DataOffset <= kNewFSCatalogStartAddress) {
DbgLastError() = kErrorDiskIsCorrupted;
+ kcout << "New OS: Invalid fork offset.\r";
+
delete forkData;
return false;
}
@@ -433,8 +442,8 @@ bool NewFSParser::WriteCatalog(_Input _Output NewCatalog* catalog, voidPtr data,
}
/// @brief
-/// @param catalogName
-/// @return
+/// @param catalogName the catalog name.
+/// @return the newly found catalog.
_Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
Lba& outLba) {
if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return nullptr;
@@ -442,6 +451,9 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
Char* sectorBuf = new Char[sizeof(NewPartitionBlock)];
auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
+ rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime,
+ rt_string_len("fs/newfs-packet"));
+
drive->fPacket.fPacketContent = sectorBuf;
drive->fPacket.fPacketSize = sizeof(NewPartitionBlock);
drive->fPacket.fLba = kNewFSAddressAsLba;
@@ -450,15 +462,6 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
NewPartitionBlock* part = (NewPartitionBlock*)sectorBuf;
- kcout << "Drive-Kind: " << drive->fDriveKind() << endl;
-
- kcout << "Partition-Name: " << part->PartitionName << endl;
- kcout << "Start-Catalog: " << number(part->StartCatalog) << endl;
- kcout << "Catalog-Count: " << number(part->CatalogCount) << endl;
- kcout << "Free-Catalog: " << number(part->FreeCatalog) << endl;
- kcout << "Free-Sectors: " << number(part->FreeSectors) << endl;
- kcout << "Sector-Size: " << number(part->SectorSize) << endl;
-
auto start = part->StartCatalog;
drive->fPacket.fLba = start;
@@ -470,17 +473,30 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
while (drive->fPacket.fPacketGood) {
NewCatalog* catalog = (NewCatalog*)sectorBuf;
+ kcout << "Catalog-Name: " << catalog->Name << endl;
+ kcout << "Catalog-Flags: " << hex_number(catalog->Flags) << endl;
+
if (StringBuilder::Equals(catalogName, catalog->Name)) {
+ /// ignore unallocated catalog, break
+ if (catalog->Flags != kNewFSFlagCreated) {
+ goto _NewFSContinueSearch;
+ }
+
NewCatalog* catalogPtr = new NewCatalog();
rt_copy_memory(catalog, catalogPtr, sizeof(NewCatalog));
+ kcout << "New OS: Found catalog at: " << hex_number(start) << endl;
+
outLba = start;
delete[] sectorBuf;
return catalogPtr;
}
+ _NewFSContinueSearch:
start = catalog->NextSibling;
+ kcout << "Catalog-Next: " << hex_number(start) << endl;
+
if (start <= kNewFSAddressAsLba) break;
drive->fPacket.fLba = start;
@@ -508,28 +524,46 @@ _Output NewCatalog* NewFSParser::GetCatalog(_Input const char* name) {
/// @param catalog
/// @return
Boolean NewFSParser::CloseCatalog(_Input _Output NewCatalog* catalog) {
- if (this->WriteCatalog(catalog, nullptr, 0)) {
- delete catalog;
- catalog = nullptr;
+ if (!catalog) return false;
- return true;
- }
+ delete catalog;
+ catalog = nullptr;
- return false;
+ return true;
}
/// @brief Mark catalog as removed.
/// @param catalog The catalog structure.
/// @return
-Boolean NewFSParser::RemoveCatalog(_Input _Output NewCatalog* catalog) {
- if (!catalog) {
- DbgLastError() = kErrorFileNotFound;
+Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName) {
+ if (!catalogName) {
+ DbgLastError() = kErrorInternal;
return false;
}
- catalog->Flags |= kNewFSFlagDeleted;
- this->WriteCatalog(catalog, nullptr, 0);
+ Lba outLba = 0;
+ auto catalog = this->FindCatalog(catalogName, outLba);
+
+ if (outLba >= kNewFSCatalogStartAddress ||
+ catalog->Flags == kNewFSFlagCreated) {
+ catalog->Flags = kNewFSFlagDeleted;
+
+ auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
+ rt_copy_memory((VoidPtr) "fs/newfs-packet", drive->fPacket.fPacketMime,
+ rt_string_len("fs/newfs-packet"));
+
+ drive->fPacket.fLba = outLba; // the catalog position.
+ drive->fPacket.fPacketSize =
+ sizeof(NewCatalog); // size of catalog. roughly the sector size.
+ drive->fPacket.fPacketContent = catalog; // the catalog itself.
+
+ drive->fOutput(&drive->fPacket); // send packet.
+
+ return true;
+ }
+
+ delete catalog;
return false;
}
@@ -548,12 +582,55 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NewCatalog* catalog,
return nullptr;
}
- return nullptr;
+ if (!sMountpointInterface.GetAddressOf(this->fDriveIndex)) return nullptr;
+
+ Lba dataForkLba = catalog->DataFork;
+ Size dataForkSize = catalog->DataForkSize;
+
+ kcout << "Found-Catalog: " << catalog->Name
+ << ", Data-Fork: " << hex_number(dataForkLba) << endl;
+
+ Char* sectorBuf = new Char[sizeof(NewFork)];
+ auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
+
+ 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;
+
+ drive->fInput(&drive->fPacket);
+
+ NewFork* forkData = (NewFork*)sectorBuf;
+
+ kcout << "Fork-Name: " << forkData->Name << endl;
+
+ if (forkData->DataOffset <= kNewFSCatalogStartAddress ||
+ dataSz > forkData->DataSize) {
+ delete[] sectorBuf;
+
+ kcout << "Fail-Data-Offset: " << hex_number(forkData->DataOffset) << endl;
+
+ return nullptr;
+ }
+
+ Char* forkBuf = new Char[dataSz];
+
+ drive->fPacket.fLba = forkData->DataOffset;
+ drive->fPacket.fPacketSize = dataSz;
+ drive->fPacket.fPacketContent = forkBuf;
+
+ drive->fInput(&drive->fPacket);
+
+ delete[] sectorBuf;
+
+ return forkBuf;
}
/// @brief Seek in the data fork.
-/// @param catalog
-/// @param off
+/// @param catalog the catalog offset.
+/// @param off where to seek.
/// @return
bool NewFSParser::Seek(_Input _Output NewCatalog* catalog, SizeT off) {
if (!catalog) {
@@ -561,7 +638,7 @@ bool NewFSParser::Seek(_Input _Output NewCatalog* catalog, SizeT off) {
return false;
}
- return false;
+ return true;
}
/// @brief Tell where we are inside the data fork.
@@ -570,7 +647,7 @@ bool NewFSParser::Seek(_Input _Output NewCatalog* catalog, SizeT off) {
SizeT NewFSParser::Tell(_Input _Output NewCatalog* catalog) {
if (!catalog) {
DbgLastError() = kErrorFileNotFound;
- return false;
+ return 0;
}
return 0;