summaryrefslogtreecommitdiff
path: root/libubus-obj.c
diff options
context:
space:
mode:
authoramine ahd <amine.ahd@gmail.com>2016-12-19 10:30:36 +0100
committerFelix Fietkau <nbd@nbd.name>2016-12-24 14:31:04 +0100
commitdf088f03c02aebba304a371486f09e95ed34bf5f (patch)
tree63e86f91a703ace2ff688c6c1c1015e69a408a8c /libubus-obj.c
parent5ca6bae3a27ca02e304339ed0d94a8baa461b609 (diff)
downloadubus-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.c24
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)