summaryrefslogtreecommitdiffstats
path: root/sys/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/link.c')
-rw-r--r--sys/link.c47
1 files changed, 21 insertions, 26 deletions
diff --git a/sys/link.c b/sys/link.c
index cda10c6..2588c11 100644
--- a/sys/link.c
+++ b/sys/link.c
@@ -7,46 +7,41 @@
jove_perm_obj_t
-link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack)
+link_traverse(jove_owned_obj_t *link)
{
jove_perm_obj_t perm_obj = { .obj = link, .permissions = JOVE_PERM_ALL };
+
while(obj_gettype(perm_obj.obj) == JOVE_OBJ_LINK) {
jove_link_obj_t *link = obj_deref(perm_obj.obj);
perm_obj.permissions &= link_getperm(link);
- perm_obj.obj = lockstack_push(lockstack, link_deref(link));
+
+ jove_owned_obj_t *linked_obj = link_deref(link);
+ obj_release(perm_obj.obj);
+ perm_obj.obj = linked_obj;
}
return perm_obj;
}
jove_perm_obj_t
-link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack)
+link_traverse_objdir(
+ jove_obj_t *objdir,
+ size_t pathlen,
+ objpath_part_t *path)
{
- 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) {
- jove_link_obj_t *link = obj_deref(perm_obj.obj);
- perm_obj.permissions &= link_getperm(link);
- perm_obj.obj = lockstack_push(lockstack, link_deref(link));
- }
- return perm_obj;
-}
+ jove_owned_obj_t *objdir_obj = obj_take(objdir);
+ jove_perm_obj_t perm_obj = link_traverse(objdir_obj);
+ obj_release(objdir_obj);
-jove_perm_obj_t
-link_try_traverse_objdir(jove_owned_obj_t *objdir, lockstack_t *lockstack,
- size_t pathlen, objpath_part_t *path)
-{
- /*Do a traversal through the passed objdir to get objdir permissions.*/
- jove_perm_obj_t perm_obj = link_try_traverse(objdir, lockstack);
- if(perm_obj.obj == 0) return perm_obj;
if(pathlen == 0) return perm_obj;
-
- /*Get the object pointed to by the head of the path. */
- perm_obj.obj = lockstack_push(lockstack, objdir_trygetlocal(perm_obj.obj, path[0]));
- if(pathlen > 1) lockstack_pop(lockstack); /*Don't lock the directory we're traversing. */
-
- /*Recurse through the remaining path, resolving as we go. */
- jove_perm_obj_t traverse_obj = link_try_traverse_objdir(perm_obj.obj, lockstack, pathlen - 1, &path[1]);
- /*Mask permissions against the head object. */
+ jove_owned_obj_t *child_obj = objdir_getlocal(obj_release(perm_obj.obj), path[0]);
+ perm_obj.obj = child_obj;
+
+ jove_perm_obj_t traverse_obj = link_traverse_objdir(obj_release(child_obj), pathlen - 1, &path[1]);
+ if(traverse_obj.obj != child_obj) {
+ obj_release(perm_obj.obj);
+ }
traverse_obj.permissions &= perm_obj.permissions;
+
return traverse_obj;
}