diff options
-rw-r--r-- | CMakeLists.txt | 10 | ||||
-rw-r--r-- | lib/ubus.c | 45 |
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) @@ -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); |