add copyright/license information
[project/ubus.git] / ubusd_obj.c
index a6be182..1991b17 100644 (file)
@@ -1,3 +1,16 @@
+/*
+ * 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"
 
@@ -31,7 +44,7 @@ static bool ubus_create_obj_method(struct ubus_object_type *type, struct blob_at
        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);
 
@@ -98,6 +111,7 @@ struct ubus_object *ubusd_create_object_internal(struct ubus_object_type *type,
 
        obj->type = type;
        INIT_LIST_HEAD(&obj->list);
+       INIT_LIST_HEAD(&obj->events);
        if (type)
                type->refcount++;
 
@@ -114,15 +128,16 @@ struct ubus_object *ubusd_create_object(struct ubus_client *cl, struct blob_attr
        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)
+       if (!!type ^ !!attr[UBUS_ATTR_OBJPATH])
                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;
@@ -133,14 +148,16 @@ struct ubus_object *ubusd_create_object(struct ubus_client *cl, struct blob_attr
                        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:
@@ -150,9 +167,11 @@ 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);