diff options
Diffstat (limited to 'Private/Source/FS')
| -rw-r--r-- | Private/Source/FS/NewFS.cxx | 183 |
1 files changed, 116 insertions, 67 deletions
diff --git a/Private/Source/FS/NewFS.cxx b/Private/Source/FS/NewFS.cxx index f497c2af..3c33f441 100644 --- a/Private/Source/FS/NewFS.cxx +++ b/Private/Source/FS/NewFS.cxx @@ -11,9 +11,9 @@ using namespace NewOS; -STATIC Lba ke_find_fork(SizeT sz); -STATIC Lba ke_find_catalog(SizeT sz); -STATIC Lba ke_find_data(SizeT sz); +STATIC Lba ke_find_free_fork(SizeT sz); +STATIC Lba ke_find_free_catalog(SizeT sz); +STATIC Lba ke_find_free_data(SizeT sz); STATIC MountpointInterface sMountpointInterface; @@ -21,72 +21,121 @@ STATIC MountpointInterface sMountpointInterface; /// @param catalog it's catalog /// @param theFork the fork itself. /// @return the fork -_Output NewFork* NewFSParser::CreateFork(_Input NewCatalog* catalog, _Input NewFork& theFork) -{ - if (catalog && - theFork.Name[0] != 0 && - theFork.DataSize > 0) { - Lba whereFork = 0; - - theFork.DataOffset = ke_find_fork(theFork.DataSize); - theFork.Flags |= kNewFSFlagCreated; - - if (catalog->FirstFork == 0) { - catalog->FirstFork = whereFork; - } else { - if (catalog->LastFork == 0) { - theFork.PreviousSibling = catalog->FirstFork; - } - } - - if (catalog->LastFork == 0) { - catalog->LastFork = whereFork; - } else { - theFork.PreviousSibling = catalog->LastFork; - } - - if (!sMountpointInterface.GetAddressOf(this->fDriveIndex) || - !*sMountpointInterface.GetAddressOf(this->fDriveIndex)) - return nullptr; - - auto drv = *sMountpointInterface.GetAddressOf(this->fDriveIndex); - - drv->fPacket.fLba = whereFork; - drv->fPacket.fPacketSize = theFork.DataSize; - drv->fPacket.fPacketContent = (VoidPtr)&theFork; - - rt_copy_memory((VoidPtr)"fs/newfs-packet", drv->fPacket.fPacketMime, 16); - - if (auto res = fs_newfs_write(&sMountpointInterface, *drv, this->fDriveIndex); - res) { - switch (res) - { - case 1: - DbgLastError() = kErrorDiskReadOnly; - break; - case 2: - DbgLastError() = kErrorDiskIsFull; - break; - DbgLastError() = kErrorNoSuchDisk; - break; - - default: - break; - } - return nullptr; - } - - /// Also update catalog. - this->WriteCatalog(catalog, nullptr); - - return &theFork; +_Output NewFork* NewFSParser::CreateFork(_Input NewCatalog* catalog, + _Input NewFork& theFork) { + if (catalog && theFork.Name[0] != 0 && theFork.DataSize > 0) { + Lba whereFork = 0; + + theFork.DataOffset = ke_find_free_fork(theFork.DataSize); + theFork.Flags |= kNewFSFlagCreated; + + if (catalog->FirstFork == 0) { + catalog->FirstFork = whereFork; + } else { + if (catalog->LastFork == 0) { + theFork.PreviousSibling = catalog->FirstFork; + } } - return nullptr; + if (catalog->LastFork == 0) { + catalog->LastFork = whereFork; + } else { + theFork.PreviousSibling = catalog->LastFork; + } + + if (!sMountpointInterface.GetAddressOf(this->fDriveIndex) || + !*sMountpointInterface.GetAddressOf(this->fDriveIndex)) + return nullptr; + + auto drv = *sMountpointInterface.GetAddressOf(this->fDriveIndex); + + drv->fPacket.fLba = whereFork; + drv->fPacket.fPacketSize = theFork.DataSize; + drv->fPacket.fPacketContent = (VoidPtr)&theFork; + + rt_copy_memory((VoidPtr) "fs/newfs-packet", drv->fPacket.fPacketMime, 16); + + if (auto res = + fs_newfs_write(&sMountpointInterface, *drv, this->fDriveIndex); + res) { + switch (res) { + case 1: + DbgLastError() = kErrorDiskReadOnly; + break; + case 2: + DbgLastError() = kErrorDiskIsFull; + break; + DbgLastError() = kErrorNoSuchDisk; + break; + + default: + break; + } + return nullptr; + } + + /// Also update catalog. + this->WriteCatalog(catalog, nullptr); + + return &theFork; + } + + return nullptr; +} + +/// @brief Find fork inside New filesystem. +/// @param catalog the catalog. +/// @param name the fork name. +/// @return the fork. +_Output NewFork* NewFSParser::FindFork(_Input NewCatalog* catalog, + _Input const Char* name) { + auto drv = *sMountpointInterface.GetAddressOf(this->fDriveIndex); + NewFork* theFork = nullptr; + Lba lba = catalog->FirstFork; + + while (lba != 0) { + drv->fPacket.fLba = lba; + drv->fPacket.fPacketSize = sizeof(NewFork); + drv->fPacket.fPacketContent = (VoidPtr)theFork; + + rt_copy_memory((VoidPtr) "fs/newfs-packet", drv->fPacket.fPacketMime, 16); + + if (auto res = + fs_newfs_read(&sMountpointInterface, *drv, this->fDriveIndex); + res) { + switch (res) { + case 1: + DbgLastError() = kErrorDiskReadOnly; + break; + case 2: + DbgLastError() = kErrorDiskIsFull; + break; + DbgLastError() = kErrorNoSuchDisk; + break; + + default: + break; + } + return nullptr; + } + + if (StringBuilder::Equals(theFork->Name, name)) { + break; + } + + lba = theFork->NextSibling; + } + + return theFork; } -STATIC Lba ke_find_fork(SizeT sz) {} -STATIC Lba ke_find_catalog(SizeT sz) {} -STATIC Lba ke_find_data(SizeT sz) {} +/// @brief Make a EPM+NewFS drive out of the disk. +/// @param drive The drive to write on. +/// @return If it was sucessful, see DbgLastError(). +bool NewFSParser::Format(_Input _Output DriveTrait* drive) { return false; } + +STATIC Lba ke_find_free_fork(SizeT sz) { return 0; } +STATIC Lba ke_find_free_catalog(SizeT sz) { return 0; } +STATIC Lba ke_find_free_data(SizeT sz) { return 0; } -#endif // ifdef __FSKIT_NEWFS__
\ No newline at end of file +#endif // ifdef __FSKIT_NEWFS__
\ No newline at end of file |
