diff options
author | Jo-Philipp Wich <jo@mein.io> | 2022-09-09 14:06:23 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-09-09 14:23:07 +0200 |
commit | cc4eb798c1bb55ce82698e548dc4e981a7d8a1ce (patch) | |
tree | ca087c52152eb561b46abe8b99b09ec9d871faab | |
parent | 01c412c4607911f20086264ddf4ac269f3b8eb5f (diff) |
ubus: support obtaining numeric error code
Some ubus users require access to the original ubus error status returned
by various operations for fine grained error handling.
Extend the error() function with an optional boolean argument which causes
the function to return the numeric error code instead of a preformatted
message when invoked.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | lib/ubus.c | 26 |
1 files changed, 17 insertions, 9 deletions
@@ -176,29 +176,37 @@ typedef struct { static uc_value_t * uc_ubus_error(uc_vm_t *vm, size_t nargs) { + uc_value_t *numeric = uc_fn_arg(0), *rv; uc_stringbuf_t *buf; const char *s; if (last_error.code == 0) return NULL; - buf = ucv_stringbuf_new(); - - if (last_error.code == UBUS_STATUS_UNKNOWN_ERROR && last_error.msg) { - ucv_stringbuf_addstr(buf, last_error.msg, strlen(last_error.msg)); + if (ucv_is_truish(numeric)) { + rv = ucv_int64_new(last_error.code); } else { - s = ubus_strerror(last_error.code); + buf = ucv_stringbuf_new(); + + if (last_error.code == UBUS_STATUS_UNKNOWN_ERROR && last_error.msg) { + ucv_stringbuf_addstr(buf, last_error.msg, strlen(last_error.msg)); + } + else { + s = ubus_strerror(last_error.code); - ucv_stringbuf_addstr(buf, s, strlen(s)); + ucv_stringbuf_addstr(buf, s, strlen(s)); - if (last_error.msg) - ucv_stringbuf_printf(buf, ": %s", last_error.msg); + if (last_error.msg) + ucv_stringbuf_printf(buf, ": %s", last_error.msg); + } + + rv = ucv_stringbuf_finish(buf); } set_error(0, NULL); - return ucv_stringbuf_finish(buf); + return rv; } static void |