summaryrefslogtreecommitdiffstats
path: root/syscall/invoke_objdir.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2025-07-30 14:32:01 -0400
committerJon Santmyer <jon@jonsantmyer.com>2025-07-30 14:32:01 -0400
commitb905869a35f062a4e5072f10bec3a2ba3db0e365 (patch)
tree0666691804878857b4bb07daca8a54f5ddb8ae0b /syscall/invoke_objdir.c
downloadjove-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.c34
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);
+}