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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user