#include #define LINK_CAST(p) OBJECT_C_CAST(struct link, l_base, &link_type, p) struct link { struct object l_base; char l_name[OBJECT_NAME_MAX]; struct object *l_dest; }; static struct object_type link_type; static kern_status_t link_query_name(struct object *obj, char out[OBJECT_NAME_MAX]) { struct link *link = LINK_CAST(obj); strncpy(out, link->l_name, OBJECT_NAME_MAX - 1); out[OBJECT_NAME_MAX - 1] = 0; return KERN_OK; } static struct object_type link_type = { .ob_name = "link", .ob_size = sizeof(struct link), .ob_header_offset = offsetof(struct link, l_base), .ob_ops = { .query_name = link_query_name, }, }; void init_link_objects(void) { object_type_register(&link_type); } struct object *link_create(const char *name, struct object *dest) { struct object *link_obj = object_create(&link_type); if (!link_obj) { return NULL; } struct link *link = LINK_CAST(link_obj); strncpy(link->l_name, name, sizeof link->l_name - 1); link->l_name[sizeof link->l_name - 1] = 0; link->l_dest = object_ref(dest); return link_obj; } struct object *link_read_ptr(struct object *link_obj) { struct link *link = LINK_CAST(link_obj); return link->l_dest; } bool object_is_link(struct object *obj) { return obj->ob_type == &link_type; }