return;
s = container_of(obj, struct ubus_subscriber, obj);
- s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET]));
+ if (s->remove_cb)
+ s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET]));
}
static void
struct ubus_request_data req = {};
int method;
int ret;
+ bool no_reply = false;
if (!obj) {
ret = UBUS_STATUS_NOT_FOUND;
goto send;
}
+ if (attrbuf[UBUS_ATTR_NO_REPLY])
+ no_reply = blob_get_int8(attrbuf[UBUS_ATTR_NO_REPLY]);
+
req.peer = hdr->peer;
req.seq = hdr->seq;
req.object = obj->id;
ret = obj->methods[method].handler(ctx, obj, &req,
blob_data(attrbuf[UBUS_ATTR_METHOD]),
attrbuf[UBUS_ATTR_DATA]);
- if (req.deferred)
+ if (req.deferred || no_reply)
return;
send:
struct ubus_object *obj;
uint32_t objid;
- attrbuf = ubus_parse_msg(hdr->data);
+ attrbuf = ubus_parse_msg(ubus_msghdr_data(hdr));
if (!attrbuf[UBUS_ATTR_OBJID])
return;