diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-22 18:02:40 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-08-22 18:02:40 +0200 |
| commit | 10099e99847307fae60aebdf2292002d359d45b4 (patch) | |
| tree | 718ab13485520d1e69b908b48baf48e988c64985 /dev/ZKA/Sources | |
| parent | b843322161bec86e707c45962ce9b7b76b0d1826 (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.cxx | 82 | ||||
| -rw-r--r-- | dev/ZKA/Sources/FileManager.cxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/Sources/KernelCheck.cxx | 4 | ||||
| -rw-r--r-- | dev/ZKA/Sources/User.cxx | 65 |
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 |
