Browse Source

libubus: fix reconnect with auto subscribe

Look up all objects after reconnect and re-subscribe

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Felix Fietkau 5 months ago
parent
commit
2b39a27d8b
1 changed files with 25 additions and 0 deletions
  1. 25 0
      libubus-io.c

+ 25 - 0
libubus-io.c

@@ -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)