diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-21 08:47:04 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-21 08:47:04 +0200 |
| commit | 00e314410e6049c2ddbcb4861c04af6b06eeeea3 (patch) | |
| tree | be4ee060de121ac0b825b5b0263deb3a0ac74619 /dev | |
| parent | f00211b6023ad406553a6bf9208092f834a44cdd (diff) | |
dev, kernel, tools, tooling, tex: add mk_app tool, see details.
- Patch HeFS implementation file, working on a allocation
function now.
- Generated LaTeX specs from source code.
- Add mk.{hefs, nefs} tools for future formatting (with diutil
first)
- Add python tool to generate user apps for NeKernel.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 82 |
1 files changed, 55 insertions, 27 deletions
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 142ddbea..8d73b61e 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -15,6 +15,7 @@ #include <NewKit/KString.h> #include <NewKit/Utils.h> #include <FirmwareKit/EPM.h> +#include <FirmwareKit/GPT.h> #include <KernelKit/ProcessScheduler.h> #include <KernelKit/User.h> @@ -22,7 +23,30 @@ namespace Kernel { namespace Detail { - STATIC HEFS_INDEX_NODE* hefs_get_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept + /// @brief Forward declarations of internal functions. + + /// @brief Get the index node of a file or directory. + /// @param root The root node of the filesystem. + /// @param mnt The drive to read from. + /// @param dir_name The name of the directory. + /// @param file_name The name of the file. + /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown). + STATIC HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept; + + /// @brief Allocate a new index node. + /// @param root The root node of the filesystem. + /// @param mnt The drive to read from. + /// @param parent_dir_name The name of the parent directory. + /// @return Status, see err_global_get(). + STATIC BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept; + + /// @brief Get the index node of a file or directory. + /// @param root The root node of the filesystem. + /// @param mnt The drive to read from. + /// @param dir_name The name of the directory. + /// @param file_name The name of the file. + /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic link, unknown). + STATIC HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept { if (root) { @@ -42,10 +66,9 @@ namespace Kernel while (start != end) { - if (hop_watch++ > 100) + if (hop_watch > 100) { - kout << "Error: Hop watch exceeded.\r"; - + kout << "Error: Hop watch exceeded, filesystem is stalling.\r"; break; } @@ -66,8 +89,10 @@ namespace Kernel delete node; delete dir; - err_global_get() = kErrorFileNotFound; + dir = nullptr; + node = nullptr; + err_global_get() = kErrorFileNotFound; return nullptr; } @@ -78,9 +103,10 @@ namespace Kernel { for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index) { - if (dir->fIndexNodeStart[inode_index] != 0) + if (dir->fIndexNodeStart[inode_index] != 0 || + dir->fIndexNodeEnd[inode_index] != 0) { - mnt->fPacket.fPacketLba = dir->fIndexNodeStart[inode_index]; + mnt->fPacket.fPacketLba = (!dir->fIndexNodeStart[inode_index]) ? dir->fIndexNodeEnd[inode_index] : dir->fIndexNodeStart[inode_index]; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); mnt->fPacket.fPacketContent = node; @@ -91,35 +117,22 @@ namespace Kernel if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind) { delete dir; + dir = nullptr; return node; } } else { - break; - } - } - else if (dir->fIndexNodeEnd[inode_index] != 0) - { - mnt->fPacket.fPacketLba = dir->fIndexNodeEnd[inode_index]; - mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); - mnt->fPacket.fPacketContent = node; + err_global_get() = kErrorDiskIsCorrupted; - mnt->fInput(mnt->fPacket); + delete dir; + delete node; - if (mnt->fPacket.fPacketGood) - { - if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind) - { - delete dir; + dir = nullptr; + node = nullptr; - return node; - } - } - else - { - break; + return nullptr; } } } @@ -148,6 +161,21 @@ namespace Kernel return nullptr; } + + /// @brief Allocate a new index node. + /// @param root The root node of the filesystem. + /// @param mnt The drive to read from. + /// @param parent_dir_name The name of the parent directory. + /// @return Status, see err_global_get(). + STATIC BOOL hefs_allocate_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* parent_dir_name, HEFS_INDEX_NODE* node) noexcept + { + NE_UNUSED(root); + NE_UNUSED(mnt); + NE_UNUSED(parent_dir_name); + NE_UNUSED(node); + + return NO; + } } // namespace Detail } // namespace Kernel |
