summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lib/ubus.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/lib/ubus.c b/lib/ubus.c
index 336bcfc..73b4e24 100644
--- a/lib/ubus.c
+++ b/lib/ubus.c
@@ -1104,16 +1104,21 @@ uc_ubus_request_finish_common(uc_ubus_request_t *callctx, int code)
}
static void
-uc_ubus_request_finish(uc_ubus_request_t *callctx, int code, uc_value_t *reply)
+uc_ubus_request_send_reply(uc_ubus_request_t *callctx, uc_value_t *reply)
{
- if (callctx->replied)
+ if (!reply)
return;
- if (reply) {
- blob_buf_init(&buf, 0);
- ucv_object_to_blob(reply, &buf);
- ubus_send_reply(callctx->ctx, &callctx->req, buf.head);
- }
+ blob_buf_init(&buf, 0);
+ ucv_object_to_blob(reply, &buf);
+ ubus_send_reply(callctx->ctx, &callctx->req, buf.head);
+}
+
+static void
+uc_ubus_request_finish(uc_ubus_request_t *callctx, int code)
+{
+ if (callctx->replied)
+ return;
uc_ubus_request_finish_common(callctx, code);
request_reg_clear(callctx->vm, callctx->registry_index);
@@ -1124,7 +1129,7 @@ uc_ubus_request_timeout(struct uloop_timeout *timeout)
{
uc_ubus_request_t *callctx = container_of(timeout, uc_ubus_request_t, timeout);
- uc_ubus_request_finish(callctx, UBUS_STATUS_TIMEOUT, NULL);
+ uc_ubus_request_finish(callctx, UBUS_STATUS_TIMEOUT);
}
static uc_value_t *
@@ -1133,6 +1138,7 @@ uc_ubus_request_reply(uc_vm_t *vm, size_t nargs)
uc_ubus_request_t **callctx = uc_fn_this("ubus.request");
int64_t code = UBUS_STATUS_OK;
uc_value_t *reply, *rcode;
+ bool more = false;
if (!callctx || !*callctx)
err_return(UBUS_STATUS_INVALID_ARGUMENT, "Invalid call context");
@@ -1147,11 +1153,17 @@ uc_ubus_request_reply(uc_vm_t *vm, size_t nargs)
if (rcode) {
code = ucv_int64_get(rcode);
- if (errno == ERANGE || code < 0 || code > __UBUS_STATUS_LAST)
+ if (errno == ERANGE || code < -1 || code > __UBUS_STATUS_LAST)
code = UBUS_STATUS_UNKNOWN_ERROR;
+
+ if (code < 0)
+ more = true;
}
- uc_ubus_request_finish(*callctx, code, reply);
+ uc_ubus_request_send_reply(*callctx, reply);
+
+ if (!more)
+ uc_ubus_request_finish(*callctx, code);
ok_return(ucv_boolean_new(true));
}
@@ -1219,7 +1231,7 @@ uc_ubus_request_error(uc_vm_t *vm, size_t nargs)
if (errno == ERANGE || code < 0 || code > __UBUS_STATUS_LAST)
code = UBUS_STATUS_UNKNOWN_ERROR;
- uc_ubus_request_finish(*callctx, code, NULL);
+ uc_ubus_request_finish(*callctx, code);
ok_return(ucv_boolean_new(true));
}
@@ -2394,13 +2406,13 @@ uc_ubus_channel_disconnect_cb(struct ubus_context *ctx)
blob_buf_free(&c->buf);
- if (c->registry_index >= 0)
- connection_reg_clear(c->vm, c->registry_index);
-
if (c->ctx.sock.fd >= 0) {
ubus_shutdown(&c->ctx);
c->ctx.sock.fd = -1;
}
+
+ if (c->registry_index >= 0)
+ connection_reg_clear(c->vm, c->registry_index);
}
static uc_value_t *
@@ -2593,7 +2605,7 @@ static void free_object(void *ud) {
static void free_request(void *ud) {
uc_ubus_request_t *callctx = ud;
- uc_ubus_request_finish(callctx, UBUS_STATUS_TIMEOUT, NULL);
+ uc_ubus_request_finish(callctx, UBUS_STATUS_TIMEOUT);
uloop_timeout_cancel(&callctx->timeout);
free(callctx);
}
@@ -2639,6 +2651,10 @@ void uc_module_init(uc_vm_t *vm, uc_value_t *scope)
ADD_CONST(STATUS_SYSTEM_ERROR);
#endif
+ /* virtual status code for reply */
+#define UBUS_STATUS_CONTINUE -1
+ ADD_CONST(STATUS_CONTINUE);
+
ADD_CONST(SYSTEM_OBJECT_ACL);
conn_type = uc_type_declare(vm, "ubus.connection", conn_fns, free_connection);