60 AMXB_UNUSED
struct ubus_object* obj,
61 AMXB_UNUSED
struct ubus_request_data* req,
63 struct blob_attr* msg) {
64 int status = UBUS_STATUS_UNKNOWN_ERROR;
65 struct ubus_subscriber* s = NULL;
68 amxc_htable_t* subscribers = NULL;
69 amxc_var_t notification;
70 const char* subscriber_object = NULL;
72 amxc_var_init(¬ification);
73 amxc_var_set_type(¬ification, AMXC_VAR_ID_HTABLE);
75 s = container_of(obj,
struct ubus_subscriber, obj);
77 subscribers = container_of(amxb_ubus_sub->
it.ait->array, amxc_htable_t, table);
78 amxb_ubus_ctx = container_of(subscribers,
amxb_ubus_t, subscribers);
80 subscriber_object = amxc_htable_it_get_key(&amxb_ubus_sub->
it);
81 when_true(amxb_ubus_ctx->
ubus_ctx != ctx, exit);
84 amxc_var_add_key(cstring_t, ¬ification,
"notification", method);
86 amxp_sigmngr_emit_signal(amxb_ubus_ctx->
sigmngr, subscriber_object, ¬ification);
88 status = UBUS_STATUS_OK;
91 amxc_var_clean(¬ification);
98 amxc_htable_it_t* it = NULL;
100 amxc_string_t rel_path;
105 amxc_string_init(&rel_path, 64);
106 amxd_path_init(&path, NULL);
107 amxd_path_setf(&path,
true,
"%s",
object);
111 ret = ubus_lookup_id(amxb_ubus_ctx->
ubus_ctx, amxd_path_get(&path, 0), &
id);
112 when_true(ret != 0, exit);
114 it = amxc_htable_get(&amxb_ubus_ctx->
subscribers, amxd_path_get(&path, 0));
115 when_not_null(it, exit);
122 ret = ubus_register_subscriber(amxb_ubus_ctx->
ubus_ctx,
123 &amxb_ubus_sub->
sub);
124 when_true(ret != 0, exit);
127 ret = ubus_subscribe(amxb_ubus_ctx->
ubus_ctx, &amxb_ubus_sub->
sub,
id);
130 amxc_string_clean(&rel_path);
131 amxd_path_clean(&path);
136 const char*
object) {
139 amxc_htable_it_t* it = NULL;
140 amxc_string_t rel_path;
145 amxc_string_init(&rel_path, 64);
146 amxd_path_init(&path, NULL);
147 amxd_path_setf(&path,
true,
"%s",
object);
151 it = amxc_htable_get(&amxb_ubus_ctx->
subscribers,
object);
152 when_null(it, leave);
155 ret = ubus_lookup_id(amxb_ubus_ctx->
ubus_ctx, amxd_path_get(&path, 0), &
id);
156 when_true(ret != 0, exit);
158 ubus_unsubscribe(amxb_ubus_ctx->
ubus_ctx, &amxb_ubus_sub->
sub,
id);
161 ret = ubus_unregister_subscriber(amxb_ubus_ctx->
ubus_ctx, &amxb_ubus_sub->
sub);
163 amxc_htable_it_clean(it, NULL);
164 amxp_timer_delete(&amxb_ubus_sub->
reactivate);
168 amxc_string_clean(&rel_path);
169 amxd_path_clean(&path);
int PRIVATE amxb_ubus_parse_blob_table(amxc_var_t *var, struct blob_attr *attr, int len)
int PRIVATE amxb_ubus_get_longest_path(amxb_ubus_t *amxb_ubus_ctx, amxd_path_t *path, amxc_string_t *rel_path)
static int amxb_ubus_receive_notification(struct ubus_context *ctx, AMXB_UNUSED struct ubus_object *obj, AMXB_UNUSED struct ubus_request_data *req, const char *method, struct blob_attr *msg)
int PRIVATE amxb_ubus_unsubscribe(void *const ctx, const char *object)
int PRIVATE amxb_ubus_subscribe(void *const ctx, const char *object)
amxp_timer_t * reactivate
struct ubus_subscriber sub
amxc_htable_t subscribers
struct ubus_context * ubus_ctx
amxp_signal_mngr_t * sigmngr