#include "sys/lockstack.h" #ifndef _JOVE_SYS_LINK_HPP #define _JOVE_SYS_LINK_HPP 1 #include "hal/obj.h" struct obj_link { jove_obj_t obj; uint16_t refcount; uint8_t permissions; }; typedef struct obj_perm_group { jove_owned_obj_t *obj; uint8_t permissions; } jove_perm_obj_t; uint8_t link_gettype(jove_owned_obj_t *obj); uint8_t link_getperm(jove_owned_obj_t *link); uint64_t link_getvalue(jove_owned_obj_t *obj); jove_owned_obj_t *link_deref(jove_owned_obj_t *link); jove_owned_obj_t *link_try_deref(jove_owned_obj_t *link); jove_perm_obj_t link_traverse(jove_owned_obj_t *link, lockstack_t *lockstack); jove_perm_obj_t link_try_traverse(jove_owned_obj_t *link, lockstack_t *lockstack); /**Try to retrieve an object from the object directory, resolving each link as it's encountered. * Permissions are preserved through traversal, meaning objects are limited by their * objdir permissions.*/ jove_perm_obj_t link_try_traverse_objdir(jove_owned_obj_t *objdir, lockstack_t *lockstack, size_t pathlen, objpath_part_t *path); jove_obj_t link_unlink(jove_owned_obj_t *link); jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst, uint16_t permissions); #endif