#include "sys/lockstack.h" #ifndef _JOVE_SYS_LINK_HPP #define _JOVE_SYS_LINK_HPP 1 #include "hal/obj.h" #ifdef __x86_64__ #include "arch/x86_64/sys/link.h" #endif typedef struct obj_perm_group { jove_owned_obj_t *obj; uint8_t permissions; } jove_perm_obj_t; uint8_t link_getperm(jove_link_obj_t *link); void link_setperm(jove_link_obj_t *link, uint8_t perm); void link_lock(jove_link_obj_t *link); void link_unlock(jove_link_obj_t *link); jove_owned_obj_t *link_deref(jove_link_obj_t *link); jove_owned_obj_t *link_try_deref(jove_link_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); int link_new(jove_owned_obj_t *target_obj, jove_owned_obj_t *untyped_obj, uint8_t permissions); int link_dup(jove_owned_obj_t *link_obj, jove_owned_obj_t *dest_obj); #endif