int rem;
type = calloc(1, sizeof(*type));
+ if (!type)
+ return NULL;
+
type->refcount = 1;
if (!ubus_alloc_id(&obj_types, &type->id, 0))
return NULL;
if (attr[UBUS_ATTR_OBJPATH]) {
+ if (ubusd_acl_check(cl, blob_data(attr[UBUS_ATTR_OBJPATH]), NULL, UBUS_ACL_PUBLISH))
+ goto free;
+
obj->path.key = strdup(blob_data(attr[UBUS_ATTR_OBJPATH]));
if (!obj->path.key)
goto free;
return NULL;
}
-void ubus_subscribe(struct ubus_object *obj, struct ubus_object *target, const char *method)
+void ubus_subscribe(struct ubus_object *obj, struct ubus_object *target)
{
struct ubus_subscription *s;
+ bool first = list_empty(&target->subscribers);
- s = calloc(1, sizeof(*s) + strlen(method) + 1);
+ s = calloc(1, sizeof(*s));
if (!s)
return;
s->target = target;
list_add(&s->list, &target->subscribers);
list_add(&s->target_list, &obj->target_list);
- strcpy(s->method, method);
+
+ if (first)
+ ubus_notify_subscription(target);
}
void ubus_unsubscribe(struct ubus_subscription *s)
{
+ struct ubus_object *obj = s->target;
+
list_del(&s->list);
list_del(&s->target_list);
free(s);
+
+ if (list_empty(&obj->subscribers))
+ ubus_notify_subscription(obj);
}
void ubusd_free_object(struct ubus_object *obj)
free(obj);
}
-static void __init ubusd_obj_init(void)
+static void __constructor ubusd_obj_init(void)
{
ubus_init_id_tree(&objects);
ubus_init_id_tree(&obj_types);
ubus_init_string_tree(&path, false);
ubusd_event_init();
+ ubusd_acl_init();
+ ubusd_monitor_init();
}