From b905869a35f062a4e5072f10bec3a2ba3db0e365 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 30 Jul 2025 14:32:01 -0400 Subject: working userland with some invoke syscalls --- syscall/invoke_objdir.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 syscall/invoke_objdir.c (limited to 'syscall/invoke_objdir.c') diff --git a/syscall/invoke_objdir.c b/syscall/invoke_objdir.c new file mode 100644 index 0000000..4698f34 --- /dev/null +++ b/syscall/invoke_objdir.c @@ -0,0 +1,34 @@ +#include "handles.h" +#include "syscall.h" + +static int +s_handle_invoke_objdir_nmemb(objdir_t *root_dir, objdir_t *target_dir, void *payload) +{ + struct syscallInvoke_objdir_nmemb *payloadStruct = payload; + payloadStruct->value = target_dir->self.data; + return 0; +} + +static int +s_handle_invoke_objdir_getmemb(objdir_t *root_dir, objdir_t *target_dir, void *payload) +{ + struct syscallInvoke_objdir_getmemb *payloadStruct = payload; + payloadStruct->value = target_dir->entries[payloadStruct->member].type; + return 0; +} + +static int (*s_invoke_handles[])(objdir_t*, objdir_t*, void*) = { + [INVOKE_OBJDIR_NMEMB] = s_handle_invoke_objdir_nmemb, + [INVOKE_OBJDIR_GETMEMB] = s_handle_invoke_objdir_getmemb +}; +static size_t s_invoke_handles_count = sizeof(s_invoke_handles) / sizeof(void*); + +int +syscall_handle_invoke_objdir(objdir_t *root_dir, objdir_t *target_dir, void *payload) +{ + struct syscallInvokeHeader *invokeHeader = payload; + size_t funcid = invokeHeader->func_id; + + if(funcid >= s_invoke_handles_count) return -1; + return s_invoke_handles[funcid](root_dir, target_dir, payload); +} -- cgit v1.2.1