obj: implement link objects
This commit is contained in:
62
obj/link.c
Normal file
62
obj/link.c
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user