do not reverse method sorting order
[project/ubus.git] / ubusd_obj.c
index 15f43ad..3dd2d7f 100644 (file)
@@ -31,7 +31,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 +98,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,7 +115,7 @@ 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]);
 
@@ -138,11 +139,11 @@ struct ubus_object *ubusd_create_object(struct ubus_client *cl, struct blob_attr
                        obj->path.key = NULL;
                        goto free;
                }
+               ubusd_send_obj_event(obj, true);
        }
 
        obj->client = cl;
        list_add(&obj->list, &cl->objects);
-       INIT_LIST_HEAD(&obj->events);
 
        return obj;
 
@@ -155,6 +156,7 @@ 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);
        }