libubus: fix reconnect with auto subscribe

Look up all objects after reconnect and re-subscribe

Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
Felix Fietkau 2023-11-28 13:14:45 +01:00
parent b3e8c4ef07
commit 2b39a27d8b

View file

@ -344,6 +344,29 @@ void __hidden ubus_poll_data(struct ubus_context *ctx, int timeout)
ubus_handle_data(&ctx->sock, ULOOP_READ);
}
static void
ubus_auto_sub_lookup(struct ubus_context *ctx, struct ubus_object_data *obj,
void *priv)
{
struct ubus_subscriber *s;
list_for_each_entry(s, &ctx->auto_subscribers, list)
if (s->new_obj_cb(ctx, s, obj->path))
ubus_subscribe(ctx, s, obj->id);
}
static void
ubus_refresh_auto_subscribe(struct ubus_context *ctx)
{
struct ubus_event_handler *ev = &ctx->auto_subscribe_event_handler;
if (list_empty(&ctx->auto_subscribers))
return;
ubus_register_event_handler(ctx, ev, "ubus.object.add");
ubus_lookup(ctx, NULL, ubus_auto_sub_lookup, NULL);
}
static void
ubus_refresh_state(struct ubus_context *ctx)
{
@ -365,6 +388,8 @@ ubus_refresh_state(struct ubus_context *ctx)
for (n = i, i = 0; i < n; i++)
ubus_add_object(ctx, objs[i]);
ubus_refresh_auto_subscribe(ctx);
}
int ubus_reconnect(struct ubus_context *ctx, const char *path)