diff options
author | amine ahd <amine.ahd@gmail.com> | 2016-12-19 10:30:36 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@nbd.name> | 2016-12-24 14:31:04 +0100 |
commit | df088f03c02aebba304a371486f09e95ed34bf5f (patch) | |
tree | 63e86f91a703ace2ff688c6c1c1015e69a408a8c /libubus-obj.c | |
parent | 5ca6bae3a27ca02e304339ed0d94a8baa461b609 (diff) | |
download | ubus-df088f03c02aebba304a371486f09e95ed34bf5f.tar.gz |
Allow sending a fd along a ubus_request
Signed-off-by: amine.ahd <amine.ahd@gmail.com>
Diffstat (limited to 'libubus-obj.c')
-rw-r--r-- | libubus-obj.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/libubus-obj.c b/libubus-obj.c index 990d04b..a9972c5 100644 --- a/libubus-obj.c +++ b/libubus-obj.c @@ -11,12 +11,13 @@ * GNU General Public License for more details. */ +#include <unistd.h> #include "libubus.h" #include "libubus-internal.h" static void ubus_process_unsubscribe(struct ubus_context *ctx, struct ubus_msghdr *hdr, - struct ubus_object *obj, struct blob_attr **attrbuf) + struct ubus_object *obj, struct blob_attr **attrbuf, int fd) { struct ubus_subscriber *s; @@ -29,11 +30,13 @@ ubus_process_unsubscribe(struct ubus_context *ctx, struct ubus_msghdr *hdr, s = container_of(obj, struct ubus_subscriber, obj); if (s->remove_cb) s->remove_cb(ctx, s, blob_get_u32(attrbuf[UBUS_ATTR_TARGET])); + + close(fd); } static void ubus_process_notify(struct ubus_context *ctx, struct ubus_msghdr *hdr, - struct ubus_object *obj, struct blob_attr **attrbuf) + struct ubus_object *obj, struct blob_attr **attrbuf, int fd) { if (!obj || !attrbuf[UBUS_ATTR_ACTIVE]) return; @@ -41,14 +44,18 @@ ubus_process_notify(struct ubus_context *ctx, struct ubus_msghdr *hdr, obj->has_subscribers = blob_get_u8(attrbuf[UBUS_ATTR_ACTIVE]); if (obj->subscribe_cb) obj->subscribe_cb(ctx, obj); + + close(fd); } static void ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr, - struct ubus_object *obj, struct blob_attr **attrbuf) + struct ubus_object *obj, struct blob_attr **attrbuf, int fd) { struct ubus_request_data req = { .fd = -1, + .req_fd = fd, }; + int method; int ret; bool no_reply = false; @@ -65,7 +72,7 @@ ubus_process_invoke(struct ubus_context *ctx, struct ubus_msghdr *hdr, 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; @@ -88,6 +95,7 @@ found: ret = obj->methods[method].handler(ctx, obj, &req, blob_data(attrbuf[UBUS_ATTR_METHOD]), attrbuf[UBUS_ATTR_DATA]); + close(req.req_fd); if (req.deferred || no_reply) return; @@ -95,16 +103,16 @@ send: ubus_complete_deferred_request(ctx, &req, ret); } -void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf) + +void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf, int fd) { void (*cb)(struct ubus_context *, struct ubus_msghdr *, - struct ubus_object *, struct blob_attr **); + struct ubus_object *, struct blob_attr **, int fd); struct ubus_msghdr *hdr = &buf->hdr; struct blob_attr **attrbuf; struct ubus_object *obj; uint32_t objid; void *prev_data = NULL; - attrbuf = ubus_parse_msg(buf->data); if (!attrbuf[UBUS_ATTR_OBJID]) return; @@ -131,7 +139,7 @@ void __hidden ubus_process_obj_msg(struct ubus_context *ctx, struct ubus_msghdr_ buf->data = NULL; } - cb(ctx, hdr, obj, attrbuf); + cb(ctx, hdr, obj, attrbuf, fd); if (prev_data) { if (buf->data) |