obj: object header is no longer allocated automatically

This commit is contained in:
2023-05-06 19:48:14 +01:00
parent 79c30e5393
commit f52ca2f1e2
13 changed files with 97 additions and 66 deletions

View File

@@ -1,22 +1,27 @@
#include <socks/object.h>
#define SET_CAST(p) OBJECT_C_CAST(struct set, s_base, &set_type, p)
struct set {
struct object s_base;
struct queue s_list;
char s_name[OBJECT_NAME_MAX];
};
static struct object_type set_type;
static kern_status_t set_query_name(struct object *obj, char out[OBJECT_NAME_MAX])
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
strncpy(out, set->s_name, OBJECT_NAME_MAX - 1);
out[OBJECT_NAME_MAX - 1] = 0;
return KERN_OK;
}
static kern_status_t set_get_child_at(struct object *obj, size_t at, struct object **out)
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
size_t i = 0;
queue_foreach(struct object, child, &set->s_list, ob_list) {
if (i == at) {
@@ -26,15 +31,15 @@ static kern_status_t set_get_child_at(struct object *obj, size_t at, struct obje
i++;
}
return KERN_NO_ENTRY;
}
static kern_status_t set_get_child_named(struct object *obj, const char *name, struct object **out)
{
struct set *set = object_data(obj);
struct set *set = SET_CAST(obj);
char child_name[OBJECT_NAME_MAX];
queue_foreach(struct object, child, &set->s_list, ob_list) {
kern_status_t status = object_query_name(child, child_name);
if (status != KERN_OK) {
@@ -46,7 +51,7 @@ static kern_status_t set_get_child_named(struct object *obj, const char *name, s
return KERN_OK;
}
}
return KERN_NO_ENTRY;
}
@@ -72,7 +77,7 @@ struct object *set_create(const char *name)
return NULL;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
set->s_list = QUEUE_INIT;
strncpy(set->s_name, name, sizeof set->s_name - 1);
set->s_name[sizeof set->s_name - 1] = 0;
@@ -85,12 +90,12 @@ kern_status_t set_add_object(struct object *set_obj, struct object *obj)
if (!object_is_set(set_obj)) {
return KERN_INVALID_ARGUMENT;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
char child_name[OBJECT_NAME_MAX];
char obj_name[OBJECT_NAME_MAX];
kern_status_t status = object_query_name(obj, obj_name);
if (status != KERN_OK) {
return status;
@@ -114,8 +119,8 @@ kern_status_t set_remove_object(struct object *set_obj, struct object *obj)
if (!object_is_set(set_obj)) {
return KERN_INVALID_ARGUMENT;
}
struct set *set = object_data(set_obj);
struct set *set = SET_CAST(set_obj);
queue_delete(&set->s_list, &obj->ob_list);
object_deref(obj);