summaryrefslogtreecommitdiffstats
path: root/sys/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/link.c')
-rw-r--r--sys/link.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/sys/link.c b/sys/link.c
index 5be9457..592fe8f 100644
--- a/sys/link.c
+++ b/sys/link.c
@@ -2,31 +2,23 @@
#include "arch/x86_64/hal/obj.h"
#include "hal/memory.h"
-void*
-obj_deref_linked(jove_owned_obj_t *obj)
+uint8_t
+link_gettype(jove_owned_obj_t *obj)
{
- switch(obj_gettype(obj)) {
- case JOVE_OBJ_LINK: return obj_deref_linked(link_deref(obj));
- default: return obj_deref(obj);
- }
+ return obj_gettype(link_deref(obj));
}
uint8_t
-obj_gettype_linked(jove_owned_obj_t *obj)
+link_getperm(jove_owned_obj_t *link)
{
- switch(obj_gettype(obj)) {
- case JOVE_OBJ_LINK: return obj_gettype_linked(link_deref(obj));
- default: return obj_gettype(obj);
- }
+ struct obj_link *linkval = obj_deref(link);
+ return linkval->permissions;
}
uint64_t
-obj_getvalue_linked(jove_owned_obj_t *obj)
+link_getvalue(jove_owned_obj_t *obj)
{
- switch(obj_gettype(obj)) {
- case JOVE_OBJ_LINK: return obj_getvalue_linked(link_deref(obj));
- default: return obj_getvalue(obj);
- }
+ return obj_getvalue(link_deref(obj));
}
jove_owned_obj_t*
@@ -36,11 +28,41 @@ link_deref(jove_owned_obj_t *link)
return obj_take(&linkval->obj);
}
-jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst)
+jove_owned_obj_t*
+link_try_deref(jove_owned_obj_t *link)
+{
+ struct obj_link *linkval = obj_deref(link);
+ return obj_trytake(&linkval->obj);
+}
+
+jove_perm_obj_t
+link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack)
+{
+ jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL };
+ while(obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) {
+ perm_obj.permissions &= link_getperm(perm_obj.obj);
+ perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj));
+ }
+ return perm_obj;
+}
+
+jove_perm_obj_t
+link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack)
+{
+ jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL };
+ while(perm_obj.obj != NULL && obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) {
+ perm_obj.permissions &= link_getperm(perm_obj.obj);
+ perm_obj.obj = lockstack_push(lockstack, link_deref(perm_obj.obj));
+ }
+ return perm_obj;
+}
+
+jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions)
{
struct obj_link *linkval = obj_deref(dst);
linkval->obj = *tgt;
linkval->refcount = 2;
+ linkval->permissions = permissions;
{
jove_owned_obj_t *tgt_owned = obj_take(tgt);