diff --git a/bbfdmd/ubus/bbfdmd.c b/bbfdmd/ubus/bbfdmd.c index e0da2f8e..03f94adc 100644 --- a/bbfdmd/ubus/bbfdmd.c +++ b/bbfdmd/ubus/bbfdmd.c @@ -568,7 +568,7 @@ int bbfdm_set_handler(struct ubus_context *ctx, struct ubus_object *obj, if (data.trans_id == 0) { // Transaction-id is not defined so create an internal transaction - trans_id = transaction_start(0); + trans_id = transaction_start("INT_SET", 0); if (trans_id == 0) { WARNING("Failed to get the lock for the transaction"); fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); @@ -685,7 +685,7 @@ int bbfdm_add_handler(struct ubus_context *ctx, struct ubus_object *obj, if (data.trans_id == 0) { // Transaction-id is not defined so create an internal transaction - trans_id = transaction_start(0); + trans_id = transaction_start("INT_ADD", 0); if (trans_id == 0) { ERR("Failed to get the lock for the transaction"); fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); @@ -805,7 +805,7 @@ int bbfdm_del_handler(struct ubus_context *ctx, struct ubus_object *obj, if (data.trans_id == 0) { // Transaction-id is not defined so create an internal transaction - trans_id = transaction_start(0); + trans_id = transaction_start("INT_DEL", 0); if (trans_id == 0) { WARNING("Failed to get the lock for the transaction"); fill_err_code_array(&data, USP_FAULT_INTERNAL_ERROR); @@ -875,21 +875,20 @@ static int bbfdm_transaction_handler(struct ubus_context *ctx, struct ubus_objec is_service_restart = blobmsg_get_bool(tb[TRANS_RESTART]); fill_optional_data(&data, tb[TRANS_OPTIONAL]); - if (!is_str_eq(trans_cmd, "start") && data.trans_id == 0) - return UBUS_STATUS_INVALID_ARGUMENT; - INFO("ubus method|%s|, name|%s|", method, obj->name); + INFO("ubus method|%s|, name|%s|, cmd [%s]", method, obj->name, trans_cmd); bbf_init(&data.bbf_ctx); blob_buf_init(&data.bb, 0); if (is_str_eq(trans_cmd, "start")) { - ret = transaction_start(max_timeout); + ret = transaction_start("API", max_timeout); if (ret) { blobmsg_add_u8(&data.bb, "status", true); blobmsg_add_u32(&data.bb, "transaction_id", ret); } else { blobmsg_add_u8(&data.bb, "status", false); + transaction_status(&data.bb); } } else if (is_str_eq(trans_cmd, "commit")) { ret = transaction_commit(data.trans_id, &data.bb, is_service_restart); @@ -898,7 +897,7 @@ static int bbfdm_transaction_handler(struct ubus_context *ctx, struct ubus_objec ret = transaction_abort(data.trans_id, &data.bb); blobmsg_add_u8(&data.bb, "status", (ret == 0)); } else if (is_str_eq(trans_cmd, "status")) { - transaction_status(&data.bb, data.trans_id); + transaction_status(&data.bb); } else { WARNING("method(%s) not supported", method); } diff --git a/bbfdmd/ubus/common.h b/bbfdmd/ubus/common.h index 1e898069..2a4efe51 100644 --- a/bbfdmd/ubus/common.h +++ b/bbfdmd/ubus/common.h @@ -76,6 +76,9 @@ int get_resolved_paths(struct dmctx *bbf_ctx, char *qpath, struct list_head *res // strncpy with always 0 terminated string static inline void strncpyt(char *dst, const char *src, size_t n) { + if (dst == NULL || src == NULL) + return; + if (n > 1) { strncpy(dst, src, n - 1); dst[n - 1] = 0; diff --git a/bbfdmd/ubus/get_helper.c b/bbfdmd/ubus/get_helper.c index 4c55c04f..a7c9843a 100644 --- a/bbfdmd/ubus/get_helper.c +++ b/bbfdmd/ubus/get_helper.c @@ -24,14 +24,11 @@ DMOBJ *DEAMON_DM_ROOT_OBJ = NULL; DM_MAP_VENDOR *DEAMON_DM_VENDOR_EXTENSION[2] = {0}; DM_MAP_VENDOR_EXCLUDE *DEAMON_DM_VENDOR_EXTENSION_EXCLUDE = NULL; -// uloop.h does not have versions, below line is to use -// deprecated uloop_timeout_remaining for the time being -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - static struct { int trans_id; struct uloop_timeout trans_timeout; int timeout_ms; + char app[32]; } g_current_trans = {.trans_id=0, .timeout_ms=10000}; static jmp_buf gs_jump_location; @@ -274,13 +271,13 @@ static int compare_path(const void *arg1, const void *arg2) } // Returns transaction id if successful, otherwise 0 -int transaction_start(uint32_t max_timeout) +int transaction_start(char *app, uint32_t max_timeout) { int ret = 0; uint32_t timeout; if (g_current_trans.trans_id) { - WARNING("Transaction already in-process"); + WARNING("%s Transaction locked by %s", app, g_current_trans.app); return 0; } @@ -289,23 +286,27 @@ int transaction_start(uint32_t max_timeout) } else { timeout = g_current_trans.timeout_ms; } + ret = get_random_id(); + strncpyt(g_current_trans.app, app, 32); + g_current_trans.trans_id = ret; g_current_trans.trans_timeout.cb = transaction_timeout_handler; uloop_timeout_set(&g_current_trans.trans_timeout, timeout); - INFO("Transaction started with id %d, timeout %zd", g_current_trans.trans_id, timeout); + INFO("Transaction created by [%s] id %d, timeout %zd", g_current_trans.app, g_current_trans.trans_id, timeout); return ret; } -int transaction_status(struct blob_buf *bb, int trans_id) +int transaction_status(struct blob_buf *bb) { - if (g_current_trans.trans_id == trans_id) { - int rem = uloop_timeout_remaining(&g_current_trans.trans_timeout); - blobmsg_add_string(bb, "status", "on-going"); - blobmsg_add_u32(bb, "remaining_time", rem / 1000); + if (g_current_trans.trans_id) { + int64_t rem = uloop_timeout_remaining64(&g_current_trans.trans_timeout); + blobmsg_add_string(bb, "app", g_current_trans.app); + blobmsg_add_string(bb, "tstatus", "running"); + blobmsg_add_u64(bb, "remaining_time", rem / 1000); } else { - blobmsg_add_string(bb, "status", "not-exists"); + blobmsg_add_string(bb, "tstatus", "Idle"); } return 0; @@ -329,9 +330,10 @@ int transaction_commit(int trans_id, struct blob_buf *bb, bool is_service_restar int ret = -1; if (is_transaction_valid(trans_id)) { - INFO("Commit on-going transaction"); + INFO("Commit on-going transaction by %s", g_current_trans.app); uloop_timeout_cancel(&g_current_trans.trans_timeout); g_current_trans.trans_id = 0; + g_current_trans.app[0] = '\0'; bbf_entry_restart_services(bb, is_service_restart); @@ -348,9 +350,10 @@ int transaction_abort(int trans_id, struct blob_buf *bb) int ret = -1; if (is_transaction_valid(trans_id)) { - INFO("Abort on-going transaction"); + INFO("Abort on-going transaction by %s", g_current_trans.app); uloop_timeout_cancel(&g_current_trans.trans_timeout); g_current_trans.trans_id = 0; + g_current_trans.app[0] = '\0'; bbf_entry_revert_changes(bb); diff --git a/bbfdmd/ubus/get_helper.h b/bbfdmd/ubus/get_helper.h index e502c2cb..d27bc2f1 100644 --- a/bbfdmd/ubus/get_helper.h +++ b/bbfdmd/ubus/get_helper.h @@ -41,10 +41,10 @@ void fill_err_code_array(bbfdm_data_t *data, int fault); void bb_add_string(struct blob_buf *bb, const char *name, const char *value); -int transaction_start(uint32_t max_timeout); +int transaction_start(char *app, uint32_t max_timeout); int transaction_commit(int trans_id, struct blob_buf *bb, bool is_service_restart); int transaction_abort(int trans_id, struct blob_buf *bb); -int transaction_status(struct blob_buf *bb, int trans_id); +int transaction_status(struct blob_buf *bb); bool is_transaction_running(void); bool is_transaction_valid(int trans_id); int configure_transaction_timeout(int timeout);