-void ubus_abort_request(struct ubus_context *ctx, struct ubus_request *req)
-{
- if (!list_empty(&req->list))
- return;
-
- req->cancelled = true;
- ubus_process_req_data(req);
- list_del_init(&req->list);
-}
-
-void ubus_complete_request_async(struct ubus_context *ctx, struct ubus_request *req)
-{
- if (!list_empty(&req->list))
- return;
-
- list_add(&req->list, &ctx->requests);
-}
-
-static void ubus_sync_req_cb(struct ubus_request *req, int ret)
-{
- req->status_msg = true;
- req->status_code = ret;
- uloop_end();
-}
-
-struct ubus_sync_req_cb {
- struct uloop_timeout timeout;
- struct ubus_request *req;
-};
-
-static void ubus_sync_req_timeout_cb(struct uloop_timeout *timeout)
-{
- struct ubus_sync_req_cb *cb;
-
- cb = container_of(timeout, struct ubus_sync_req_cb, timeout);
- ubus_sync_req_cb(cb->req, UBUS_STATUS_TIMEOUT);
-}
-
-int ubus_complete_request(struct ubus_context *ctx, struct ubus_request *req,
- int timeout)
-{
- struct ubus_sync_req_cb cb;
- ubus_complete_handler_t complete_cb = req->complete_cb;
- bool registered = ctx->sock.registered;
- int status = UBUS_STATUS_NO_DATA;
-
- if (!registered) {
- uloop_init();
- ubus_add_uloop(ctx);
- }
-
- if (timeout) {
- memset(&cb, 0, sizeof(cb));
- cb.req = req;
- cb.timeout.cb = ubus_sync_req_timeout_cb;
- uloop_timeout_set(&cb.timeout, timeout);
- }
-
- ubus_complete_request_async(ctx, req);
- req->complete_cb = ubus_sync_req_cb;
-
- ctx->stack_depth++;
- while (!req->status_msg) {
- bool cancelled = uloop_cancelled;
- uloop_cancelled = false;
- uloop_run();
- uloop_cancelled = cancelled;
- }
- ctx->stack_depth--;
-
- if (timeout)
- uloop_timeout_cancel(&cb.timeout);
-
- if (req->status_msg)
- status = req->status_code;
-
- req->complete_cb = complete_cb;
- if (req->complete_cb)
- req->complete_cb(req, status);
-
- if (!registered)
- uloop_fd_delete(&ctx->sock);
-
- if (!ctx->stack_depth)
- ubus_process_pending_invoke(ctx);
-
- return status;
-}
-