diff options
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); +} |