X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=libubus.h;h=a63ce31a7ca0d3b4a13473f4cce3a6702c884e32;hb=5db90dbc941da701c397b04ddce2515a231df59b;hp=60d9bb6cac67849b8a03698dacf53e66afc49122;hpb=47a9ab0c645d4d49def8080ae68c7c477e733530;p=project%2Fubus.git diff --git a/libubus.h b/libubus.h index 60d9bb6..a63ce31 100644 --- a/libubus.h +++ b/libubus.h @@ -34,10 +34,16 @@ struct ubus_event_handler; struct ubus_subscriber; struct ubus_notify_request; +struct ubus_msghdr_buf { + struct ubus_msghdr hdr; + struct blob_attr *data; +}; + static inline struct blob_attr * ubus_msghdr_data(struct ubus_msghdr *hdr) { - return (struct blob_attr *) (hdr + 1); + struct ubus_msghdr_buf *hdrbuf = container_of(hdr, typeof(*hdrbuf), hdr); + return hdrbuf->data; } typedef void (*ubus_lookup_handler_t)(struct ubus_context *ctx, @@ -67,24 +73,32 @@ typedef void (*ubus_connect_handler_t)(struct ubus_context *ctx); .methods = _methods \ } +#define __UBUS_METHOD_NOARG(_name, _handler) \ + .name = _name, \ + .handler = _handler + +#define __UBUS_METHOD(_name, _handler, _policy) \ + __UBUS_METHOD_NOARG(_name, _handler), \ + .policy = _policy, \ + .n_policy = ARRAY_SIZE(_policy) + #define UBUS_METHOD(_name, _handler, _policy) \ + { __UBUS_METHOD(_name, _handler, _policy) } + +#define UBUS_METHOD_MASK(_name, _handler, _policy, _mask) \ { \ - .name = _name, \ - .handler = _handler, \ - .policy = _policy, \ - .n_policy = ARRAY_SIZE(_policy) \ + __UBUS_METHOD(_name, _handler, _policy),\ + .mask = _mask \ } #define UBUS_METHOD_NOARG(_name, _handler) \ - { \ - .name = _name, \ - .handler = _handler, \ - } + { __UBUS_METHOD_NOARG(_name, _handler) } struct ubus_method { const char *name; ubus_handler_t handler; + unsigned long mask; const struct blobmsg_policy *policy; int n_policy; }; @@ -132,6 +146,7 @@ struct ubus_context { struct list_head pending; struct uloop_fd sock; + struct uloop_timeout pending_timer; uint32_t local_id; uint16_t request_seq; @@ -139,10 +154,9 @@ struct ubus_context { void (*connection_lost)(struct ubus_context *ctx); - struct { - struct ubus_msghdr hdr; - char data[UBUS_MAX_MSGLEN]; - } msgbuf; + struct ubus_msghdr_buf msgbuf; + uint32_t msgbuf_data_len; + int msgbuf_reduction_counter; }; struct ubus_object_data {