X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=libubus-sub.c;h=8793133ad05ec54802be86860e032aa10186a99c;hp=87c81281abadcf9f47961b9289d392b752235ab2;hb=e59b44573423ad608d0752b46a6073222db9ed45;hpb=a69f062cbd4041229f8d29ef9647bf783df414c1 diff --git a/libubus-sub.c b/libubus-sub.c index 87c8128..8793133 100644 --- a/libubus-sub.c +++ b/libubus-sub.c @@ -21,11 +21,12 @@ static int ubus_subscriber_cb(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_subscriber *s; s = container_of(obj, struct ubus_subscriber, obj); - s->cb(ctx, obj, req, method, msg); + if (s->cb) + return s->cb(ctx, obj, req, method, msg); return 0; } -static const struct ubus_method watch_method = { +const struct ubus_method watch_method __hidden = { .name = NULL, .handler = ubus_subscriber_cb, }; @@ -41,15 +42,13 @@ int ubus_register_subscriber(struct ubus_context *ctx, struct ubus_subscriber *s } static int -__ubus_subscribe_request(struct ubus_context *ctx, struct ubus_object *obj, uint32_t id, const char *method, int type) +__ubus_subscribe_request(struct ubus_context *ctx, struct ubus_object *obj, uint32_t id, int type) { struct ubus_request req; blob_buf_init(&b, 0); blob_put_int32(&b, UBUS_ATTR_OBJID, obj->id); blob_put_int32(&b, UBUS_ATTR_TARGET, id); - if (method) - blob_put_string(&b, UBUS_ATTR_METHOD, method); if (ubus_start_request(ctx, &req, b.head, type, 0) < 0) return UBUS_STATUS_INVALID_ARGUMENT; @@ -60,53 +59,11 @@ __ubus_subscribe_request(struct ubus_context *ctx, struct ubus_object *obj, uint int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id) { - return __ubus_subscribe_request(ctx, &obj->obj, id, "event", UBUS_MSG_SUBSCRIBE); + return __ubus_subscribe_request(ctx, &obj->obj, id, UBUS_MSG_SUBSCRIBE); } int ubus_unsubscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id) { - return __ubus_subscribe_request(ctx, &obj->obj, id, NULL, UBUS_MSG_UNSUBSCRIBE); + return __ubus_subscribe_request(ctx, &obj->obj, id, UBUS_MSG_UNSUBSCRIBE); } -void __hidden ubus_process_unsubscribe(struct ubus_context *ctx, struct ubus_msghdr *hdr) -{ - struct ubus_subscriber *s; - struct blob_attr **attrbuf; - struct ubus_object *obj; - uint32_t objid; - - attrbuf = ubus_parse_msg(hdr->data); - if (!attrbuf[UBUS_ATTR_OBJID] || !attrbuf[UBUS_ATTR_TARGET]) - return; - - objid = blob_get_u32(attrbuf[UBUS_ATTR_OBJID]); - obj = avl_find_element(&ctx->objects, &objid, obj, avl); - if (!obj) - return; - - if (obj->methods != &watch_method) - return; - - s = container_of(obj, struct ubus_subscriber, obj); - s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET])); -} - -void __hidden ubus_process_notify(struct ubus_context *ctx, struct ubus_msghdr *hdr) -{ - struct blob_attr **attrbuf; - struct ubus_object *obj; - uint32_t objid; - - attrbuf = ubus_parse_msg(hdr->data); - if (!attrbuf[UBUS_ATTR_OBJID] || !attrbuf[UBUS_ATTR_ACTIVE]) - return; - - objid = blob_get_u32(attrbuf[UBUS_ATTR_OBJID]); - obj = avl_find_element(&ctx->objects, &objid, obj, avl); - if (!obj) - return; - - obj->has_subscribers = blob_get_u8(attrbuf[UBUS_ATTR_ACTIVE]); - if (obj->subscribe_cb) - obj->subscribe_cb(ctx, obj); -}