2024-11-02 11:31:51 +00:00
|
|
|
#include <mango/object.h>
|
2023-06-02 19:34:33 +01:00
|
|
|
|
|
|
|
|
#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;
|
|
|
|
|
}
|