summaryrefslogtreecommitdiffstats
path: root/sys/syscall_untyped.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/syscall_untyped.c')
-rw-r--r--sys/syscall_untyped.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/syscall_untyped.c b/sys/syscall_untyped.c
index 3467830..fcdb5f6 100644
--- a/sys/syscall_untyped.c
+++ b/sys/syscall_untyped.c
@@ -20,7 +20,7 @@ s_syscall_untyped_split(
jove_owned_obj_t *dst_obj = objdir_getobj(objdir, payload->dest_path, payload->dest_pathlen);
CHECK_OBJTYPE(dst_obj, JOVE_OBJ_NONE, "Destination path is occupied!");
-
+
return untyped_split(target_obj, dst_obj, payload->bytes);
}
@@ -41,7 +41,14 @@ s_syscall_untyped_merge(
jove_owned_obj_t *snd_obj = objdir_getobj(objdir, payload->path, payload->pathlen);
CHECK_OBJTYPE(snd_obj, JOVE_OBJ_UNTYPED, "Second object is not an untyped!");
- return untyped_merge(target_obj, snd_obj);
+ int sysret = untyped_merge(target_obj, snd_obj);
+ if(obj_gettype(snd_obj) == JOVE_OBJ_UNTYPED) {
+ //Untyped merged into second object. We need to switch objects.
+ obj_settype(target_obj, JOVE_OBJ_UNTYPED);
+ obj_setvalue(target_obj, obj_getvalue(snd_obj));
+ obj_settype(snd_obj, JOVE_OBJ_NONE);
+ }
+ return sysret;
}
@@ -55,12 +62,14 @@ int _syscall_handle_untyped(
void* payload)
{
switch(header->callid) {
+ case SYSCALL_UNTYPED_ADDRESS:
+ return untyped_address(target_obj);
case SYSCALL_UNTYPED_SIZE:
return untyped_size(target_obj);
- case SYSCALL_UNTYPED_ALIGN:
- return untyped_align(target_obj);
case SYSCALL_UNTYPED_SPLIT:
return s_syscall_untyped_split(objdir, target_obj, payload_bytes, payload);
+ case SYSCALL_UNTYPED_MERGE:
+ return s_syscall_untyped_merge(objdir, target_obj, payload_bytes, payload);
default:
kprintf("syscall_untyped: Untyped object does not support syscall %i\n", header->callid);
return EBADARG;