|
@@ -49,10 +49,9 @@ static void __ubus_process_req_data(struct ubus_request *req)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-int __hidden ubus_start_request(struct ubus_context *ctx, struct ubus_request *req,
|
|
|
+int __hidden __ubus_start_request(struct ubus_context *ctx, struct ubus_request *req,
|
|
|
struct blob_attr *msg, int cmd, uint32_t peer)
|
|
|
{
|
|
|
- memset(req, 0, sizeof(*req));
|
|
|
|
|
|
if (msg && blob_pad_len(msg) > UBUS_MAX_MSGLEN)
|
|
|
return -1;
|
|
@@ -62,9 +61,21 @@ int __hidden ubus_start_request(struct ubus_context *ctx, struct ubus_request *r
|
|
|
req->ctx = ctx;
|
|
|
req->peer = peer;
|
|
|
req->seq = ++ctx->request_seq;
|
|
|
- return ubus_send_msg(ctx, req->seq, msg, cmd, peer, -1);
|
|
|
+
|
|
|
+ return ubus_send_msg(ctx, req->seq, msg, cmd, peer, req->fd);
|
|
|
}
|
|
|
|
|
|
+int __hidden ubus_start_request(struct ubus_context *ctx, struct ubus_request *req,
|
|
|
+ struct blob_attr *msg, int cmd, uint32_t peer)
|
|
|
+{
|
|
|
+ memset(req, 0, sizeof(*req));
|
|
|
+
|
|
|
+ req->fd = -1;
|
|
|
+
|
|
|
+ return __ubus_start_request(ctx, req, msg, cmd, peer);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void ubus_abort_request(struct ubus_context *ctx, struct ubus_request *req)
|
|
|
{
|
|
|
if (list_empty(&req->list))
|
|
@@ -224,6 +235,23 @@ int ubus_invoke_async(struct ubus_context *ctx, uint32_t obj, const char *method
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+int ubus_invoke_async_fd(struct ubus_context *ctx, uint32_t obj, const char *method,
|
|
|
+ struct blob_attr *msg, struct ubus_request *req, int fd)
|
|
|
+{
|
|
|
+ blob_buf_init(&b, 0);
|
|
|
+ blob_put_int32(&b, UBUS_ATTR_OBJID, obj);
|
|
|
+ blob_put_string(&b, UBUS_ATTR_METHOD, method);
|
|
|
+ if (msg)
|
|
|
+ blob_put(&b, UBUS_ATTR_DATA, blob_data(msg), blob_len(msg));
|
|
|
+
|
|
|
+ memset(req, 0, sizeof(*req));
|
|
|
+ req->fd = fd;
|
|
|
+ if (__ubus_start_request(ctx, req, b.head, UBUS_MSG_INVOKE, obj) < 0)
|
|
|
+ return UBUS_STATUS_INVALID_ARGUMENT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method,
|
|
|
struct blob_attr *msg, ubus_data_handler_t cb, void *priv,
|
|
|
int timeout)
|
|
@@ -240,6 +268,22 @@ int ubus_invoke(struct ubus_context *ctx, uint32_t obj, const char *method,
|
|
|
return ubus_complete_request(ctx, &req, timeout);
|
|
|
}
|
|
|
|
|
|
+int ubus_invoke_fd(struct ubus_context *ctx, uint32_t obj, const char *method,
|
|
|
+ struct blob_attr *msg, ubus_data_handler_t cb, void *priv,
|
|
|
+ int timeout, int fd)
|
|
|
+{
|
|
|
+ struct ubus_request req;
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = ubus_invoke_async_fd(ctx, obj, method, msg, &req, fd);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ req.data_cb = cb;
|
|
|
+ req.priv = priv;
|
|
|
+ return ubus_complete_request(ctx, &req, timeout);
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
ubus_notify_complete_cb(struct ubus_request *req, int ret)
|
|
|
{
|