diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2025-07-30 14:32:01 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2025-07-30 14:32:01 -0400 |
commit | b905869a35f062a4e5072f10bec3a2ba3db0e365 (patch) | |
tree | 0666691804878857b4bb07daca8a54f5ddb8ae0b /syscall/invoke_objdir.c | |
download | jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.tar.gz jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.tar.bz2 jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.zip |
working userland with some invoke syscalls
Diffstat (limited to 'syscall/invoke_objdir.c')
-rw-r--r-- | syscall/invoke_objdir.c | 34 |
1 files changed, 34 insertions, 0 deletions
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); +} |