summaryrefslogtreecommitdiffstats
path: root/sys/syscall_objdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/syscall_objdir.c')
-rw-r--r--sys/syscall_objdir.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/sys/syscall_objdir.c b/sys/syscall_objdir.c
new file mode 100644
index 0000000..cf1e5b7
--- /dev/null
+++ b/sys/syscall_objdir.c
@@ -0,0 +1,46 @@
+#include "hal/process.h"
+#include "jove.h"
+#include "lib/printf.h"
+#include "syscall.h"
+
+int
+s_syscall_objdir_objtype(
+ jove_owned_obj_t *objdir,
+ jove_owned_obj_t *target_dir,
+ size_t payload_size,
+ void *payload_data)
+{
+ int bytes_needed = sizeof(struct syscall_generic_objpath);
+ CHECK_TOOSMALL(bytes_needed, payload_size, "Message is too small for this payload!");
+
+ struct syscall_generic_objpath *payload = payload_data;
+ bytes_needed += payload->second_pathlen * 2;
+ CHECK_TOOSMALL(bytes_needed, payload_size, "Message is too small for second target path!");
+
+ int retval = 0;
+ jove_owned_obj_t *second_obj = objdir_getobj(objdir, payload->second_path, payload->second_pathlen);
+ CHECK_OBJEXISTS(second_obj, "Second target does not exist!");
+
+ retval = obj_gettype(second_obj);
+ obj_release(second_obj);
+ return retval;
+}
+
+int
+_syscall_handle_objdir(
+ jove_owned_obj_t *pcb_obj,
+ jove_owned_obj_t *objdir,
+ jove_owned_obj_t *message_obj,
+ jove_owned_obj_t *target_obj,
+ struct syscall_header *header,
+ size_t bytes_left,
+ void *payload)
+{
+ switch(header->callid) {
+ case SYSCALL_OBJDIR_OBJTYPE:
+ return s_syscall_objdir_objtype(objdir, target_obj, bytes_left, payload);
+ default:
+ kprintf("syscall_handle_objdir: Objdir does not support syscall %i\n", header->callid);
+ return EOOB;
+ }
+}