lib: fix dealing with udebugd restarts
authorFelix Fietkau <nbd@nbd.name>
Tue, 28 Nov 2023 12:23:38 +0000 (13:23 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 28 Nov 2023 12:24:00 +0000 (13:24 +0100)
When re-subscribing, also re-request the configuration in order to
avoid using stale data

Signed-off-by: Felix Fietkau <nbd@nbd.name>
lib.c
udebug.h

diff --git a/lib.c b/lib.c
index 5d956680e1fdd3add5399158a5466417d188a6b7..f3e62f9050fdf3231afef0e16cace7df0433c5b2 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -52,14 +52,29 @@ static bool
 udebug_ubus_new_obj_cb(struct ubus_context *ubus, struct ubus_subscriber *sub,
                       const char *path)
 {
-       return !strcmp(path, "udebug");
+       struct udebug_ubus *ctx = container_of(sub, struct udebug_ubus, sub);
+
+       if (strcmp(path, "udebug") != 0)
+               return false;
+
+       uloop_timeout_set(&ctx->t, 1);
+       return true;
 }
 
-void udebug_ubus_init(struct udebug_ubus *ctx, struct ubus_context *ubus,
-                     const char *service, udebug_config_cb cb)
+static void udebug_ubus_get_config(struct uloop_timeout *t)
 {
+       struct udebug_ubus *ctx = container_of(t, struct udebug_ubus, t);
        uint32_t id;
 
+       if (ubus_lookup_id(ctx->ubus, "udebug", &id))
+               return;
+
+       ubus_invoke(ctx->ubus, id, "get_config", NULL, udebug_ubus_req_cb, ctx, 1000);
+}
+
+void udebug_ubus_init(struct udebug_ubus *ctx, struct ubus_context *ubus,
+                     const char *service, udebug_config_cb cb)
+{
        ctx->ubus = ubus;
        ctx->service = service;
        ctx->cb = cb;
@@ -67,11 +82,7 @@ void udebug_ubus_init(struct udebug_ubus *ctx, struct ubus_context *ubus,
        ctx->sub.cb = udebug_ubus_notify_cb;
        ubus_register_subscriber(ubus, &ctx->sub);
 
-       if (ubus_lookup_id(ubus, "udebug", &id))
-               return;
-
-       ubus_subscribe(ubus, &ctx->sub, id);
-       ubus_invoke(ubus, id, "get_config", NULL, udebug_ubus_req_cb, ctx, 1000);
+       ctx->t.cb = udebug_ubus_get_config;
 }
 
 void udebug_ubus_free(struct udebug_ubus *ctx)
@@ -79,5 +90,6 @@ void udebug_ubus_free(struct udebug_ubus *ctx)
        if (!ctx->ubus)
                return;
 
+       uloop_timeout_cancel(&ctx->t);
        ubus_unregister_subscriber(ctx->ubus, &ctx->sub);
 }
index 200a03816e1ccecf2256a321bb5ec4fc3f690c10..0d7ea30508d32fc3af746049485426e01d2c4d0d 100644 (file)
--- a/udebug.h
+++ b/udebug.h
@@ -6,6 +6,7 @@ typedef void (*udebug_config_cb)(struct udebug_ubus *ctx, struct blob_attr *data
 
 struct udebug_ubus {
        struct ubus_context *ubus;
+       struct uloop_timeout t;
        const char *service;
        struct ubus_subscriber sub;
        udebug_config_cb cb;