summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/src
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/src')
-rw-r--r--dev/kernel/src/FS/Ext2.cc1
-rw-r--r--dev/kernel/src/FS/HeFS.cc134
-rw-r--r--dev/kernel/src/KString.cc12
3 files changed, 145 insertions, 2 deletions
diff --git a/dev/kernel/src/FS/Ext2.cc b/dev/kernel/src/FS/Ext2.cc
index 5de8c842..8331f506 100644
--- a/dev/kernel/src/FS/Ext2.cc
+++ b/dev/kernel/src/FS/Ext2.cc
@@ -8,7 +8,6 @@
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
-#include <modules/Flash/Flash.h>
#include <FSKit/Ext2.h>
#include <KernelKit/KPC.h>
#include <NewKit/Crc32.h>
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc
index 1c82548c..0344309e 100644
--- a/dev/kernel/src/FS/HeFS.cc
+++ b/dev/kernel/src/FS/HeFS.cc
@@ -8,7 +8,6 @@
#include <modules/AHCI/AHCI.h>
#include <modules/ATA/ATA.h>
-#include <modules/Flash/Flash.h>
#include <FSKit/HeFS.h>
#include <KernelKit/KPC.h>
#include <NewKit/Crc32.h>
@@ -19,4 +18,137 @@
#include <KernelKit/ProcessScheduler.h>
#include <KernelKit/User.h>
+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
+ {
+ if (root)
+ {
+ HeFS_INDEX_NODE* node = new HeFS_INDEX_NODE();
+ HeFS_INDEX_NODE_DIRECTORY* dir = new HeFS_INDEX_NODE_DIRECTORY();
+
+ if (!node)
+ {
+ kout << "Error: Failed to allocate memory for index node.\r";
+ return nullptr;
+ }
+
+ auto start = root->fStartIND;
+ auto end = root->fEndIND;
+
+ auto hop_watch = 0;
+
+ while (start != end)
+ {
+ if (hop_watch++ > 100)
+ {
+ kout << "Error: Hop watch exceeded.\r";
+
+ break;
+ }
+
+ if (start == 0)
+ {
+ ++hop_watch;
+ start = root->fStartIND;
+ }
+
+ mnt->fPacket.fPacketLba = start;
+ mnt->fPacket.fPacketSize = sizeof(HeFS_INDEX_NODE_DIRECTORY);
+ mnt->fPacket.fPacketContent = dir;
+
+ mnt->fInput(mnt->fPacket);
+
+ if (!mnt->fPacket.fPacketGood)
+ {
+ delete node;
+ delete dir;
+
+ err_global_get() = kErrorFileNotFound;
+
+
+ return nullptr;
+ }
+
+ if (dir->fKind == kHeFSFileKindDirectory)
+ {
+ if (KStringBuilder::Equals(dir_name, dir->fName))
+ {
+ for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; ++inode_index)
+ {
+ if (dir->fIndexNodeStart[inode_index] != 0)
+ {
+ mnt->fPacket.fPacketLba = dir->fIndexNodeStart[inode_index];
+ mnt->fPacket.fPacketSize = sizeof(HeFS_INDEX_NODE);
+ mnt->fPacket.fPacketContent = node;
+
+ mnt->fInput(mnt->fPacket);
+
+ if (mnt->fPacket.fPacketGood)
+ {
+ if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind)
+ {
+ delete dir;
+
+ 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;
+
+ mnt->fInput(mnt->fPacket);
+
+ if (mnt->fPacket.fPacketGood)
+ {
+ if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind)
+ {
+ delete dir;
+
+ return node;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ start = dir->fNext;
+
+ if (start == 0)
+ start = dir->fChild;
+
+ if (start == 0)
+ start = dir->fParent;
+ }
+
+ delete dir;
+ delete node;
+
+ dir = nullptr;
+ node = nullptr;
+ }
+
+ kout << "Error: Failed to find index node.\r";
+
+ err_global_get() = kErrorFileNotFound;
+
+ return nullptr;
+ }
+ } // namespace Detail
+} // namespace Kernel
+
#endif // ifdef __FSKIT_INCLUDES_HeFS__
diff --git a/dev/kernel/src/KString.cc b/dev/kernel/src/KString.cc
index c1a8db65..2f81ad3d 100644
--- a/dev/kernel/src/KString.cc
+++ b/dev/kernel/src/KString.cc
@@ -143,6 +143,18 @@ namespace Kernel
return true;
}
+ /// @note This is unsafe!!!
+ bool KStringBuilder::Equals(const Utf16Char* lhs, const Utf16Char* rhs)
+ {
+ for (Size index = 0; index[rhs] != 0; ++index)
+ {
+ if (rhs[index] != lhs[index])
+ return false;
+ }
+
+ return true;
+ }
+
bool KStringBuilder::Equals(const WideChar* lhs, const WideChar* rhs)
{
for (Size index = 0; rhs[index] != 0; ++index)