libubus: add monitor support
authorFelix Fietkau <nbd@openwrt.org>
Thu, 19 Nov 2015 21:32:25 +0000 (22:32 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Thu, 19 Nov 2015 21:32:25 +0000 (22:32 +0100)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
libubus-req.c
libubus.c
libubus.h

index 2197f2a9fdd997183a3f641653be5e071d5af478..bf19f3670ea5b215190dfcce125c358f616c72a4 100644 (file)
@@ -466,3 +466,9 @@ void __hidden ubus_process_req_msg(struct ubus_context *ctx, struct ubus_msghdr_
                break;
        }
 }
+
+int __ubus_monitor(struct ubus_context *ctx, const char *type)
+{
+       blob_buf_init(&b, 0);
+       return ubus_invoke(ctx, UBUS_SYSTEM_OBJECT_MONITOR, type, b.head, NULL, NULL, 1000);
+}
index e1e68d0218d1c32807fa5daf30e698e3bf00e916..bfbaeb6565905f2614e202fc8c25d265fd1ca52c 100644 (file)
--- a/libubus.c
+++ b/libubus.c
@@ -105,6 +105,10 @@ ubus_process_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf, int fd)
 
                ubus_process_obj_msg(ctx, buf);
                break;
+       case UBUS_MSG_MONITOR:
+               if (ctx->monitor_cb)
+                       ctx->monitor_cb(ctx, buf->hdr.seq, buf->data);
+               break;
        }
 }
 
index 5c5f8de3cf012b6879fcad37af63880ab1c25922..54e7d481b0496e719f2f567b664a2619c82a3b16 100644 (file)
--- a/libubus.h
+++ b/libubus.h
@@ -158,6 +158,7 @@ struct ubus_context {
        int stack_depth;
 
        void (*connection_lost)(struct ubus_context *ctx);
+       void (*monitor_cb)(struct ubus_context *ctx, uint32_t seq, struct blob_attr *data);
 
        struct ubus_msghdr_buf msgbuf;
        uint32_t msgbuf_data_len;
@@ -290,6 +291,18 @@ ubus_unregister_subscriber(struct ubus_context *ctx, struct ubus_subscriber *obj
 int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
 int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id);
 
+int __ubus_monitor(struct ubus_context *ctx, const char *type);
+
+static inline int ubus_monitor_start(struct ubus_context *ctx)
+{
+       return __ubus_monitor(ctx, "add");
+}
+
+static inline int ubus_monitor_stop(struct ubus_context *ctx)
+{
+       return __ubus_monitor(ctx, "remove");
+}
+
 
 /* ----------- acl ----------- */