stos: ob: Add directory object operations

This commit adds operations for appending directories and top-level
lookups.

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-25 23:26:13 +00:00
parent 53d0e27b4f
commit 99261380ca
2 changed files with 99 additions and 0 deletions
+80
View File
@@ -104,3 +104,83 @@ ObReclaimObject(ST_OBJECT *Object)
ObReclaimToCache(&gObCache, Object);
}
}
ST_STATUS
ObAppendDirectory(ST_OBJECT *DirecParent, ST_OBJECT *Object)
{
OBJECT_DIRECTORY *Directory;
ST_OBJECT *Last;
if (DirecParent == NULL || Object == NULL) {
return STATUS_INVALID_PARAM;
}
if (DirecParent->Type != OBJECT_TYPE_DIRECTORY) {
return STATUS_NOT_DIRECTORY;
}
Directory = DirecParent->Data;
if (Directory == NULL) {
return STATUS_IO_ERROR;
}
/* TODO: Place lock here */
if (Directory->First == NULL || Directory->Last == NULL) {
Directory->First = Object;
Directory->Last = Object;
} else {
Last = Directory->Last;
Last->DirecNext = Object;
Directory->Last = Object;
}
return STATUS_SUCCESS;
}
ST_STATUS
ObLookupFromTop(ST_OBJECT *Parent, const CHAR *Name, ST_OBJECT **Result)
{
ST_OBJECT *Entry;
OBJECT_DIRECTORY *ParentDirec;
USIZE NameLen;
if (Parent == NULL || Name == NULL) {
return STATUS_INVALID_PARAM;
}
if (Result == NULL) {
return STATUS_INVALID_PARAM;
}
/* Must be a directory */
if (Parent->Type != OBJECT_TYPE_DIRECTORY) {
return STATUS_NOT_DIRECTORY;
}
ParentDirec = Parent->Data;
if (ParentDirec == NULL) {
return STATUS_IO_ERROR;
}
Entry = ParentDirec->First;
NameLen = RtlStrLen(Name);
if (NameLen >= OBJECT_NAMESZ - 1) {
return STATUS_NAME_TOO_LONG;
}
while (Entry != NULL) {
if (*Entry->Name != *Name) {
Entry = Entry->DirecNext;
continue;
}
if (RtlMemCmp(Entry->Name, Name, NameLen) == 0) {
*Result = Entry;
return STATUS_SUCCESS;
}
Entry = Entry->DirecNext;
}
return STATUS_NOT_FOUND;
}