summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/Sources
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-22 18:02:40 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-08-22 18:02:40 +0200
commit10099e99847307fae60aebdf2292002d359d45b4 (patch)
tree718ab13485520d1e69b908b48baf48e988c64985 /dev/ZKA/Sources
parentb843322161bec86e707c45962ce9b7b76b0d1826 (diff)
[FIX] Work In Progress patches regarding user login and filesystem
driver. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA/Sources')
-rw-r--r--dev/ZKA/Sources/FS/NewFS.cxx82
-rw-r--r--dev/ZKA/Sources/FileManager.cxx2
-rw-r--r--dev/ZKA/Sources/KernelCheck.cxx4
-rw-r--r--dev/ZKA/Sources/User.cxx65
4 files changed, 66 insertions, 87 deletions
diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx
index bea3e9ec..503c184b 100644
--- a/dev/ZKA/Sources/FS/NewFS.cxx
+++ b/dev/ZKA/Sources/FS/NewFS.cxx
@@ -94,7 +94,7 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata
kcout << "newoskrnl: next fork: " << hex_number(curFork.NextSibling) << endl;
- if (curFork.Flags == kNewFSFlagCreated)
+ if (curFork.Flags & kNewFSFlagCreated)
{
kcout << "newoskrnl: fork already exists.\r";
@@ -133,7 +133,7 @@ _Output NFS_FORK_STRUCT* NewFSParser::CreateFork(_Input NFS_CATALOG_STRUCT* cata
constexpr auto cForkPadding =
4; /// this value gives us space for the data offset.
- theFork.Flags = kNewFSFlagCreated;
+ theFork.Flags |= kNewFSFlagCreated;
theFork.DataOffset = lba - sizeof(NFS_FORK_STRUCT) * cForkPadding;
theFork.PreviousSibling = lbaOfPreviousFork;
theFork.NextSibling = theFork.DataOffset - theFork.DataSize;
@@ -307,23 +307,13 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
Int32 flagsList = flags;
- if (flagsList & kNewFSCatalogKindMetaFile)
- {
- if (UserManager::The()->GetCurrent() != UserManager::The()->fRootUser &&
- UserManager::The()->fRootUser)
- {
- delete catalogChild;
- return nullptr;
- }
- }
-
catalogChild->ResourceForkSize = cDefaultForkSize;
catalogChild->DataForkSize = cDefaultForkSize;
catalogChild->NextSibling = outLba;
catalogChild->PrevSibling = outLba;
catalogChild->Kind = kind;
- catalogChild->Flags = kNewFSFlagCreated | flagsList;
+ catalogChild->Flags |= kNewFSFlagCreated | flagsList;
rt_copy_memory((VoidPtr)name, (VoidPtr)catalogChild->Name,
rt_string_len(name));
@@ -367,7 +357,7 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::CreateCatalog(_Input const Char* name,
// ========================== //
// allocate catalog now...
// ========================== //
- if (nextSibling->Flags != kNewFSFlagCreated)
+ if (!(nextSibling->Flags & kNewFSFlagCreated))
{
Char sectorBufPartBlock[kNewFSSectorSz] = {0};
@@ -680,7 +670,7 @@ bool NewFSParser::WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, Bool
continue;
}
- forkDataIn.Flags = kNewFSFlagCreated;
+ forkDataIn.Flags |= kNewFSFlagCreated;
drive.fPacket.fPacketContent = data;
drive.fPacket.fPacketSize = sizeOfData;
@@ -732,10 +722,13 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::FindCatalog(_Input const Char* catalogN
NFS_ROOT_PARTITION_BLOCK* part = (NFS_ROOT_PARTITION_BLOCK*)sectorBuf;
auto startCatalogList = part->StartCatalog;
- const auto cCtartCatalogList = part->StartCatalog;
+ const auto cStartCatalogList = part->StartCatalog;
auto localSearchFirst = false;
+ delete sectorBuf;
+ sectorBuf = new Char[sizeof(NFS_CATALOG_STRUCT)];
+
drive.fPacket.fLba = startCatalogList;
drive.fPacket.fPacketContent = sectorBuf;
drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
@@ -781,52 +774,52 @@ _Output NFS_CATALOG_STRUCT* NewFSParser::FindCatalog(_Input const Char* catalogN
}
}
- kcout << "newoskrnl: fetching catalog...\r";
+ kcout << "newoskrnl: Fetching catalog: " << catalogName << "\r";
+
+ startCatalogList = cStartCatalogList;
_NewFSSearchThroughCatalogList:
while (drive.fPacket.fPacketGood)
{
- NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)sectorBuf;
+ drive.fPacket.fLba = startCatalogList;
+ drive.fPacket.fPacketContent = sectorBuf;
+ drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
- if (StringBuilder::Equals(catalogName, catalog->Name))
- {
- /// ignore unallocated catalog, break
- if (catalog->Flags != kNewFSFlagCreated)
- {
- goto NewFSContinueSearch;
- }
+ drive.fInput(&drive.fPacket);
+
+ NFS_CATALOG_STRUCT* catalog = (NFS_CATALOG_STRUCT*)sectorBuf;
- NFS_CATALOG_STRUCT* catalogPtr = new NFS_CATALOG_STRUCT();
- rt_copy_memory(catalog, catalogPtr, sizeof(NFS_CATALOG_STRUCT));
+ kcout << "newoskrnl: Fetching catalog: " << catalog->Name << "\r";
+ kcout << "newoskrnl: Fetching catalog: " << catalogName << "\r";
- kcout << "newoskrnl: found catalog at: " << hex_number(startCatalogList) << endl;
+ if (StringBuilder::Equals(catalogName, catalog->Name) &&
+ (catalog->Flags & kNewFSFlagCreated))
+ {
+ kcout << "newoskrnl: Found catalog at: " << hex_number(startCatalogList) << endl;
outLba = startCatalogList;
- delete[] sectorBuf;
- return catalogPtr;
+ return catalog;
}
NewFSContinueSearch:
startCatalogList = catalog->NextSibling;
if (startCatalogList <= kNewFSStartLba)
+ {
break;
-
- drive.fPacket.fLba = startCatalogList;
- drive.fPacket.fPacketContent = sectorBuf;
- drive.fPacket.fPacketSize = sizeof(NFS_CATALOG_STRUCT);
-
- drive.fInput(&drive.fPacket);
+ }
}
if (localSearchFirst)
{
localSearchFirst = false;
- startCatalogList = cCtartCatalogList;
+ startCatalogList = cStartCatalogList;
goto _NewFSSearchThroughCatalogList;
}
+ kcout << "Didnt find it.\r";
+
outLba = 0UL;
delete[] sectorBuf;
@@ -838,8 +831,10 @@ _NewFSSearchThroughCatalogList:
/// @return
_Output NFS_CATALOG_STRUCT* NewFSParser::GetCatalog(_Input const Char* name)
{
- Lba unused = 0;
- return this->FindCatalog(name, unused);
+ Lba unused = 0;
+ NFS_CATALOG_STRUCT* catalog = this->FindCatalog(name, unused);
+
+ return catalog;
}
/// @brief Closes a catalog, (frees it).
@@ -872,9 +867,9 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName)
auto catalog = this->FindCatalog(catalogName, outLba);
if (outLba >= kNewFSCatalogStartAddress ||
- catalog->Flags == kNewFSFlagCreated)
+ (catalog->Flags & kNewFSFlagCreated))
{
- catalog->Flags = kNewFSFlagDeleted;
+ catalog->Flags |= kNewFSFlagDeleted;
auto drive = sMountpointInterface.A();
@@ -923,6 +918,7 @@ Boolean NewFSParser::RemoveCatalog(_Input const Char* catalogName)
/***********************************************************************************/
VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
+ _Input Bool isRsrcFork,
_Input SizeT dataSz,
_Input const Char* forkName)
{
@@ -932,10 +928,12 @@ VoidPtr NewFSParser::ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
return nullptr;
}
+ kcout << "newoskrnl: Reading catalog..\r";
+
Lba dataForkLba = catalog->DataFork;
Size dataForkSize = catalog->DataForkSize;
- kcout << "newoskrnl: catalog " << catalog->Name
+ kcout << "newoskrnl: Catalog " << catalog->Name
<< ", fork: " << hex_number(dataForkLba) << endl;
Char* sectorBuf = new Char[sizeof(NFS_FORK_STRUCT)];
diff --git a/dev/ZKA/Sources/FileManager.cxx b/dev/ZKA/Sources/FileManager.cxx
index b590ef69..92245f4f 100644
--- a/dev/ZKA/Sources/FileManager.cxx
+++ b/dev/ZKA/Sources/FileManager.cxx
@@ -140,7 +140,7 @@ namespace Kernel
NEWOS_UNUSED(flags);
if ((reinterpret_cast<NFS_CATALOG_STRUCT*>(node))->Kind == kNewFSCatalogKindFile)
- return fImpl->ReadCatalog(reinterpret_cast<NFS_CATALOG_STRUCT*>(node), sz,
+ return fImpl->ReadCatalog(reinterpret_cast<NFS_CATALOG_STRUCT*>(node), (flags & cFileFlagRsrc ? true : false), sz,
name);
return nullptr;
diff --git a/dev/ZKA/Sources/KernelCheck.cxx b/dev/ZKA/Sources/KernelCheck.cxx
index 6a900039..7b919613 100644
--- a/dev/ZKA/Sources/KernelCheck.cxx
+++ b/dev/ZKA/Sources/KernelCheck.cxx
@@ -77,6 +77,10 @@ namespace Kernel
cg_write_text("0x00000006 ACPI error.", start_y, x, panicTxt);
break;
}
+ case RUNTIME_CHECK_FILESYSTEM: {
+ cg_write_text("0x0000000A Filesystem corruption error.", start_y, x, panicTxt);
+ break;
+ }
case RUNTIME_CHECK_POINTER: {
cg_write_text("0x00000000 Kernel heap error.", start_y, x, panicTxt);
break;
diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx
index 3aad5ad4..df6a4b9b 100644
--- a/dev/ZKA/Sources/User.cxx
+++ b/dev/ZKA/Sources/User.cxx
@@ -58,7 +58,7 @@ namespace Kernel
User::User(const RingKind& ringKind, const Char* userName)
: fRing(ringKind)
{
- rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName));
+ rt_copy_memory((VoidPtr)userName, this->fUserName, rt_string_len(userName));
}
User::~User() = default;
@@ -86,14 +86,16 @@ namespace Kernel
if (!node)
{
- node = new_fs->GetParser()->CreateCatalog(kUsersFile);
+ ErrLocal() = kErrorInternal;
+
+ return false;
}
kcout << "newoskrnl: Writing token...\r";
NFS_FORK_STRUCT fork{0};
- fork.Kind = kNewFSRsrcForkKind;
+ fork.Kind = kNewFSDataForkKind;
fork.DataSize = rt_string_len(password);
rt_copy_memory((VoidPtr)this->fUserName, fork.ForkName, rt_string_len(this->fUserName));
@@ -103,7 +105,8 @@ namespace Kernel
new_fs->GetParser()->CreateFork(node, fork);
- new_fs->GetParser()->WriteCatalog(node, (fork.Kind == kNewFSRsrcForkKind), reinterpret_cast<VoidPtr>(token), len, this->fUserName);
+ // writing the data fork now. False means a data fork.
+ bool wrote = new_fs->GetParser()->WriteCatalog(node, false, reinterpret_cast<VoidPtr>(token), len, this->fUserName);
delete node;
node = nullptr;
@@ -111,8 +114,8 @@ namespace Kernel
delete[] token;
token = nullptr;
- kcout << "newoskrnl: Wrote token...\r";
- return true;
+ kcout << "newoskrnl: Wrote token?\r";
+ return wrote;
}
kcout << "No filesystem mounted...\r";
@@ -163,10 +166,9 @@ namespace Kernel
return view;
}
- Bool UserManager::TryLogIn(User* user, const Char* password) noexcept
+ Bool UserManager::TryLogIn(User& user, const Char* password) noexcept
{
- if (!password ||
- !user)
+ if (!password)
{
kcout << "newoskrnl: Incorrect data given.\r";
@@ -192,9 +194,15 @@ namespace Kernel
// ------------------------------------------ //
if (!node)
+ {
+ ErrLocal() = kErrorInvalidData;
+ kcout << "newoskrnl: No such path.\r";
return false;
+ }
- auto token = new_fs->GetParser()->ReadCatalog(node, rt_string_len(password), user->fUserName);
+ kcout << "newoskrnl: reading: " << node->Name << endl;
+
+ auto token = new_fs->GetParser()->ReadCatalog(node, false, rt_string_len(password), user.fUserName);
if (!token)
{
@@ -217,7 +225,7 @@ namespace Kernel
// Construct token.
// ================================================== //
- Detail::cred_construct_token(generated_token, password, user, rt_string_len(password));
+ Detail::cred_construct_token(generated_token, password, &user, rt_string_len(password));
// ================================================== //
// Checks if it matches the current token we have.
@@ -234,25 +242,7 @@ namespace Kernel
kcout << "newoskrnl: Credentials are correct, moving on.\r";
}
- // ------------------------------------------ //
- // This was successful, continue.
- // ------------------------------------------ //
-
- user->fUserToken = token;
-
- if (fCurrentUser)
- {
- if (!fLastLoggedOffUser)
- {
- fLastLoggedOffUser = fCurrentUser;
- }
- else
- {
- this->TryLogOff();
- }
- }
-
- fCurrentUser = user;
+ fCurrentUser = &user;
Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name() << Kernel::endl;
return true;
@@ -265,19 +255,6 @@ namespace Kernel
Void UserManager::TryLogOff() noexcept
{
- if (!fCurrentUser)
- return;
-
- // an illegal operation just occured, we can't risk more.
- if (fCurrentUser == fRootUser)
- {
- ke_stop(RUNTIME_CHECK_BOOTSTRAP);
- }
-
- if (fLastLoggedOffUser)
- delete fLastLoggedOffUser;
-
- fLastLoggedOffUser = nullptr;
- fLastLoggedOffUser = fCurrentUser;
+ fCurrentUser = nullptr;
}
} // namespace Kernel