obj: implement link objects

This commit is contained in:
2023-06-02 19:34:33 +01:00
parent 648c370679
commit 577abf3bba
4 changed files with 210 additions and 12 deletions

62
obj/link.c Normal file
View File

@@ -0,0 +1,62 @@
#include <socks/object.h>
#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;
}