summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt10
-rw-r--r--lib/ubus.c45
2 files changed, 46 insertions, 9 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index be8a394..45de57a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -123,6 +123,16 @@ IF(UBUS_SUPPORT)
SET_TARGET_PROPERTIES(ubus_lib PROPERTIES OUTPUT_NAME ubus PREFIX "")
TARGET_LINK_OPTIONS(ubus_lib PRIVATE ${UCODE_MODULE_LINK_OPTIONS})
TARGET_LINK_LIBRARIES(ubus_lib ${ubus} ${blobmsg_json})
+ FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c" "
+ #include <libubus.h>
+ int main() { return UBUS_STATUS_NO_MEMORY; }
+ ")
+ TRY_COMPILE(HAVE_NEW_UBUS_STATUS_CODES
+ ${CMAKE_BINARY_DIR}
+ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/test.c")
+ IF(HAVE_NEW_UBUS_STATUS_CODES)
+ ADD_DEFINITIONS(-DHAVE_NEW_UBUS_STATUS_CODES)
+ ENDIF()
ENDIF()
IF(UCI_SUPPORT)
diff --git a/lib/ubus.c b/lib/ubus.c
index e2491ec..1898e59 100644
--- a/lib/ubus.c
+++ b/lib/ubus.c
@@ -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
@@ -2053,6 +2061,25 @@ void uc_module_init(uc_vm_t *vm, uc_value_t *scope)
{
uc_function_list_register(scope, global_fns);
+#define ADD_CONST(x) ucv_object_add(scope, #x, ucv_int64_new(UBUS_##x))
+ ADD_CONST(STATUS_OK);
+ ADD_CONST(STATUS_INVALID_COMMAND);
+ ADD_CONST(STATUS_INVALID_ARGUMENT);
+ ADD_CONST(STATUS_METHOD_NOT_FOUND);
+ ADD_CONST(STATUS_NOT_FOUND);
+ ADD_CONST(STATUS_NO_DATA);
+ ADD_CONST(STATUS_PERMISSION_DENIED);
+ ADD_CONST(STATUS_TIMEOUT);
+ ADD_CONST(STATUS_NOT_SUPPORTED);
+ ADD_CONST(STATUS_UNKNOWN_ERROR);
+ ADD_CONST(STATUS_CONNECTION_FAILED);
+
+#ifdef HAVE_NEW_UBUS_STATUS_CODES
+ ADD_CONST(STATUS_NO_MEMORY);
+ ADD_CONST(STATUS_PARSE_ERROR);
+ ADD_CONST(STATUS_SYSTEM_ERROR);
+#endif
+
conn_type = uc_type_declare(vm, "ubus.connection", conn_fns, free_connection);
defer_type = uc_type_declare(vm, "ubus.deferred", defer_fns, free_deferred);
object_type = uc_type_declare(vm, "ubus.object", object_fns, free_object);