X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=libubus-sub.c;h=8793133ad05ec54802be86860e032aa10186a99c;hp=2bfb483cfd8019dd22b12fc3d9144914fd1dbea8;hb=af63ab64af10798468ca1453de2360fcda44aab9;hpb=d366a6de839087d8a17e5855c14ae55e95b13c65 diff --git a/libubus-sub.c b/libubus-sub.c index 2bfb483..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,35 +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])); -} - -