summaryrefslogtreecommitdiffhomepage
path: root/Private
diff options
context:
space:
mode:
Diffstat (limited to 'Private')
-rw-r--r--Private/FSKit/NewFS.hxx17
-rw-r--r--Private/KernelKit/FileManager.hpp2
-rw-r--r--Private/KernelKit/PEF.hpp4
-rw-r--r--Private/NewBoot/BootKit/BootKit.hxx2
-rw-r--r--Private/Source/AppMain.cxx20
-rw-r--r--Private/Source/FS/NewFS.cxx129
-rw-r--r--Private/Source/FileManager.cxx16
-rw-r--r--Private/Source/KernelHeap.cxx5
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;