From 9da8b8aa4ad0ff12bc150892965cedf1a507064d Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 1 Jan 2025 15:19:48 +0100 Subject: ubus: add defer.await() method This can be used to synchronously complete a deferred ubus request, waiting for completion or timeout. Signed-off-by: Felix Fietkau --- lib/ubus.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'lib/ubus.c') diff --git a/lib/ubus.c b/lib/ubus.c index 78838f1..b49a134 100644 --- a/lib/ubus.c +++ b/lib/ubus.c @@ -1980,6 +1980,29 @@ uc_ubus_defer_completed(uc_vm_t *vm, size_t nargs) ok_return(ucv_boolean_new((*d)->complete)); } +static uc_value_t * +uc_ubus_defer_await(uc_vm_t *vm, size_t nargs) +{ + uc_ubus_deferred_t *d = uc_fn_thisval("ubus.deferred"); + int64_t remaining; + + if (!d) + err_return(UBUS_STATUS_INVALID_ARGUMENT, "Invalid deferred context"); + + if (d->complete) + ok_return(ucv_boolean_new(false)); + +#ifdef HAVE_ULOOP_TIMEOUT_REMAINING64 + remaining = uloop_timeout_remaining64(&d->timeout); +#else + remaining = uloop_timeout_remaining(&d->timeout); +#endif + + ubus_complete_request(d->ctx, &d->request, remaining); + + ok_return(ucv_boolean_new(true)); +} + static uc_value_t * uc_ubus_defer_abort(uc_vm_t *vm, size_t nargs) { @@ -2026,6 +2049,7 @@ static const uc_function_list_t conn_fns[] = { }; static const uc_function_list_t defer_fns[] = { + { "await", uc_ubus_defer_await }, { "completed", uc_ubus_defer_completed }, { "abort", uc_ubus_defer_abort }, }; -- cgit v1.2.3