+/*
+ * Copyright (C) 2011 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
#include "ubusd.h"
#include "ubusd_obj.h"
if (!m)
return false;
- list_add(&m->list, &type->methods);
+ list_add_tail(&m->list, &type->methods);
memcpy(m->data, attr, bloblen);
m->name = blobmsg_name(m->data);
obj->type = type;
INIT_LIST_HEAD(&obj->list);
+ INIT_LIST_HEAD(&obj->events);
if (type)
type->refcount++;
struct ubus_object_type *type = NULL;
if (attr[UBUS_ATTR_OBJTYPE])
- type = ubus_get_obj_type(blob_get_int32(attr[UBUS_ATTR_OBJTYPE]));
+ type = ubus_get_obj_type(blob_get_u32(attr[UBUS_ATTR_OBJTYPE]));
else if (attr[UBUS_ATTR_SIGNATURE])
type = ubus_create_obj_type(attr[UBUS_ATTR_SIGNATURE]);
- if (!type)
- return NULL;
-
obj = ubusd_create_object_internal(type, 0);
- ubus_unref_object_type(type);
+ if (type)
+ ubus_unref_object_type(type);
if (!obj)
return NULL;
goto free;
if (avl_insert(&path, &obj->path) != 0) {
- free(obj->path.key);
+ free((void *) obj->path.key);
obj->path.key = NULL;
goto free;
}
+ ubusd_send_obj_event(obj, true);
}
obj->client = cl;
list_add(&obj->list, &cl->objects);
+
return obj;
free:
void ubusd_free_object(struct ubus_object *obj)
{
+ ubusd_event_cleanup_object(obj);
if (obj->path.key) {
+ ubusd_send_obj_event(obj, false);
avl_delete(&path, &obj->path);
- free(obj->path.key);
+ free((void *) obj->path.key);
}
if (!list_empty(&obj->list))
list_del(&obj->list);